diff options
author | (no author) <(no author)@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-21 21:49:38 +0000 |
---|---|---|
committer | (no author) <(no author)@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-10-21 21:49:38 +0000 |
commit | d1f09cc8803aae37febfcf0462dc562debd01829 (patch) | |
tree | b0fd40a57cb8c8f081db703d3b7fc81aa9fd1b91 | |
parent | b88baab8dc533a28fc64d5addedc490222540398 (diff) |
This commit was manufactured by cvs2svn to create tagimmuse-rewrite-beta
'immuse-rewrite-beta'.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/tags/immuse-rewrite-beta@89407 138bc75d-0d04-0410-961f-82ee72b054a4
182 files changed, 7887 insertions, 4417 deletions
diff --git a/ChangeLog b/ChangeLog index 6aa769d8248..7bbbb85e421 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2004-10-07 J"orn Rennecke <joern.rennecke@st.com> + + * MAINTAINERS: Update my email address. + +2004-10-07 Kazu Hirata <kazu@cs.umass.edu> + + * MAINTAINERS (Language Front Ends Maintainers): New. Move + entries belonging to this category. + 2004-10-06 Josef Zlomek <josef.zlomek@email.cz> * 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 <pinskia@physics.uc.edu> + + PR c/16999 + * c-ppoutput.c (cb_ident): Don't quote string as it is already + quoted. + +2004-10-08 Diego Novillo <dnovillo@redhat.com> + + * tree-ssa-pre.c (init_pre): Use size of ARRAY_REF to allocate + reference_node_pool. + +2004-10-08 Kazu Hirata <kazu@cs.umass.edu> + + * tree-cfg.c: Fix a comment typo. + +2004-10-08 Andreas Krebbel <krebbel1@de.ibm.com> + + * 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 <uweigand@de.ibm.com> + + * 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 <ghazi@caip.rutgers.edu> + + * 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 <nathan@codesourcery.com> + + * 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 <ebotcazou@libertysurf.fr> + + PR target/17245 + * config/sparc/sparc.c (input_operand): Remove redundant code + for handling LO_SUM. + (legitimate_address_p) <REG+REG>: Do not recheck TARGET_V9. + <LO_SUM>: 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 <kazu@cs.umass.edu> + + * tree-cfg.c (tree_forwarder_block_p): Reorder checks so that + common cases will be caught earlier than others. + +2004-10-08 Michael Matz <matz@suse.de> + + * loop-doloop.c (doloop_optimize): Extend count. + +2004-10-08 Kaz Kojima <kkojima@gcc.gnu.org> + + * config/sh/sh.md (prefetch_media, prefetch_i4): New insns. + (prefetch): Convert to expander. + +2004-10-08 Kaz Kojima <kkojima@gcc.gnu.org> + + * 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 <jsm@polyomino.org.uk> + + * 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 <nickc@redhat.com> + + * 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 <inaoka.kazuhiro@renesas.com> + + * 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 <amodra@bigpond.net.au> + + * config/rs6000/sysv4.h (STARTFILE_LINUX_SPEC): Choose gcrt1.o + for -profile as well as -p and -pg. + +2004-10-07 Andrew Pinski <pinskia@physics.uc.edu> + + * libgcc2.c (__moddi3): Cast &w to UDWtype*. + +2004-10-07 Kazu Hirata <kazu@cs.umass.edu> + + * tree-cfg.c (tree_block_forwards_to): Remove. + * tree-flow.h: Remove the corresponding prototype. + +2004-10-07 Kazu Hirata <kazu@cs.umass.edu> + + * tree-flow-inline.h (phi_nodes): Remove an unnecessary check + for ENTRY_BLOCK_PTR and EXIT_BLOCK_PTR. + +2004-10-07 Geoffrey Keating <geoffk@apple.com> + + 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 <uweigand@de.ibm.com> + + * 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 <rsandifo@redhat.com> + + * config/mips/mips.c (mips_function_rodata_section): New function. + (TARGET_ASM_FUNCTION_RODATA_SECTION): Use it. + +2004-10-07 Devang Patel <dpatel@apple.com> + + * 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 <dvorakz@suse.cz> + + PR tree-optimization/17749 + * tree-tailcall.c (find_tail_calls): Check that parameter is + a gimple_reg. + +2004-10-07 Kazu Hirata <kazu@cs.umass.edu> + + * config/ia64/ia64.c: Fix a comment typo. + +2004-10-07 Eric Botcazou <ebotcazou@libertysurf.fr> + + * doc/install.texi (*-*-solaris2*): Fix marker for URL. + +2004-10-07 Giovanni Bajo <giovannibajo@gcc.gnu.org> + + PR c++/17115 + * tree-inline.c (expand_call_inline): Do not warn for functions + marked with attribute noinline. + +2004-10-07 Eric Botcazou <ebotcazou@libertysurf.fr> + + 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 <echristo@redhat.com> + + * config/sh/sh.c (sh_dwarf_calling_convention): Fix renesas dwarf + attribute. + +2004-10-07 Richard Sandiford <rsandifo@redhat.com> + + PR target/17770 + * config/mips/mips.md (mov_<load>l): Remove hazard=none attribute. + +2004-10-07 Zdenek Dvorak <dvorakz@suse.cz> + + 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 <dvorakz@suse.cz> + + 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 <ebotcazou@libertysurf.fr> + + 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 <rsandifo@redhat.com> + + 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 <rsandifo@redhat.com> + + PR bootstrap/17857 + * Makefile.in (stmp-fixproto): Pass FIX_HEADER=build/... to fixproto. + +2004-10-07 Kazu Hirata <kazu@cs.umass.edu> + + * hooks.c (hook_int_void_1, hook_void_int): Remove. + * hooks.h: Remove the corresponding prototypes. + +2004-10-06 Andrew Pinski <pinskia@physics.uc.edu> + + 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. + <case ADDR_EXPR>: 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. + <case ADDR_EXPR>: 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 <kazu@cs.umass.edu> + + * 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 <jsm@polyomino.org.uk> + + * 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 <pinskia@physics.uc.edu> + + 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 <echristo@redhat.com> + + * dwarf2.h: Sync with include/elf/dwarf2.h + +2004-10-06 Daniel Berlin <dberlin@dberlin.org> + + * tree-pretty-print.c (dump_generic_node): Fix printing of BINFO + and TREE_VEC nodes. + +2004-10-06 Daniel Berlin <dberlin@dberlin.org> + + * 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 <dberlin@dberlin.org> + + * lambda-code.c (compute_nest_using_fourier_motzkin): New + function. + (lambda_compute_auxillary_space): Split from here. + +2004-10-06 Daniel Berlin <dberlin@dberlin.org> + + * 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 <kazu@cs.umass.edu> + + * tree-cfg.c (thread_jumps): Remove a duplicate check for + EXIT_BLOCK_PTR. + +2004-10-06 Ulrich Weigand <uweigand@de.ibm.com> + + * 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 <sje@cup.hp.com> + + * 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 <ghazi@caip.rutgers.edu> * 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 %<float%> rather than " - "%<double%> due to prototype", - (char *) 0, name, parmnum + 1); + warning ("passing argument %d of %qE as %<float%> " + "rather than %<double%> 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 %<void *%>", - errtype, funname, parmnum); + WARN_FOR_ASSIGNMENT (N_("ISO C forbids passing argument %d of " + "%qE between function pointer " + "and %<void *%>"), + N_("ISO C forbids assignment between " + "function pointer and %<void *%>"), + N_("ISO C forbids initialization between " + "function pointer and %<void *%>"), + N_("ISO C forbids return between function " + "pointer and %<void *%>")); /* Const and volatile mean something different for function types, so the usual warnings are not appropriate. */ 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" "<load>l\t%0,%2" [(set_attr "type" "load") - (set_attr "mode" "<MODE>") - (set_attr "hazard" "none")]) + (set_attr "mode" "<MODE>")]) (define_insn "mov_<load>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=<xxx> */ const char *s390_arch_string; /* for -march=<xxx> */ -/* 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 <kazu@cs.umass.edu> + + * pt.c, search.c: Fix comment typos. + +2004-10-08 Nathan Sidwell <nathan@codesourcery.com> + + * 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 <pinskia@physics.uc.edu> + + * pt.c (tsubst_expr) <case ASM_EXPR>: Look passed the + CLEANUP_POINT_EXPR to get the asm expression. + +2004-10-07 Mark Mitchell <mark@codesourcery.com> + + * 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 <pinskia@physics.uc.edu> + + * parser.c (cp_parser_asm_definition): Look passed the + CLEANUP_POINT_EXPR to get the asm expression. + +2004-10-06 Andrew Pinski <pinskia@physics.uc.edu> + + PR c++/17368 + * semantics.c (finish_asm_stmt): Asm expressions need cleanup + also. + 2004-10-05 Gabriel Dos Reis <gdr@integrable-solutions.net> 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<T>::g' and `B<int>::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 T> 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 T> class C { template <class U> void f(U); } - - then neither C<int>::f<char> nor C<T>::f<double> is considered - to be a member template. But, `template <class U> void - C<int>::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 <typename T> + struct S { friend A::f(); }; + + Here, the friend function is a template, but the context does + not have template information. The optimized lookup relies + on having ARGS be the template arguments for both the class + 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 <class T> 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 <class T> 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,40 +1905,9 @@ 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 <tobias.schlueter@physik.uni-muenchen.de> + + PR fortran/17676 + * resolve.c (resolve_operator): Use correct operator name in message. + +2004-10-07 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de> + + * primary.c (match_boz_constant): Allow kind parameter suffixes. + Move standard warning further to the front. + +2004-10-07 Kazu Hirata <kazu@cs.umass.edu> + + * trans-stmt.c: Fix a comment typo. + +2004-10-07 Paul Brook <paul@codesourcery.com> + + PR fortran/17678 + * trans-array.c (gfc_trans_deferred_array): Leave use associated + variables alone. + +2004-10-06 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de> + + 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 <paul@codesourcery.com> + + * 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 <tobias.schlueter@physik.uni-muenchen.de> 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) @@ -152,11 +145,6 @@ hook_uint_uint_constcharptrptr_0 (unsigned int a ATTRIBUTE_UNUSED, } 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..3ba5c22c17f 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: @@ -1881,7 +1904,7 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest, COND_EXPR_COND (exitcond) = build (testtype, boolean_type_node, ivvarinced, newupperbound); - modify_stmt (exitcond); + update_stmt (exitcond); VEC_replace (tree, new_ivs, i, ivvar); i++; @@ -1893,20 +1916,23 @@ lambda_loopnest_to_gcc_loopnest (struct loop *old_loopnest, temp = old_loopnest; for (i = 0; i < VEC_length (tree, old_ivs); i++) { - int j; + imm_use_iterator imm_iter; + use_operand_p imm_use; + tree oldiv_def; tree oldiv = VEC_index (tree, old_ivs, i); - dataflow_t imm = get_immediate_uses (SSA_NAME_DEF_STMT (oldiv)); - for (j = 0; j < num_immediate_uses (imm); j++) + tree oldiv_stmt = SSA_NAME_DEF_STMT (oldiv); + + gcc_assert (NUM_DEFS (STMT_DEF_OPS (oldiv_stmt)) == 1); + oldiv_def = DEF_OP (STMT_DEF_OPS (oldiv_stmt), 0); + + FOR_EACH_IMM_USE_SAFE (imm_use, imm_iter, oldiv_def) { - 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++) + tree stmt = USE_STMT (imm_use); + 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,8 +1947,8 @@ 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); - modify_stmt (stmt); + propagate_value (use_p, newiv); + update_stmt (stmt); } } @@ -2009,16 +2035,15 @@ stmt_is_bumper_for_loop (struct loop *loop, tree stmt) tree use; tree def; def_optype defs = STMT_DEF_OPS (stmt); - dataflow_t imm; - int i; + imm_use_iterator iter; + use_operand_p use_p; if (NUM_DEFS (defs) != 1) return false; def = DEF_OP (defs, 0); - imm = get_immediate_uses (stmt); - for (i = 0; i < num_immediate_uses (imm); i++) + FOR_EACH_IMM_USE_FAST (use_p, iter, def) { - use = immediate_use (imm, i); + use = USE_FROM_PTR (use_p); if (TREE_CODE (use) == PHI_NODE) { if (phi_loop_edge_uses_def (loop, use, def)) 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 <jsm@polyomino.org.uk> + + * gcc.pot: Regenerate. + +2004-10-07 Joseph S. Myers <jsm@polyomino.org.uk> + + * de.po: Update. + 2004-10-05 Zack Weinberg <zack@codesourcery.com> * 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 <stigge@antcom.de>\n" "Language-Team: German <de@li.org>\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 <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\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 "%<va_start%> used in function with fixed args" msgstr "" -#: builtins.c:3837 builtins.c:8731 +#: builtins.c:3822 builtins.c:8716 msgid "second parameter of %<va_start%> not last named argument" msgstr "" #. Evidently an out of date version of <stdarg.h>; can't validate #. va_start's second argument, but can still work as intended. -#: builtins.c: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 %<va_start%>" msgstr "" -#: builtins.c:4075 +#: builtins.c:4060 msgid "first argument to %<va_arg%> not of type %<va_list%>" 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 %<va_arg%>)" 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 %<volatile%>" 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 %<void *%> 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 %<char%>" 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 %<register%> 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 %<char%>" 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 %<float%> rather than %<double%> due to prototype" +#: c-typeck.c:2141 +msgid "" +"passing argument %d of %qE as %<float%> rather than %<double%> 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 %<void *%> 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 %<void *%> 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 %<void *%>" +#: c-typeck.c:3694 +msgid "" +"ISO C forbids passing argument %d of %qE between function pointer and %<void " +"*%>" +msgstr "" + +#: c-typeck.c:3697 +msgid "ISO C forbids assignment between function pointer and %<void *%>" +msgstr "" + +#: c-typeck.c:3699 +msgid "ISO C forbids initialization between function pointer and %<void *%>" msgstr "" -#: c-typeck.c:3623 +#: c-typeck.c:3701 +msgid "ISO C forbids return between function pointer and %<void *%>" +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 %<goto *expr;%>" msgstr "" -#: c-typeck.c:6351 +#: c-typeck.c:6437 msgid "function declared %<noreturn%> has a %<return%> statement" msgstr "" -#: c-typeck.c:6358 +#: c-typeck.c:6444 msgid "%<return%> with no value, in function returning non-void" msgstr "" -#: c-typeck.c:6365 +#: c-typeck.c:6451 msgid "%<return%> 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 "%<long%> switch expression not converted to %<int%> 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 "%<default%> label not within a switch statement" msgstr "" -#: c-typeck.c:6596 +#: c-typeck.c:6682 msgid "%Hsuggest explicit braces to avoid ambiguous %<else%>" 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 %<void *%> 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 "" @@ -4488,6 +4563,10 @@ 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 #: config/pdp11/pdp11.c:1690 msgid "floating constant misused" @@ -4536,19 +4615,19 @@ msgstr "" msgid "impossible constraint in %<asm%>" msgstr "" -#: function.c:3457 +#: function.c:3461 msgid "%Jvariable %qD might be clobbered by %<longjmp%> or %<vfork%>" msgstr "" -#: function.c:3478 +#: function.c:3482 msgid "%Jargument %qD might be clobbered by %<longjmp%> or %<vfork%>" 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 "%<then%> label does not match edge at end of bb %d\n" msgstr "" -#: tree-cfg.c:3564 +#: tree-cfg.c:3501 msgid "%<else%> 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 %<noreturn%>" msgstr "" -#: tree-cfg.c:5282 tree-cfg.c:5286 +#: tree-cfg.c:5214 tree-cfg.c:5218 msgid "%H%<noreturn%> 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,13 +7773,13 @@ 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 "" @@ -7703,6 +7788,14 @@ msgstr "" #. 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 } +#. where VALUE is the bits to set or minus the bits to clear. +#. An empty string NAME is used to identify the default VALUE. #: config/alpha/alpha.h:293 config/i386/i386.h:333 config/i386/i386.h:335 #: config/i386/i386.h:337 config/ns32k/ns32k.h:140 config/s390/s390.h:135 #: config/sparc/sparc.h:616 config/sparc/sparc.h:621 @@ -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 %<operator=(const %T&)%>" msgstr "" -#: cp/class.c:3064 +#: cp/class.c:3016 msgid " but does not override %<operator=(const %T&)%>" 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 %<int%> as its argument" msgstr "" -#: cp/decl.c:8853 +#: cp/decl.c:8854 msgid "postfix %qD must take %<int%> 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 %<void%>" 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 "%<operator=%> 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 %<virtual%> 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 "%<operator new%> must return type %qT" msgstr "" -#: cp/decl2.c:1253 +#: cp/decl2.c:1249 msgid "%<operator new%> takes type %<size_t%> (%qT) as first parameter" msgstr "" -#: cp/decl2.c:1282 +#: cp/decl2.c:1278 msgid "%<operator delete%> must return type %qT" msgstr "" -#: cp/decl2.c:1291 +#: cp/decl2.c:1287 msgid "%<operator delete%> 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 %<const%> 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 %<jclass%> 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 %<void%> for new" msgstr "" -#: cp/init.c:1837 +#: cp/init.c:1835 msgid "uninitialized const in %<new%> 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 %<template <>%>" msgstr "" -#: cp/parser.c:12949 +#: cp/parser.c:12955 msgid "%Hextra %<;%>" msgstr "" -#: cp/parser.c:12967 +#: cp/parser.c:12973 msgid "a class-key must be used when declaring a friend" msgstr "" -#: cp/parser.c:12981 +#: cp/parser.c:12987 msgid "friend declaration does not name a class or function" msgstr "" -#: cp/parser.c:13154 +#: cp/parser.c:13160 msgid "pure-specifier on function-definition" msgstr "" -#: cp/parser.c:13427 +#: cp/parser.c:13433 msgid "keyword %<typename%> not allowed outside of templates" msgstr "" -#: cp/parser.c:13429 +#: cp/parser.c:13435 msgid "" "keyword %<typename%> not allowed in this context (the base class is " "implicitly a type)" msgstr "" -#: cp/parser.c:13702 +#: cp/parser.c:13708 msgid "invalid catch parameter" msgstr "" -#: cp/parser.c:14264 +#: cp/parser.c:14270 msgid "reference to %qD is ambiguous" msgstr "" -#: cp/parser.c:14433 +#: cp/parser.c:14439 msgid "too few template-parameter-lists" msgstr "" @@ -15733,143 +15806,143 @@ msgstr "" #. something like: #. #. template <class T> template <class U> void S::f(); -#: cp/parser.c:14448 +#: cp/parser.c:14454 msgid "too many template-parameter-lists" msgstr "" #. Skip the entire function. -#: cp/parser.c:14672 +#: cp/parser.c:14678 msgid "invalid function declaration" msgstr "" #. Issue an error message. -#: cp/parser.c:14709 +#: cp/parser.c:14715 msgid "named return values are no longer supported" msgstr "" -#: cp/parser.c:15054 +#: cp/parser.c:15060 msgid "%H%<>>%> should be %<> >%> within a nested template argument list" msgstr "" -#: cp/parser.c:15069 +#: cp/parser.c:15075 msgid "spurious %<>>%>, use %<>%> to terminate a template argument list" msgstr "" -#: cp/parser.c:15074 +#: cp/parser.c:15080 msgid "missing %<>%> to terminate the template argument list" msgstr "" -#: cp/parser.c:15593 +#: cp/parser.c:15599 msgid "%qs tag used in naming %q#T" msgstr "" -#: cp/parser.c:15614 +#: cp/parser.c:15620 msgid "%qD redeclared with different access" msgstr "" -#: cp/parser.c:15631 +#: cp/parser.c:15637 msgid "%<template%> (as a disambiguator) is only allowed within templates" msgstr "" -#: cp/parser.c:15839 +#: cp/parser.c:15845 msgid "inter-module optimizations not implemented for C++" msgstr "" -#: cp/pt.c:240 +#: cp/pt.c:237 msgid "data member %qD cannot be a member template" msgstr "" -#: cp/pt.c:252 +#: cp/pt.c:249 msgid "invalid member template declaration %qD" msgstr "" -#: cp/pt.c:635 +#: cp/pt.c:571 msgid "explicit specialization in non-namespace scope %qD" msgstr "" -#: cp/pt.c:646 +#: cp/pt.c:582 msgid "enclosing class templates are not explicitly specialized" msgstr "" -#: cp/pt.c:730 +#: cp/pt.c:666 msgid "specialization of %qD in different namespace" msgstr "" -#: cp/pt.c:731 cp/pt.c:800 +#: cp/pt.c:667 cp/pt.c:736 msgid " from definition of %q#D" msgstr "" -#: cp/pt.c:767 +#: cp/pt.c:703 msgid "specialization of %qT after instantiation" msgstr "" -#: cp/pt.c:799 +#: cp/pt.c:735 msgid "specializing %q#T in different namespace" msgstr "" -#: cp/pt.c:814 +#: cp/pt.c:750 msgid "specialization %qT after instantiation %qT" msgstr "" -#: cp/pt.c:826 +#: cp/pt.c:762 msgid "explicit specialization of non-template %qT" msgstr "" -#: cp/pt.c:1083 +#: cp/pt.c:1106 msgid "specialization of %qD after instantiation" msgstr "" -#: cp/pt.c:1212 +#: cp/pt.c:1235 msgid "%s %+#D" msgstr "" -#: cp/pt.c:1268 +#: cp/pt.c:1291 msgid "%qD is not a function template" msgstr "" -#: cp/pt.c:1453 +#: cp/pt.c:1476 msgid "template-id %qD for %q+D does not match any template declaration" msgstr "" -#: cp/pt.c:1462 +#: cp/pt.c:1485 msgid "ambiguous template specialization %qD for %q+D" msgstr "" #. This case handles bogus declarations like template <> #. template <class T> void f<int>(); -#: cp/pt.c:1685 cp/pt.c:1739 +#: cp/pt.c:1708 cp/pt.c:1762 msgid "template-id %qD in declaration of primary template" msgstr "" -#: cp/pt.c:1698 +#: cp/pt.c:1721 msgid "template parameter list used in explicit instantiation" msgstr "" -#: cp/pt.c:1704 +#: cp/pt.c:1727 msgid "definition provided for explicit instantiation" msgstr "" -#: cp/pt.c:1712 +#: cp/pt.c:1735 msgid "too many template parameter lists in declaration of %qD" msgstr "" -#: cp/pt.c:1715 +#: cp/pt.c:1738 msgid "too few template parameter lists in declaration of %qD" msgstr "" -#: cp/pt.c:1717 +#: cp/pt.c:1740 msgid "explicit specialization of %qD must be introduced by `template <>'" msgstr "" -#: cp/pt.c:1736 +#: cp/pt.c:1759 msgid "function template partial specialization %qD is not allowed" msgstr "" -#: cp/pt.c:1768 +#: cp/pt.c:1791 msgid "default argument specified in explicit specialization" msgstr "" -#: cp/pt.c:1772 +#: cp/pt.c:1795 msgid "template specialization with C linkage" msgstr "" @@ -15881,60 +15954,60 @@ msgstr "" #. program is ill-formed. #. #. Similar language is found in [temp.explicit]. -#: cp/pt.c:1856 +#: cp/pt.c:1879 msgid "specialization of implicitly-declared special member function" msgstr "" -#: cp/pt.c:1900 +#: cp/pt.c:1923 msgid "no member function %qD declared in %qT" msgstr "" #. There are two many template parameter lists. -#: cp/pt.c:2050 +#: cp/pt.c:2073 msgid "too many template parameter lists in declaration of %qT" msgstr "" -#: cp/pt.c:2144 +#: cp/pt.c:2167 msgid " shadows template parm %q#D" msgstr "" -#: cp/pt.c:2544 +#: cp/pt.c:2569 msgid "template parameters not used in partial specialization:" msgstr "" -#: cp/pt.c:2548 +#: cp/pt.c:2573 msgid " %qD" msgstr "" -#: cp/pt.c:2559 +#: cp/pt.c:2584 msgid "partial specialization %qT does not specialize any template arguments" msgstr "" -#: cp/pt.c:2584 +#: cp/pt.c:2609 #, c-format msgid "template argument %qE involves template parameter(s)" msgstr "" -#: cp/pt.c:2628 +#: cp/pt.c:2653 msgid "type %qT of template argument %qE depends on template parameter(s)" msgstr "" -#: cp/pt.c:2714 +#: cp/pt.c:2740 msgid "no default argument for %qD" msgstr "" -#: cp/pt.c:2866 +#: cp/pt.c:2897 msgid "template with C linkage" msgstr "" -#: cp/pt.c:2869 +#: cp/pt.c:2900 msgid "template class without a name" msgstr "" #. [temp.mem] #. #. A destructor shall not be a member template. -#: cp/pt.c:2877 +#: cp/pt.c:2908 msgid "destructor %qD declared as member template" msgstr "" @@ -15943,53 +16016,53 @@ msgstr "" #. An allocation function can be a function #. template. ... Template allocation functions shall #. have two or more parameters. -#: cp/pt.c:2892 +#: cp/pt.c:2923 msgid "invalid template declaration of %qD" msgstr "" -#: cp/pt.c:2972 +#: cp/pt.c:3004 msgid "%qD does not declare a template type" msgstr "" -#: cp/pt.c:2978 +#: cp/pt.c:3010 msgid "template definition of non-template %q#D" msgstr "" -#: cp/pt.c:3019 +#: cp/pt.c:3052 msgid "expected %d levels of template parms for %q#D, got %d" msgstr "" -#: cp/pt.c:3031 +#: cp/pt.c:3064 msgid "got %d template parameters for %q#D" msgstr "" -#: cp/pt.c:3034 +#: cp/pt.c:3067 msgid "got %d template parameters for %q#T" msgstr "" -#: cp/pt.c:3036 +#: cp/pt.c:3069 #, c-format msgid " but %d required" msgstr "" -#: cp/pt.c:3121 +#: cp/pt.c:3154 msgid "%qT is not a template type" msgstr "" -#: cp/pt.c:3137 +#: cp/pt.c:3170 msgid "previous declaration %qD" msgstr "" -#: cp/pt.c:3138 +#: cp/pt.c:3171 #, c-format msgid "used %d template parameter%s instead of %d" msgstr "" -#: cp/pt.c:3158 +#: cp/pt.c:3191 msgid "template parameter %q#D" msgstr "" -#: cp/pt.c:3159 +#: cp/pt.c:3192 msgid "redeclared here as %q#D" msgstr "" @@ -15997,293 +16070,293 @@ msgstr "" #. #. A template-parameter may not be given default arguments #. by two different declarations in the same scope. -#: cp/pt.c:3169 +#: cp/pt.c:3202 msgid "redefinition of default argument for %q#D" msgstr "" -#: cp/pt.c:3170 +#: cp/pt.c:3203 msgid "%J original definition appeared here" msgstr "" -#: cp/pt.c:3316 +#: cp/pt.c:3349 #, c-format msgid "%qE is not a valid template argument" msgstr "" -#: cp/pt.c:3320 +#: cp/pt.c:3353 msgid "it must be the address of a function with external linkage" msgstr "" -#: cp/pt.c:3322 +#: cp/pt.c:3355 msgid "it must be the address of an object with external linkage" msgstr "" -#: cp/pt.c:3325 +#: cp/pt.c:3358 msgid "it must be a pointer-to-member of the form %<&X::Y%>" msgstr "" -#: cp/pt.c:3336 +#: cp/pt.c:3369 #, c-format msgid "" "string literal %qE is not a valid template argument because it is the " "address of an object with static linkage" msgstr "" -#: cp/pt.c:3352 +#: cp/pt.c:3385 #, c-format msgid "address of non-extern %qE cannot be used as template argument" msgstr "" -#: cp/pt.c:3362 +#: cp/pt.c:3395 #, c-format msgid "non-constant %qE cannot be used as template argument" msgstr "" -#: cp/pt.c:3369 +#: cp/pt.c:3402 msgid "type %qT cannot be used as a value for a non-type template-parameter" msgstr "" -#: cp/pt.c:3372 +#: cp/pt.c:3405 msgid "invalid use of %qD as a non-type template-argument" msgstr "" -#: cp/pt.c:3374 +#: cp/pt.c:3407 #, c-format msgid "invalid use of %qE as a non-type template-argument" msgstr "" -#: cp/pt.c:3752 +#: cp/pt.c:3785 msgid "to refer to a type member of a template parameter, use %<typename %E%>" msgstr "" -#: cp/pt.c:3766 cp/pt.c:3785 cp/pt.c:3825 +#: cp/pt.c:3799 cp/pt.c:3818 cp/pt.c:3858 msgid "type/value mismatch at argument %d in template parameter list for %qD" msgstr "" -#: cp/pt.c:3770 +#: cp/pt.c:3803 msgid " expected a constant of type %qT, got %qT" msgstr "" -#: cp/pt.c:3774 +#: cp/pt.c:3807 #, c-format msgid " expected a class template, got %qE" msgstr "" -#: cp/pt.c:3776 +#: cp/pt.c:3809 #, c-format msgid " expected a type, got %qE" msgstr "" -#: cp/pt.c:3789 +#: cp/pt.c:3822 msgid " expected a type, got %qT" msgstr "" -#: cp/pt.c:3791 +#: cp/pt.c:3824 msgid " expected a class template, got %qT" msgstr "" -#: cp/pt.c:3828 +#: cp/pt.c:3861 msgid " expected a template of type %qD, got %qD" msgstr "" -#: cp/pt.c:3864 +#: cp/pt.c:3897 msgid "could not convert template argument %qE to %qT" msgstr "" -#: cp/pt.c:3903 +#: cp/pt.c:3936 #, c-format msgid "wrong number of template arguments (%d, should be %d)" msgstr "" -#: cp/pt.c:3907 +#: cp/pt.c:3940 msgid "provided for %qD" msgstr "" -#: cp/pt.c:3935 +#: cp/pt.c:3968 #, c-format msgid "template argument %d is invalid" msgstr "" -#: cp/pt.c:4156 +#: cp/pt.c:4189 msgid "non-template used as template" msgstr "" -#: cp/pt.c:4291 +#: cp/pt.c:4324 msgid "non-template type %qT used as a template" msgstr "" -#: cp/pt.c:4293 +#: cp/pt.c:4326 msgid "for template declaration %qD" msgstr "" -#: cp/pt.c:4942 +#: cp/pt.c:4963 msgid "" "template instantiation depth exceeds maximum of %d (use -ftemplate-depth-NN " "to increase the maximum) instantiating %qD" msgstr "" -#: cp/pt.c:5381 +#: cp/pt.c:5402 msgid "ambiguous class template instantiation for %q#T" msgstr "" -#: cp/pt.c:5387 +#: cp/pt.c:5408 msgid "%s %+#T" msgstr "" -#: cp/pt.c:6408 cp/pt.c:6528 +#: cp/pt.c:6431 cp/pt.c:6552 msgid "instantiation of %qD as type %qT" msgstr "" -#: cp/pt.c:6570 +#: cp/pt.c:6594 msgid "invalid parameter type %qT" msgstr "" -#: cp/pt.c:6572 +#: cp/pt.c:6596 msgid "in declaration %qD" msgstr "" -#: cp/pt.c:6646 +#: cp/pt.c:6670 msgid "creating pointer to member function of non-class type %qT" msgstr "" -#: cp/pt.c:6783 +#: cp/pt.c:6840 msgid "creating array with size zero" msgstr "" -#: cp/pt.c:6797 +#: cp/pt.c:6854 #, c-format msgid "creating array with size zero (%qE)" msgstr "" -#: cp/pt.c:7014 +#: cp/pt.c:7071 msgid "forming reference to void" msgstr "" -#: cp/pt.c:7016 +#: cp/pt.c:7073 msgid "forming %s to reference type %qT" msgstr "" -#: cp/pt.c:7053 +#: cp/pt.c:7110 msgid "creating pointer to member of non-class type %qT" msgstr "" -#: cp/pt.c:7059 +#: cp/pt.c:7116 msgid "creating pointer to member reference type %qT" msgstr "" -#: cp/pt.c:7145 +#: cp/pt.c:7186 msgid "creating array of %qT" msgstr "" -#: cp/pt.c:7151 +#: cp/pt.c:7192 msgid "creating array of %qT, which is an abstract class type" msgstr "" -#: cp/pt.c:7195 +#: cp/pt.c:7236 msgid "%qT is not a class, struct, or union type" msgstr "" -#: cp/pt.c:7281 +#: cp/pt.c:7322 #, c-format msgid "use of `%s' in template" msgstr "" -#: cp/pt.c:7406 +#: cp/pt.c:7447 #, c-format msgid "" "dependent-name %qE is parsed as a non-type, but instantiation yields a type" msgstr "" -#: cp/pt.c:7408 +#: cp/pt.c:7449 msgid "say %<typename %E%> if a type is meant" msgstr "" -#: cp/pt.c:8545 +#: cp/pt.c:8591 msgid "%qT is not a class or namespace" msgstr "" -#: cp/pt.c:8548 +#: cp/pt.c:8594 msgid "%qD is not a class or namespace" msgstr "" -#: cp/pt.c:8673 +#: cp/pt.c:8719 msgid "%qT uses anonymous type" msgstr "" -#: cp/pt.c:8675 +#: cp/pt.c:8721 msgid "%qT uses local type %qT" msgstr "" -#: cp/pt.c:8683 +#: cp/pt.c:8729 msgid "%qT is a variably modified type" msgstr "" -#: cp/pt.c:8694 +#: cp/pt.c:8740 #, c-format msgid "integral expression %qE is not constant" msgstr "" -#: cp/pt.c:8699 +#: cp/pt.c:8745 msgid " trying to instantiate %qD" msgstr "" -#: cp/pt.c:9213 +#: cp/pt.c:9261 msgid "incomplete type unification" msgstr "" -#: cp/pt.c:10531 cp/pt.c:10602 +#: cp/pt.c:10579 cp/pt.c:10650 msgid "explicit instantiation of non-template %q#D" msgstr "" -#: cp/pt.c:10547 cp/pt.c:10597 +#: cp/pt.c:10595 cp/pt.c:10645 msgid "no matching template for %qD found" msgstr "" -#: cp/pt.c:10553 +#: cp/pt.c:10601 msgid "explicit instantiation of %q#D" msgstr "" -#: cp/pt.c:10589 +#: cp/pt.c:10637 msgid "duplicate explicit instantiation of %q#D" msgstr "" -#: cp/pt.c:10611 +#: cp/pt.c:10659 msgid "ISO C++ forbids the use of %<extern%> on explicit instantiations" msgstr "" -#: cp/pt.c:10616 cp/pt.c:10706 +#: cp/pt.c:10664 cp/pt.c:10754 msgid "storage class %qD applied to template instantiation" msgstr "" -#: cp/pt.c:10678 +#: cp/pt.c:10726 msgid "explicit instantiation of non-template type %qT" msgstr "" -#: cp/pt.c:10687 +#: cp/pt.c:10735 msgid "explicit instantiation of %q#T before definition of template" msgstr "" -#: cp/pt.c:10695 +#: cp/pt.c:10743 #, c-format msgid "ISO C++ forbids the use of `%E' on explicit instantiations" msgstr "" -#: cp/pt.c:10740 +#: cp/pt.c:10788 msgid "duplicate explicit instantiation of %q#T" msgstr "" -#: cp/pt.c:11103 +#: cp/pt.c:11153 msgid "explicit instantiation of %qD but no definition available" msgstr "" -#: cp/pt.c:11247 +#: cp/pt.c:11297 msgid "" "template instantiation depth exceeds maximum of %d (use -ftemplate-depth-NN " "to increase the maximum) instantiating %q+D, possibly from virtual table " "generation" msgstr "" -#: cp/pt.c:11526 +#: cp/pt.c:11576 msgid "%q#T is not a valid type for a template constant parameter" msgstr "" @@ -16322,43 +16395,43 @@ msgstr "" msgid "cannot dynamic_cast `%E' (of type `%#T') to type `%#T' (%s)" msgstr "" -#: cp/search.c:246 +#: cp/search.c:237 msgid "`%T' is an ambiguous base of `%T'" msgstr "" -#: cp/search.c:264 +#: cp/search.c:255 msgid "`%T' is an inaccessible base of `%T'" msgstr "" -#: cp/search.c:1645 +#: cp/search.c:1743 msgid "invalid covariant return type for `%#D'" msgstr "" -#: cp/search.c:1646 cp/search.c:1652 +#: cp/search.c:1744 cp/search.c:1750 msgid " overriding `%#D'" msgstr "" -#: cp/search.c:1650 +#: cp/search.c:1748 msgid "conflicting return type specified for `%#D'" msgstr "" -#: cp/search.c:1661 +#: cp/search.c:1759 #, c-format msgid "looser throw specifier for `%#F'" msgstr "" -#: cp/search.c:1662 +#: cp/search.c:1760 #, c-format msgid " overriding `%#F'" msgstr "" #. A static member function cannot match an inherited #. virtual member function. -#: cp/search.c:1755 +#: cp/search.c:1853 msgid "`%#D' cannot be declared" msgstr "" -#: cp/search.c:1756 +#: cp/search.c:1854 msgid " since `%#D' declared in base class" msgstr "" @@ -16367,145 +16440,145 @@ msgstr "" msgid "type of asm operand `%E' could not be determined" msgstr "" -#: cp/semantics.c:1265 +#: cp/semantics.c:1266 msgid "invalid use of member `%D' in static member function" msgstr "" -#: cp/semantics.c:1268 +#: cp/semantics.c:1269 msgid "invalid use of non-static data member `%D'" msgstr "" -#: cp/semantics.c:1269 cp/semantics.c:1308 +#: cp/semantics.c:1270 cp/semantics.c:1309 msgid "from this location" msgstr "" -#: cp/semantics.c:1307 +#: cp/semantics.c:1308 msgid "object missing in reference to `%D'" msgstr "" -#: cp/semantics.c:1786 +#: cp/semantics.c:1787 msgid "arguments to destructor are not allowed" msgstr "" -#: cp/semantics.c:1836 +#: cp/semantics.c:1837 msgid "`this' is unavailable for static member functions" msgstr "" -#: cp/semantics.c:1842 +#: cp/semantics.c:1843 msgid "invalid use of `this' in non-member function" msgstr "" -#: cp/semantics.c:1844 +#: cp/semantics.c:1845 msgid "invalid use of `this' at top level" msgstr "" -#: cp/semantics.c:1868 +#: cp/semantics.c:1869 msgid "invalid qualifying scope in pseudo-destructor name" msgstr "" -#: cp/semantics.c:1888 +#: cp/semantics.c:1889 msgid "`%E' is not of type `%T'" msgstr "" -#: cp/semantics.c:1982 +#: cp/semantics.c:1983 msgid "template type parameters must use the keyword `class' or `typename'" msgstr "" -#: cp/semantics.c:2026 +#: cp/semantics.c:2027 msgid "" "invalid use of type `%T' as a default value for a template template-parameter" msgstr "" -#: cp/semantics.c:2029 +#: cp/semantics.c:2030 msgid "" "invalid use of `%D' as a default value for a template template-parameter" msgstr "" -#: cp/semantics.c:2033 +#: cp/semantics.c:2034 msgid "invalid default argument for a template template parameter" msgstr "" -#: cp/semantics.c:2050 +#: cp/semantics.c:2051 msgid "definition of `%#T' inside template parameter list" msgstr "" -#: cp/semantics.c:2061 +#: cp/semantics.c:2062 msgid "invalid definition of qualified type `%T'" msgstr "" -#: cp/semantics.c:2075 +#: cp/semantics.c:2076 msgid "redefinition of `%#T'" msgstr "" -#: cp/semantics.c:2076 +#: cp/semantics.c:2077 msgid "previous definition of `%#T'" msgstr "" -#: cp/semantics.c:2252 +#: cp/semantics.c:2253 msgid "invalid base-class specification" msgstr "" -#: cp/semantics.c:2261 +#: cp/semantics.c:2262 msgid "base class `%T' has cv qualifiers" msgstr "" -#: cp/semantics.c:2294 +#: cp/semantics.c:2295 msgid "multiple declarators in template declaration" msgstr "" -#: cp/semantics.c:2306 +#: cp/semantics.c:2307 msgid "incomplete type `%T' used in nested name specifier" msgstr "" -#: cp/semantics.c:2309 +#: cp/semantics.c:2310 msgid "reference to `%T::%D' is ambiguous" msgstr "" -#: cp/semantics.c:2313 cp/typeck.c:1649 +#: cp/semantics.c:2314 cp/typeck.c:1649 msgid "`%D' is not a member of `%T'" msgstr "" -#: cp/semantics.c:2316 +#: cp/semantics.c:2317 msgid "`%D' is not a member of `%D'" msgstr "" -#: cp/semantics.c:2318 +#: cp/semantics.c:2319 msgid "`::%D' has not been declared" msgstr "" -#: cp/semantics.c:2441 +#: cp/semantics.c:2442 msgid "" "template parameter `%D' of type `%T' is not allowed in an integral constant " "expression because it is not of integral or enumeration type" msgstr "" -#: cp/semantics.c:2585 +#: cp/semantics.c:2586 msgid "`%D' cannot appear in a constant-expression" msgstr "" -#: cp/semantics.c:2593 +#: cp/semantics.c:2594 msgid "use of namespace `%D' as expression" msgstr "" -#: cp/semantics.c:2598 +#: cp/semantics.c:2599 msgid "use of class template `%T' as expression" msgstr "" #. Ambiguous reference to base members. -#: cp/semantics.c:2604 +#: cp/semantics.c:2605 msgid "request for member `%D' is ambiguous in multiple inheritance lattice" msgstr "" -#: cp/semantics.c:2665 +#: cp/semantics.c:2666 #, c-format msgid "use of %s from containing function" msgstr "" -#: cp/semantics.c:2668 +#: cp/semantics.c:2669 msgid " `%#D' declared here" msgstr "" -#: cp/semantics.c:2719 +#: cp/semantics.c:2720 #, c-format msgid "type of `%E' is unknown" msgstr "" @@ -16699,6 +16772,10 @@ msgstr "" msgid "at this point in file" msgstr "" +#: cp/typeck.c:2569 +msgid "too many arguments to function" +msgstr "" + #: cp/typeck.c:2603 msgid "parameter %P of `%D' has incomplete type `%T'" msgstr "" @@ -16711,6 +16788,10 @@ msgstr "" msgid "too few arguments to %s `%+#D'" msgstr "" +#: cp/typeck.c:2675 +msgid "too few arguments to function" +msgstr "" + #: cp/typeck.c:2822 cp/typeck.c:2832 msgid "assuming cast to type `%T' from overloaded function" msgstr "" @@ -17226,7 +17307,7 @@ msgid "call to function which throws incomplete type `%#T'" msgstr "" #. XXX Not i18n clean. -#: cp/cp-tree.h:3801 +#: cp/cp-tree.h:3806 #, c-format msgid "%s is deprecated, please see the documentation for details" msgstr "" @@ -17554,10 +17635,12 @@ msgstr "" #. FIXME: i18n bug here. Order of prints should not be #. fixed. #: java/gjavah.c:849 +#, c-format msgid "ignored method `" msgstr "" #: java/gjavah.c:851 +#, c-format msgid "' marked virtual\n" msgstr "" @@ -17598,102 +17681,125 @@ msgid "base class is of array type" msgstr "" #: java/gjavah.c:2280 +#, c-format msgid "Try `gcjh --help' for more information.\n" msgstr "" #: java/gjavah.c:2287 +#, c-format msgid "" "Usage: gcjh [OPTION]... CLASS...\n" "\n" msgstr "" #: java/gjavah.c:2288 +#, c-format msgid "" "Generate C++ header files from .class files\n" "\n" msgstr "" #: java/gjavah.c:2289 +#, c-format msgid " -stubs Generate an implementation stub file\n" msgstr "" #: java/gjavah.c:2290 +#, c-format msgid " -jni Generate a JNI header or stub\n" msgstr "" #: java/gjavah.c:2292 +#, c-format msgid " -add TEXT Insert TEXT into class body\n" msgstr "" #: java/gjavah.c:2293 +#, c-format msgid " -append TEXT Insert TEXT after class declaration\n" msgstr "" #: java/gjavah.c:2294 +#, c-format msgid " -friend TEXT Insert TEXT as `friend' declaration\n" msgstr "" #: java/gjavah.c:2295 +#, c-format msgid " -prepend TEXT Insert TEXT before start of class\n" msgstr "" #: java/gjavah.c:2297 java/jcf-dump.c:897 +#, c-format msgid " --classpath PATH Set path to find .class files\n" msgstr "" #: java/gjavah.c:2298 java/jcf-dump.c:898 +#, c-format msgid " -IDIR Append directory to class path\n" msgstr "" #: java/gjavah.c:2299 java/jcf-dump.c:899 +#, c-format msgid " --bootclasspath PATH Override built-in class path\n" msgstr "" #: java/gjavah.c:2300 java/jcf-dump.c:900 +#, c-format msgid " --extdirs PATH Set extensions directory path\n" msgstr "" #: java/gjavah.c:2301 +#, c-format msgid " -d DIRECTORY Set output directory name\n" msgstr "" #: java/gjavah.c:2302 java/jcf-dump.c:901 java/jv-scan.c:114 +#, c-format msgid " -o FILE Set output file name\n" msgstr "" #: java/gjavah.c:2303 +#, c-format msgid " -td DIRECTORY Set temporary directory name\n" msgstr "" #: java/gjavah.c:2305 java/jcf-dump.c:903 java/jv-scan.c:116 +#, c-format msgid " --help Print this help, then exit\n" msgstr "" #: java/gjavah.c:2306 java/jcf-dump.c:904 java/jv-scan.c:117 +#, c-format msgid " --version Print version number, then exit\n" msgstr "" #: java/gjavah.c:2307 java/jcf-dump.c:905 +#, c-format msgid " -v, --verbose Print extra information while running\n" msgstr "" #: java/gjavah.c:2309 +#, c-format msgid "" " -M Print all dependencies to stdout;\n" " suppress ordinary output\n" msgstr "" #: java/gjavah.c:2311 +#, c-format msgid "" " -MM Print non-system dependencies to stdout;\n" " suppress ordinary output\n" msgstr "" #: java/gjavah.c:2313 +#, c-format msgid " -MD Print all dependencies to stdout\n" msgstr "" #: java/gjavah.c:2314 +#, c-format msgid " -MMD Print non-system dependencies to stdout\n" msgstr "" @@ -17732,10 +17838,12 @@ msgid "Found in %s\n" msgstr "" #: java/jcf-dump.c:814 +#, c-format msgid "Not a valid Java .class file.\n" msgstr "" #: java/jcf-dump.c:820 +#, c-format msgid "error while parsing constant pool\n" msgstr "" @@ -17745,42 +17853,51 @@ msgid "error in constant pool entry #%d\n" msgstr "" #: java/jcf-dump.c:836 +#, c-format msgid "error while parsing fields\n" msgstr "" #: java/jcf-dump.c:842 +#, c-format msgid "error while parsing methods\n" msgstr "" #: java/jcf-dump.c:848 +#, c-format msgid "error while parsing final attributes\n" msgstr "" #: java/jcf-dump.c:885 +#, c-format msgid "Try `jcf-dump --help' for more information.\n" msgstr "" #: java/jcf-dump.c:892 +#, c-format msgid "" "Usage: jcf-dump [OPTION]... CLASS...\n" "\n" msgstr "" #: java/jcf-dump.c:893 +#, c-format msgid "" "Display contents of a class file in readable form.\n" "\n" msgstr "" #: java/jcf-dump.c:894 +#, c-format msgid " -c Disassemble method bodies\n" msgstr "" #: java/jcf-dump.c:895 +#, c-format msgid " --javap Generate output in `javap' format\n" msgstr "" #: java/jcf-dump.c:932 java/jcf-dump.c:1000 +#, c-format msgid "jcf-dump: no classes specified\n" msgstr "" @@ -17790,10 +17907,12 @@ msgid "Cannot open '%s' for output.\n" msgstr "" #: java/jcf-dump.c:1066 +#, c-format msgid "bad format of .zip/.jar archive\n" msgstr "" #: java/jcf-dump.c:1184 +#, c-format msgid "Bad byte codes.\n" msgstr "" @@ -17912,42 +18031,51 @@ msgid "can't create %s: %m" msgstr "" #: java/jv-scan.c:99 +#, c-format msgid "Try `jv-scan --help' for more information.\n" msgstr "" #: java/jv-scan.c:106 +#, c-format msgid "" "Usage: jv-scan [OPTION]... FILE...\n" "\n" msgstr "" #: java/jv-scan.c:107 +#, c-format msgid "" "Print useful information read from Java source files.\n" "\n" msgstr "" #: java/jv-scan.c:108 +#, c-format msgid " --no-assert Don't recognize the assert keyword\n" msgstr "" #: java/jv-scan.c:109 +#, c-format msgid " --complexity Print cyclomatic complexity of input file\n" msgstr "" #: java/jv-scan.c:110 +#, c-format msgid " --encoding NAME Specify encoding of input file\n" msgstr "" #: java/jv-scan.c:111 +#, c-format msgid " --print-main Print name of class containing `main'\n" msgstr "" #: java/jv-scan.c:112 +#, c-format msgid " --list-class List all classes defined in file\n" msgstr "" #: java/jv-scan.c:113 +#, c-format msgid "" " --list-filename Print input filename when listing class names\n" msgstr "" @@ -18055,1070 +18183,995 @@ msgstr "" msgid "internal error - invalid Utf8 name" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse-scan.y:881 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:977 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1318 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1379 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1590 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1813 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1822 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1833 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1844 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1856 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1871 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1888 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1890 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1971 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2148 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2217 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2381 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2394 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2401 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2408 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2419 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2421 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2459 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2461 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2463 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2484 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2486 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2488 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2504 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2506 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2527 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2529 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2531 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2559 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2561 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2563 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2565 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2583 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2585 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2596 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2607 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2618 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2629 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2640 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2653 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2657 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2659 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2672 +#: ../../gcc-cvs/gcc/java/parse-scan.y:881 ../../gcc-cvs/gcc/java/parse.y:977 +#: ../../gcc-cvs/gcc/java/parse.y:1318 ../../gcc-cvs/gcc/java/parse.y:1379 +#: ../../gcc-cvs/gcc/java/parse.y:1590 ../../gcc-cvs/gcc/java/parse.y:1813 +#: ../../gcc-cvs/gcc/java/parse.y:1822 ../../gcc-cvs/gcc/java/parse.y:1833 +#: ../../gcc-cvs/gcc/java/parse.y:1844 ../../gcc-cvs/gcc/java/parse.y:1856 +#: ../../gcc-cvs/gcc/java/parse.y:1871 ../../gcc-cvs/gcc/java/parse.y:1888 +#: ../../gcc-cvs/gcc/java/parse.y:1890 ../../gcc-cvs/gcc/java/parse.y:1971 +#: ../../gcc-cvs/gcc/java/parse.y:2148 ../../gcc-cvs/gcc/java/parse.y:2217 +#: ../../gcc-cvs/gcc/java/parse.y:2381 ../../gcc-cvs/gcc/java/parse.y:2394 +#: ../../gcc-cvs/gcc/java/parse.y:2401 ../../gcc-cvs/gcc/java/parse.y:2408 +#: ../../gcc-cvs/gcc/java/parse.y:2419 ../../gcc-cvs/gcc/java/parse.y:2421 +#: ../../gcc-cvs/gcc/java/parse.y:2459 ../../gcc-cvs/gcc/java/parse.y:2461 +#: ../../gcc-cvs/gcc/java/parse.y:2463 ../../gcc-cvs/gcc/java/parse.y:2484 +#: ../../gcc-cvs/gcc/java/parse.y:2486 ../../gcc-cvs/gcc/java/parse.y:2488 +#: ../../gcc-cvs/gcc/java/parse.y:2504 ../../gcc-cvs/gcc/java/parse.y:2506 +#: ../../gcc-cvs/gcc/java/parse.y:2527 ../../gcc-cvs/gcc/java/parse.y:2529 +#: ../../gcc-cvs/gcc/java/parse.y:2531 ../../gcc-cvs/gcc/java/parse.y:2559 +#: ../../gcc-cvs/gcc/java/parse.y:2561 ../../gcc-cvs/gcc/java/parse.y:2563 +#: ../../gcc-cvs/gcc/java/parse.y:2565 ../../gcc-cvs/gcc/java/parse.y:2583 +#: ../../gcc-cvs/gcc/java/parse.y:2585 ../../gcc-cvs/gcc/java/parse.y:2596 +#: ../../gcc-cvs/gcc/java/parse.y:2607 ../../gcc-cvs/gcc/java/parse.y:2618 +#: ../../gcc-cvs/gcc/java/parse.y:2629 ../../gcc-cvs/gcc/java/parse.y:2640 +#: ../../gcc-cvs/gcc/java/parse.y:2653 ../../gcc-cvs/gcc/java/parse.y:2657 +#: ../../gcc-cvs/gcc/java/parse.y:2659 ../../gcc-cvs/gcc/java/parse.y:2672 msgid "Missing term" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse-scan.y:883 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:751 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:789 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:814 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:998 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1353 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1566 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1568 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1798 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1824 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1835 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1846 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1858 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1873 +#: ../../gcc-cvs/gcc/java/parse-scan.y:883 ../../gcc-cvs/gcc/java/parse.y:751 +#: ../../gcc-cvs/gcc/java/parse.y:789 ../../gcc-cvs/gcc/java/parse.y:814 +#: ../../gcc-cvs/gcc/java/parse.y:998 ../../gcc-cvs/gcc/java/parse.y:1353 +#: ../../gcc-cvs/gcc/java/parse.y:1566 ../../gcc-cvs/gcc/java/parse.y:1568 +#: ../../gcc-cvs/gcc/java/parse.y:1798 ../../gcc-cvs/gcc/java/parse.y:1824 +#: ../../gcc-cvs/gcc/java/parse.y:1835 ../../gcc-cvs/gcc/java/parse.y:1846 +#: ../../gcc-cvs/gcc/java/parse.y:1858 ../../gcc-cvs/gcc/java/parse.y:1873 msgid "';' expected" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:749 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:787 +#: ../../gcc-cvs/gcc/java/parse.y:749 ../../gcc-cvs/gcc/java/parse.y:787 msgid "Missing name" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:777 +#: ../../gcc-cvs/gcc/java/parse.y:777 #, c-format msgid "Ambiguous class: `%s' and `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:812 +#: ../../gcc-cvs/gcc/java/parse.y:812 msgid "'*' expected" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:826 +#: ../../gcc-cvs/gcc/java/parse.y:826 msgid "Class or interface declaration expected" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:843 +#: ../../gcc-cvs/gcc/java/parse.y:843 #, c-format msgid "Modifier `%s' declared twice" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:863 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:865 +#: ../../gcc-cvs/gcc/java/parse.y:863 ../../gcc-cvs/gcc/java/parse.y:865 msgid "Missing class name" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:868 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:872 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:880 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1038 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1299 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1301 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1633 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1884 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1916 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1978 +#: ../../gcc-cvs/gcc/java/parse.y:868 ../../gcc-cvs/gcc/java/parse.y:872 +#: ../../gcc-cvs/gcc/java/parse.y:880 ../../gcc-cvs/gcc/java/parse.y:1038 +#: ../../gcc-cvs/gcc/java/parse.y:1299 ../../gcc-cvs/gcc/java/parse.y:1301 +#: ../../gcc-cvs/gcc/java/parse.y:1633 ../../gcc-cvs/gcc/java/parse.y:1884 +#: ../../gcc-cvs/gcc/java/parse.y:1916 ../../gcc-cvs/gcc/java/parse.y:1978 msgid "'{' expected" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:882 +#: ../../gcc-cvs/gcc/java/parse.y:882 msgid "Missing super class name" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:892 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:908 +#: ../../gcc-cvs/gcc/java/parse.y:892 ../../gcc-cvs/gcc/java/parse.y:908 msgid "Missing interface name" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:992 +#: ../../gcc-cvs/gcc/java/parse.y:992 msgid "Missing variable initializer" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1009 +#: ../../gcc-cvs/gcc/java/parse.y:1009 msgid "Invalid declaration" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1012 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1097 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2163 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2192 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2214 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2218 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2253 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2332 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2342 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2352 +#: ../../gcc-cvs/gcc/java/parse.y:1012 ../../gcc-cvs/gcc/java/parse.y:1097 +#: ../../gcc-cvs/gcc/java/parse.y:2163 ../../gcc-cvs/gcc/java/parse.y:2192 +#: ../../gcc-cvs/gcc/java/parse.y:2214 ../../gcc-cvs/gcc/java/parse.y:2218 +#: ../../gcc-cvs/gcc/java/parse.y:2253 ../../gcc-cvs/gcc/java/parse.y:2332 +#: ../../gcc-cvs/gcc/java/parse.y:2342 ../../gcc-cvs/gcc/java/parse.y:2352 msgid "']' expected" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1016 +#: ../../gcc-cvs/gcc/java/parse.y:1016 msgid "Unbalanced ']'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1052 +#: ../../gcc-cvs/gcc/java/parse.y:1052 msgid "Invalid method declaration, method name required" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1057 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1062 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1067 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2066 +#: ../../gcc-cvs/gcc/java/parse.y:1057 ../../gcc-cvs/gcc/java/parse.y:1062 +#: ../../gcc-cvs/gcc/java/parse.y:1067 ../../gcc-cvs/gcc/java/parse.y:2066 msgid "Identifier expected" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1072 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:4743 +#: ../../gcc-cvs/gcc/java/parse.y:1072 ../../gcc-cvs/gcc/java/parse.y:4743 msgid "Invalid method declaration, return type required" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1092 +#: ../../gcc-cvs/gcc/java/parse.y:1092 msgid "Discouraged form of returned type specification" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1095 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1546 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1553 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1562 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1564 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1592 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1701 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2008 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2061 +#: ../../gcc-cvs/gcc/java/parse.y:1095 ../../gcc-cvs/gcc/java/parse.y:1546 +#: ../../gcc-cvs/gcc/java/parse.y:1553 ../../gcc-cvs/gcc/java/parse.y:1562 +#: ../../gcc-cvs/gcc/java/parse.y:1564 ../../gcc-cvs/gcc/java/parse.y:1592 +#: ../../gcc-cvs/gcc/java/parse.y:1701 ../../gcc-cvs/gcc/java/parse.y:2008 +#: ../../gcc-cvs/gcc/java/parse.y:2061 msgid "')' expected" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1111 +#: ../../gcc-cvs/gcc/java/parse.y:1111 msgid "Missing formal parameter term" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1126 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1131 +#: ../../gcc-cvs/gcc/java/parse.y:1126 ../../gcc-cvs/gcc/java/parse.y:1131 msgid "Missing identifier" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1151 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1160 +#: ../../gcc-cvs/gcc/java/parse.y:1151 ../../gcc-cvs/gcc/java/parse.y:1160 msgid "Missing class type term" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1187 +#: ../../gcc-cvs/gcc/java/parse.y:1187 #, c-format msgid "" "Can't define static initializer in class `%s'. Static initializer can only " "be defined in top-level classes" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1316 +#: ../../gcc-cvs/gcc/java/parse.y:1316 msgid "Invalid interface type" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1485 +#: ../../gcc-cvs/gcc/java/parse.y:1485 msgid "An empty declaration is a deprecated feature that should not be used" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1506 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1680 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1682 +#: ../../gcc-cvs/gcc/java/parse.y:1506 ../../gcc-cvs/gcc/java/parse.y:1680 +#: ../../gcc-cvs/gcc/java/parse.y:1682 msgid "':' expected" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1532 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1537 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1542 +#: ../../gcc-cvs/gcc/java/parse.y:1532 ../../gcc-cvs/gcc/java/parse.y:1537 +#: ../../gcc-cvs/gcc/java/parse.y:1542 msgid "Invalid expression statement" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1560 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1588 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1629 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1697 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1765 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1886 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1964 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2055 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2057 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2070 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2313 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2315 +#: ../../gcc-cvs/gcc/java/parse.y:1560 ../../gcc-cvs/gcc/java/parse.y:1588 +#: ../../gcc-cvs/gcc/java/parse.y:1629 ../../gcc-cvs/gcc/java/parse.y:1697 +#: ../../gcc-cvs/gcc/java/parse.y:1765 ../../gcc-cvs/gcc/java/parse.y:1886 +#: ../../gcc-cvs/gcc/java/parse.y:1964 ../../gcc-cvs/gcc/java/parse.y:2055 +#: ../../gcc-cvs/gcc/java/parse.y:2057 ../../gcc-cvs/gcc/java/parse.y:2070 +#: ../../gcc-cvs/gcc/java/parse.y:2313 ../../gcc-cvs/gcc/java/parse.y:2315 msgid "'(' expected" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1631 +#: ../../gcc-cvs/gcc/java/parse.y:1631 msgid "Missing term or ')'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1678 +#: ../../gcc-cvs/gcc/java/parse.y:1678 msgid "Missing or invalid constant expression" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1699 +#: ../../gcc-cvs/gcc/java/parse.y:1699 msgid "Missing term and ')' expected" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1738 +#: ../../gcc-cvs/gcc/java/parse.y:1738 msgid "Invalid control expression" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1740 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1742 +#: ../../gcc-cvs/gcc/java/parse.y:1740 ../../gcc-cvs/gcc/java/parse.y:1742 msgid "Invalid update expression" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1767 +#: ../../gcc-cvs/gcc/java/parse.y:1767 msgid "Invalid init statement" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:1967 +#: ../../gcc-cvs/gcc/java/parse.y:1967 msgid "Missing term or ')' expected" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2010 +#: ../../gcc-cvs/gcc/java/parse.y:2010 msgid "'class' or 'this' expected" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2012 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2014 +#: ../../gcc-cvs/gcc/java/parse.y:2012 ../../gcc-cvs/gcc/java/parse.y:2014 msgid "'class' expected" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2059 +#: ../../gcc-cvs/gcc/java/parse.y:2059 msgid "')' or term expected" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2161 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2190 +#: ../../gcc-cvs/gcc/java/parse.y:2161 ../../gcc-cvs/gcc/java/parse.y:2190 msgid "'[' expected" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2268 +#: ../../gcc-cvs/gcc/java/parse.y:2268 msgid "Field expected" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2327 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2337 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2347 +#: ../../gcc-cvs/gcc/java/parse.y:2327 ../../gcc-cvs/gcc/java/parse.y:2337 +#: ../../gcc-cvs/gcc/java/parse.y:2347 msgid "Missing term and ']' expected" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2452 +#: ../../gcc-cvs/gcc/java/parse.y:2452 msgid "']' expected, invalid type expression" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2455 +#: ../../gcc-cvs/gcc/java/parse.y:2455 msgid "Invalid type expression" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:2567 +#: ../../gcc-cvs/gcc/java/parse.y:2567 msgid "Invalid reference type" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:3034 +#: ../../gcc-cvs/gcc/java/parse.y:3034 msgid "Constructor invocation must be first thing in a constructor" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:3036 +#: ../../gcc-cvs/gcc/java/parse.y:3036 msgid "Only constructors can invoke constructors" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:3044 +#: ../../gcc-cvs/gcc/java/parse.y:3044 #, c-format msgid ": `%s' JDK1.1(TM) feature" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:3124 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:3126 +#: ../../gcc-cvs/gcc/java/parse.y:3124 ../../gcc-cvs/gcc/java/parse.y:3126 #, c-format msgid "" "%s.\n" "%s" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:3285 +#: ../../gcc-cvs/gcc/java/parse.y:3285 msgid "Missing return statement" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:3307 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:11931 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:11935 +#: ../../gcc-cvs/gcc/java/parse.y:3307 ../../gcc-cvs/gcc/java/parse.y:11931 +#: ../../gcc-cvs/gcc/java/parse.y:11935 msgid "Unreachable statement" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:3317 +#: ../../gcc-cvs/gcc/java/parse.y:3317 #, c-format msgid "Can't access %s field `%s.%s' from `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:3386 +#: ../../gcc-cvs/gcc/java/parse.y:3386 #, c-format msgid "%s `%s' already defined in %s:%d" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:3404 +#: ../../gcc-cvs/gcc/java/parse.y:3404 #, c-format msgid "" "Variable `%s' is already defined in this method and was declared `%s %s' at " "line %d" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:3515 +#: ../../gcc-cvs/gcc/java/parse.y:3515 #, c-format msgid "Interface `%s' repeated" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:3545 +#: ../../gcc-cvs/gcc/java/parse.y:3545 #, c-format msgid "%s name `%s' clashes with imported type `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:3577 +#: ../../gcc-cvs/gcc/java/parse.y:3577 #, c-format msgid "Public %s `%s' must be defined in a file called `%s.java'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:3592 +#: ../../gcc-cvs/gcc/java/parse.y:3592 #, c-format msgid "" "Inner class `%s' can't be static. Static classes can only occur in " "interfaces and top-level classes" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:3673 +#: ../../gcc-cvs/gcc/java/parse.y:3673 #, c-format msgid "" "The class name `%s' is already defined in this scope. An inner class may not " "have the same simple name as any of its enclosing classes" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:3715 +#: ../../gcc-cvs/gcc/java/parse.y:3715 msgid "Qualifier must be a reference" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:3736 +#: ../../gcc-cvs/gcc/java/parse.y:3736 #, c-format msgid "Cyclic inheritance involving %s" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:4000 +#: ../../gcc-cvs/gcc/java/parse.y:4000 #, c-format msgid "" "Redundant use of `abstract' modifier. Interface `%s' is implicitly abstract" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:4155 +#: ../../gcc-cvs/gcc/java/parse.y:4155 #, c-format msgid "Class `%s' can't be declared both abstract and final" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:4167 +#: ../../gcc-cvs/gcc/java/parse.y:4167 msgid "`java.lang.Object' can't extend anything" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:4409 +#: ../../gcc-cvs/gcc/java/parse.y:4409 #, c-format msgid "Duplicate variable declaration: `%s %s' was `%s %s' (%s:%d)" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:4473 +#: ../../gcc-cvs/gcc/java/parse.y:4473 #, c-format msgid "Field `%s' can't be static in inner class `%s' unless it is final" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:4718 +#: ../../gcc-cvs/gcc/java/parse.y:4718 #, c-format msgid "Class `%s' must be declared abstract to define abstract method `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:4725 +#: ../../gcc-cvs/gcc/java/parse.y:4725 #, c-format msgid "native method `%s' can't be strictfp" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:4729 +#: ../../gcc-cvs/gcc/java/parse.y:4729 #, c-format msgid "method `%s' can't be transient" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:4732 +#: ../../gcc-cvs/gcc/java/parse.y:4732 #, c-format msgid "method `%s' can't be volatile" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:4782 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6531 +#: ../../gcc-cvs/gcc/java/parse.y:4782 ../../gcc-cvs/gcc/java/parse.y:6531 #, c-format msgid "" "Method `%s' can't be static in inner class `%s'. Only members of interfaces " "and top-level classes can be static" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:4948 +#: ../../gcc-cvs/gcc/java/parse.y:4948 #, c-format msgid "%s method `%s' can't have a body defined" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:4959 +#: ../../gcc-cvs/gcc/java/parse.y:4959 #, c-format msgid "Non native and non abstract method `%s' must have a body defined" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:5030 +#: ../../gcc-cvs/gcc/java/parse.y:5030 #, c-format msgid "%s: recursive invocation of constructor `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:5060 +#: ../../gcc-cvs/gcc/java/parse.y:5060 msgid "" "Inconsistent member declaration. At most one of `public', `private', or " "`protected' may be specified" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:5068 +#: ../../gcc-cvs/gcc/java/parse.y:5068 msgid "" "Inconsistent member declaration. At most one of `final' or `volatile' may " "be specified" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:5158 +#: ../../gcc-cvs/gcc/java/parse.y:5158 #, c-format msgid "" "Variable `%s' is used more than once in the argument list of method `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:5242 +#: ../../gcc-cvs/gcc/java/parse.y:5242 #, c-format msgid "%s `%s' can't implement/extend %s `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:5276 +#: ../../gcc-cvs/gcc/java/parse.y:5276 #, c-format msgid "Class `%s' can't subclass %s `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:5285 +#: ../../gcc-cvs/gcc/java/parse.y:5285 #, c-format msgid "Can't subclass final classes: %s" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:5471 +#: ../../gcc-cvs/gcc/java/parse.y:5471 #, c-format msgid "Cyclic class inheritance%s" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6182 +#: ../../gcc-cvs/gcc/java/parse.y:6182 #, c-format msgid "Superclass `%s' of class `%s' not found" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6188 +#: ../../gcc-cvs/gcc/java/parse.y:6188 #, c-format msgid "Type `%s' not found in declaration of field `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6194 +#: ../../gcc-cvs/gcc/java/parse.y:6194 #, c-format msgid "" "Type `%s' not found in the declaration of the argument `%s' of method `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6201 +#: ../../gcc-cvs/gcc/java/parse.y:6201 #, c-format msgid "" "Type `%s' not found in the declaration of the return type of method `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6207 +#: ../../gcc-cvs/gcc/java/parse.y:6207 #, c-format msgid "Superinterface `%s' of %s `%s' not found" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6214 +#: ../../gcc-cvs/gcc/java/parse.y:6214 #, c-format msgid "Type `%s' not found in the declaration of the local variable `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6221 +#: ../../gcc-cvs/gcc/java/parse.y:6221 #, c-format msgid "Class `%s' not found in `throws'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6278 +#: ../../gcc-cvs/gcc/java/parse.y:6278 #, c-format msgid "Duplicate %s declaration `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6352 +#: ../../gcc-cvs/gcc/java/parse.y:6352 #, c-format msgid "" "Class `%s' doesn't define the abstract method `%s %s' from %s `%s'. This " "method must be defined or %s `%s' must be declared abstract" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6508 +#: ../../gcc-cvs/gcc/java/parse.y:6508 #, c-format msgid "" "Class `%s' in `throws' clause must be a subclass of class `java.lang." "Throwable'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6552 +#: ../../gcc-cvs/gcc/java/parse.y:6552 #, c-format msgid "" "Class `%s' must override `%s' with a public method in order to implement " "interface `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6566 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6793 +#: ../../gcc-cvs/gcc/java/parse.y:6566 ../../gcc-cvs/gcc/java/parse.y:6793 #, c-format msgid "Method `%s' was defined with return type `%s' in class `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6583 +#: ../../gcc-cvs/gcc/java/parse.y:6583 #, c-format msgid "%s methods can't be overridden. Method `%s' is %s in class `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6597 +#: ../../gcc-cvs/gcc/java/parse.y:6597 #, c-format msgid "" "Instance methods can't be overridden by a static method. Method `%s' is an " "instance method in class `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6620 +#: ../../gcc-cvs/gcc/java/parse.y:6620 #, c-format msgid "" "Methods can't be overridden to be more private. Method `%s' is not %s in " "class `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6761 +#: ../../gcc-cvs/gcc/java/parse.y:6761 #, c-format msgid "" "Invalid checked exception class `%s' in `throws' clause. The exception must " "be a subclass of an exception thrown by `%s' from class `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6818 +#: ../../gcc-cvs/gcc/java/parse.y:6818 #, c-format msgid "" "Interface `%s' inherits method `%s' from interface `%s'. This method is " "redefined with a different return type in interface `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:6993 +#: ../../gcc-cvs/gcc/java/parse.y:6993 #, c-format msgid "Class or interface `%s' not found in import" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:7078 +#: ../../gcc-cvs/gcc/java/parse.y:7078 #, c-format msgid "malformed .zip archive in CLASSPATH: %s" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:7149 +#: ../../gcc-cvs/gcc/java/parse.y:7149 #, c-format msgid "" "Can't find default package `%s'. Check the CLASSPATH environment variable " "and the access to the archives" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:7154 +#: ../../gcc-cvs/gcc/java/parse.y:7154 #, c-format msgid "Package `%s' not found in import" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:7251 +#: ../../gcc-cvs/gcc/java/parse.y:7251 #, c-format msgid "Type `%s' also potentially defined in package `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:7396 +#: ../../gcc-cvs/gcc/java/parse.y:7396 #, c-format msgid "Nested %s %s is %s; cannot be accessed from here" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:7434 +#: ../../gcc-cvs/gcc/java/parse.y:7434 #, c-format msgid "" "Can't access %s `%s'. Only public classes and interfaces in other packages " "can be accessed" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:7472 +#: ../../gcc-cvs/gcc/java/parse.y:7472 msgid "Only `final' is allowed as a local variables modifier" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:9026 +#: ../../gcc-cvs/gcc/java/parse.y:9026 #, c-format msgid "No constructor matching `%s' found in class `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:9525 +#: ../../gcc-cvs/gcc/java/parse.y:9525 #, c-format msgid "Can't reference `%s' before the superclass constructor has been called" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:9579 +#: ../../gcc-cvs/gcc/java/parse.y:9579 #, c-format msgid "" "Local variable `%s' can't be accessed from within the inner class `%s' " "unless it is declared final" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:9584 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10047 +#: ../../gcc-cvs/gcc/java/parse.y:9584 ../../gcc-cvs/gcc/java/parse.y:10047 #, c-format msgid "Undefined variable `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:9595 +#: ../../gcc-cvs/gcc/java/parse.y:9595 #, c-format msgid "Can't make a static reference to nonstatic variable `%s' in class `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:9801 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10656 +#: ../../gcc-cvs/gcc/java/parse.y:9801 ../../gcc-cvs/gcc/java/parse.y:10656 #, c-format msgid "No enclosing instance for inner class `%s' is in scope%s" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:9920 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:12363 +#: ../../gcc-cvs/gcc/java/parse.y:9920 ../../gcc-cvs/gcc/java/parse.y:12363 msgid "Keyword `this' used outside allowed context" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:9926 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10810 +#: ../../gcc-cvs/gcc/java/parse.y:9926 ../../gcc-cvs/gcc/java/parse.y:10810 msgid "" "Can't reference `this' before the superclass constructor has been called" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:9942 +#: ../../gcc-cvs/gcc/java/parse.y:9942 #, c-format msgid "" "Can't use variable `%s.this': type `%s' isn't an outer type of type `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:9975 +#: ../../gcc-cvs/gcc/java/parse.y:9975 msgid "Keyword `super' used outside allowed context" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10024 +#: ../../gcc-cvs/gcc/java/parse.y:10024 #, c-format msgid "No variable `%s' defined in class `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10029 +#: ../../gcc-cvs/gcc/java/parse.y:10029 #, c-format msgid "Undefined variable or class name: `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10100 +#: ../../gcc-cvs/gcc/java/parse.y:10100 #, c-format msgid "Can't use type `%s' as a qualifier" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10119 +#: ../../gcc-cvs/gcc/java/parse.y:10119 #, c-format msgid "Attempt to reference field `%s' in `%s %s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10150 +#: ../../gcc-cvs/gcc/java/parse.y:10150 #, c-format msgid "No variable `%s' defined in type `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10234 +#: ../../gcc-cvs/gcc/java/parse.y:10234 #, c-format msgid "Attempt to reference field `new' in a `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10371 +#: ../../gcc-cvs/gcc/java/parse.y:10371 #, c-format msgid "The class `%s' has been deprecated" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10381 +#: ../../gcc-cvs/gcc/java/parse.y:10381 #, c-format msgid "The %s `%s' in class `%s' has been deprecated" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10498 +#: ../../gcc-cvs/gcc/java/parse.y:10498 #, c-format msgid "Can't invoke a method on primitive type `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10513 +#: ../../gcc-cvs/gcc/java/parse.y:10513 #, c-format msgid "Can't make static reference to method `%s' in interface `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10523 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10857 +#: ../../gcc-cvs/gcc/java/parse.y:10523 ../../gcc-cvs/gcc/java/parse.y:10857 #, c-format msgid "Can't make static reference to method `%s %s' in class `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10563 +#: ../../gcc-cvs/gcc/java/parse.y:10563 msgid "Can't invoke super constructor on java.lang.Object" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10576 -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:14424 +#: ../../gcc-cvs/gcc/java/parse.y:10576 ../../gcc-cvs/gcc/java/parse.y:14424 #, c-format msgid "Class `%s' not found in type declaration" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10588 +#: ../../gcc-cvs/gcc/java/parse.y:10588 #, c-format msgid "Class `%s' is an abstract class. It can't be instantiated" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10618 +#: ../../gcc-cvs/gcc/java/parse.y:10618 #, c-format msgid "No method named `%s' in scope" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:10729 +#: ../../gcc-cvs/gcc/java/parse.y:10729 #, c-format msgid "Can't access %s %s `%s.%s' from `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:11195 +#: ../../gcc-cvs/gcc/java/parse.y:11195 #, c-format msgid "Can't find %s `%s(%s)' in type `%s'%s" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:11777 +#: ../../gcc-cvs/gcc/java/parse.y:11777 msgid "Constant expression required" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:11790 +#: ../../gcc-cvs/gcc/java/parse.y:11790 #, c-format msgid "Incompatible type for case. Can't convert `%s' to `int'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:11824 +#: ../../gcc-cvs/gcc/java/parse.y:11824 msgid "Duplicate case label: `default'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:12172 +#: ../../gcc-cvs/gcc/java/parse.y:12172 #, c-format msgid "Incompatible type for `+='. Can't convert `%s' to `java.lang.String'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:12343 +#: ../../gcc-cvs/gcc/java/parse.y:12343 #, c-format msgid "missing static field `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:12348 +#: ../../gcc-cvs/gcc/java/parse.y:12348 #, c-format msgid "not a static field `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:12371 +#: ../../gcc-cvs/gcc/java/parse.y:12371 msgid "" "Can't reference `this' or `super' before the superclass constructor has been " "called" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:12391 +#: ../../gcc-cvs/gcc/java/parse.y:12391 #, c-format msgid "No case for %s" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:12821 +#: ../../gcc-cvs/gcc/java/parse.y:12821 msgid "Invalid left hand side of assignment" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:12872 +#: ../../gcc-cvs/gcc/java/parse.y:12872 #, c-format msgid "Incompatible type for %s. Can't convert `%s' to `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:12875 +#: ../../gcc-cvs/gcc/java/parse.y:12875 #, c-format msgid "Incompatible type for %s. Explicit cast needed to convert `%s' to `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:13047 +#: ../../gcc-cvs/gcc/java/parse.y:13047 #, c-format msgid "" "Constant expression `%s' too wide for narrowing primitive conversion to `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:13338 +#: ../../gcc-cvs/gcc/java/parse.y:13338 #, c-format msgid "unregistered operator %s" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:13485 +#: ../../gcc-cvs/gcc/java/parse.y:13485 msgid "" "Evaluating this expression will result in an arithmetic exception being " "thrown" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:13567 +#: ../../gcc-cvs/gcc/java/parse.y:13567 #, c-format msgid "" "Incompatible type for `%s'. Explicit cast needed to convert shift distance " "from `%s' to integral" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:13572 +#: ../../gcc-cvs/gcc/java/parse.y:13572 #, c-format msgid "" "Incompatible type for `%s'. Can't convert shift distance from `%s' to " "integral" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:13648 +#: ../../gcc-cvs/gcc/java/parse.y:13648 #, c-format msgid "Invalid argument `%s' for `instanceof'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:13675 +#: ../../gcc-cvs/gcc/java/parse.y:13675 #, c-format msgid "Impossible for `%s' to be instance of `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:13804 +#: ../../gcc-cvs/gcc/java/parse.y:13804 #, c-format msgid "Incompatible type for `%s'. Can't convert `%s' to `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:14285 +#: ../../gcc-cvs/gcc/java/parse.y:14285 #, c-format msgid "Invalid argument type `%s' to `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:14515 +#: ../../gcc-cvs/gcc/java/parse.y:14515 #, c-format msgid "Invalid cast from `%s' to `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:14562 +#: ../../gcc-cvs/gcc/java/parse.y:14562 #, c-format msgid "`[]' can only be applied to arrays. It can't be applied to `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:14575 +#: ../../gcc-cvs/gcc/java/parse.y:14575 #, c-format msgid "" "Incompatible type for `[]'. Explicit cast needed to convert `%s' to `int'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:14579 +#: ../../gcc-cvs/gcc/java/parse.y:14579 #, c-format msgid "Incompatible type for `[]'. Can't convert `%s' to `int'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:14650 +#: ../../gcc-cvs/gcc/java/parse.y:14650 #, c-format msgid "" "Incompatible type for dimension in array creation expression. %s convert `%" "s' to `int'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:14766 +#: ../../gcc-cvs/gcc/java/parse.y:14766 #, c-format msgid "Invalid array initializer for non-array type `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:14853 +#: ../../gcc-cvs/gcc/java/parse.y:14853 #, c-format msgid "Incompatible type for array. %s convert `%s' to `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:14922 +#: ../../gcc-cvs/gcc/java/parse.y:14922 msgid "`return' inside instance initializer" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:14926 +#: ../../gcc-cvs/gcc/java/parse.y:14926 msgid "`return' inside static initializer" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:14932 +#: ../../gcc-cvs/gcc/java/parse.y:14932 #, c-format msgid "`return' with%s value from `%s %s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:14939 +#: ../../gcc-cvs/gcc/java/parse.y:14939 #, c-format msgid "`return' with value from constructor `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15004 +#: ../../gcc-cvs/gcc/java/parse.y:15004 #, c-format msgid "Incompatible type for `if'. Can't convert `%s' to `boolean'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15037 +#: ../../gcc-cvs/gcc/java/parse.y:15037 #, c-format msgid "Declaration of `%s' shadows a previous label declaration" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15042 +#: ../../gcc-cvs/gcc/java/parse.y:15042 #, c-format msgid "This is the location of the previous declaration of label `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15290 +#: ../../gcc-cvs/gcc/java/parse.y:15290 #, c-format msgid "No label definition found for `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15303 +#: ../../gcc-cvs/gcc/java/parse.y:15303 msgid "`continue' must be in loop" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15306 +#: ../../gcc-cvs/gcc/java/parse.y:15306 #, c-format msgid "continue label `%s' does not name a loop" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15327 +#: ../../gcc-cvs/gcc/java/parse.y:15327 msgid "`break' must be in loop or switch" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15368 +#: ../../gcc-cvs/gcc/java/parse.y:15368 #, c-format msgid "Incompatible type for loop conditional. Can't convert `%s' to `boolean'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15406 +#: ../../gcc-cvs/gcc/java/parse.y:15406 #, c-format msgid "Incompatible type for `switch'. Can't convert `%s' to `int'" msgstr "" #. The case_label_list is in reverse order, so print the #. outer label first. -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15437 +#: ../../gcc-cvs/gcc/java/parse.y:15437 msgid "duplicate case label: `" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15441 +#: ../../gcc-cvs/gcc/java/parse.y:15441 msgid "original label is here" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15658 +#: ../../gcc-cvs/gcc/java/parse.y:15658 #, c-format msgid "" "Can't catch class `%s'. Catch clause parameter type must be a subclass of " "class `java.lang.Throwable'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15682 +#: ../../gcc-cvs/gcc/java/parse.y:15682 #, c-format msgid "`catch' not reached because of the catch clause at line %d" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15749 +#: ../../gcc-cvs/gcc/java/parse.y:15749 #, c-format msgid "" "Incompatible type for `synchronized'. Can't convert `%s' to `java.lang." "Object'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15808 +#: ../../gcc-cvs/gcc/java/parse.y:15808 #, c-format msgid "Can't throw `%s'; it must be a subclass of class `java.lang.Throwable'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15837 +#: ../../gcc-cvs/gcc/java/parse.y:15837 #, c-format msgid "" "Checked exception `%s' can't be thrown in instance initializer (not all " "declared constructor are declaring it in their `throws' clause)" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15858 +#: ../../gcc-cvs/gcc/java/parse.y:15858 #, c-format msgid "" "Checked exception `%s' can't be caught by any of the catch clause(s) of the " "surrounding `try' block" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15871 +#: ../../gcc-cvs/gcc/java/parse.y:15871 #, c-format msgid "Checked exception `%s' can't be thrown in initializer" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15875 +#: ../../gcc-cvs/gcc/java/parse.y:15875 #, c-format msgid "Checked exception `%s' isn't thrown from a `try' block" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15881 +#: ../../gcc-cvs/gcc/java/parse.y:15881 #, c-format msgid "" "Checked exception `%s' doesn't match any of current method's `throws' " "declaration(s)" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15936 +#: ../../gcc-cvs/gcc/java/parse.y:15936 #, c-format msgid "Exception `%s' can't be thrown in initializer" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:15941 +#: ../../gcc-cvs/gcc/java/parse.y:15941 #, c-format msgid "" "Exception `%s' must be caught, or it must be declared in the `throws' clause " "of `%s'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:16052 +#: ../../gcc-cvs/gcc/java/parse.y:16052 #, c-format msgid "Incompatible type for `?:'. Can't convert `%s' to `boolean'" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/gcc/java/parse.y:16120 +#: ../../gcc-cvs/gcc/java/parse.y:16120 #, c-format msgid "Incompatible type for `?:'. Can't convert `%s' to `%s'" msgstr "" @@ -19524,1693 +19577,1804 @@ msgstr "" msgid "Address of register variable %qD requested." msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:934 +#: /home/jsm28/src/gcc-build/gcc/options.c:935 msgid "Display this information" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:940 +#: /home/jsm28/src/gcc-build/gcc/options.c:941 msgid "" "--param <param>=<value>\tSet paramter <param> to value. See below for a " "complete list of parameters" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:949 +#: /home/jsm28/src/gcc-build/gcc/options.c:950 msgid "" "-A<question>=<answer>\tAssert the <answer> to <question>. Putting '-' " "before <question> disables the <answer> to <question>" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:952 +#: /home/jsm28/src/gcc-build/gcc/options.c:953 msgid "Do not discard comments" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:955 +#: /home/jsm28/src/gcc-build/gcc/options.c:956 msgid "Do not discard comments in macro expansions" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:958 +#: /home/jsm28/src/gcc-build/gcc/options.c:959 msgid "" "-D<macro>[=<val>]\tDefine a <macro> with <val> as its value. If just " "<macro> is given, <val> is taken to be 1" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:964 +#: /home/jsm28/src/gcc-build/gcc/options.c:965 msgid "-F <dir>\tAdd <dir> to the end of the main framework include path " msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:967 +#: /home/jsm28/src/gcc-build/gcc/options.c:968 msgid "" "-G<number>\tPut global and static data smaller than <number> bytes into a " "special section (on some targets)" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:970 +#: /home/jsm28/src/gcc-build/gcc/options.c:971 msgid "Print the name of header files as they are used" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:979 +#: /home/jsm28/src/gcc-build/gcc/options.c:977 +msgid "-J<directory>\tPut MODULE files in 'directory'" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:983 msgid "Generate make dependencies and compile" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:988 +#: /home/jsm28/src/gcc-build/gcc/options.c:992 msgid "Treat missing header files as generated files" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:994 +#: /home/jsm28/src/gcc-build/gcc/options.c:998 msgid "Like -MD but ignore system header files" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1003 +#: /home/jsm28/src/gcc-build/gcc/options.c:1007 msgid "-MQ <target>\tAdd a MAKE-quoted target" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1009 +#: /home/jsm28/src/gcc-build/gcc/options.c:1013 msgid "-O<number>\tSet optimization level to <number>" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1012 +#: /home/jsm28/src/gcc-build/gcc/options.c:1016 msgid "Optimize for space rather than speed" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1015 +#: /home/jsm28/src/gcc-build/gcc/options.c:1019 msgid "Do not generate #line directives" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1018 +#: /home/jsm28/src/gcc-build/gcc/options.c:1022 msgid "-U<macro>\tUndefine <macro>" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1021 +#: /home/jsm28/src/gcc-build/gcc/options.c:1025 msgid "This switch is deprecated; use -Wextra instead" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1024 +#: /home/jsm28/src/gcc-build/gcc/options.c:1028 msgid "" "Warn about things that will change when compiling with an ABI-compliant " "compiler" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1027 +#: /home/jsm28/src/gcc-build/gcc/options.c:1031 msgid "Warn about returning structures, unions or arrays" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1033 +#: /home/jsm28/src/gcc-build/gcc/options.c:1034 +msgid "Warn about possible aliasing of dummy arguments" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1040 msgid "Warn about casting functions to incompatible types" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1036 +#: /home/jsm28/src/gcc-build/gcc/options.c:1043 msgid "Warn about pointer casts which increase alignment" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1039 +#: /home/jsm28/src/gcc-build/gcc/options.c:1046 msgid "Warn about casts which discard qualifiers" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1042 +#: /home/jsm28/src/gcc-build/gcc/options.c:1049 msgid "Warn about subscripts whose type is \"char\"" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1045 +#: /home/jsm28/src/gcc-build/gcc/options.c:1052 msgid "" "Warn about possibly nested block comments, and C++ comments spanning more " "than one physical line" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1048 +#: /home/jsm28/src/gcc-build/gcc/options.c:1055 msgid "Synonym for -Wcomment" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1051 -msgid "Warn about possibly confusing type conversions" +#: /home/jsm28/src/gcc-build/gcc/options.c:1058 +msgid "Warn about implicit conversion" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1054 +#: /home/jsm28/src/gcc-build/gcc/options.c:1061 msgid "Warn when all constructors and destructors are private" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1057 +#: /home/jsm28/src/gcc-build/gcc/options.c:1064 msgid "Warn when a declaration is found after a statement" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1060 +#: /home/jsm28/src/gcc-build/gcc/options.c:1067 msgid "Warn if a deprecated compiler feature, class, method, or field is used" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1063 +#: /home/jsm28/src/gcc-build/gcc/options.c:1070 msgid "Warn about uses of __attribute__((deprecated)) declarations" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1066 +#: /home/jsm28/src/gcc-build/gcc/options.c:1073 msgid "Warn when an optimization pass is disabled" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1069 +#: /home/jsm28/src/gcc-build/gcc/options.c:1076 msgid "Warn about compile-time integer division by zero" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1072 +#: /home/jsm28/src/gcc-build/gcc/options.c:1079 msgid "Warn about violations of Effective C++ style rules" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1075 +#: /home/jsm28/src/gcc-build/gcc/options.c:1082 msgid "Warn about stray tokens after #elif and #endif" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1078 +#: /home/jsm28/src/gcc-build/gcc/options.c:1085 msgid "Treat all warnings as errors" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1081 +#: /home/jsm28/src/gcc-build/gcc/options.c:1088 msgid "Make implicit function declarations an error" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1084 +#: /home/jsm28/src/gcc-build/gcc/options.c:1091 msgid "Print extra (possibly unwanted) warnings" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1087 +#: /home/jsm28/src/gcc-build/gcc/options.c:1094 msgid "Warn if deprecated empty statements are found" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1090 +#: /home/jsm28/src/gcc-build/gcc/options.c:1097 msgid "Exit on the first error occurred" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1093 +#: /home/jsm28/src/gcc-build/gcc/options.c:1100 msgid "Warn if testing floating point numbers for equality" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1096 +#: /home/jsm28/src/gcc-build/gcc/options.c:1103 msgid "Warn about printf/scanf/strftime/strfmon format string anomalies" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1099 +#: /home/jsm28/src/gcc-build/gcc/options.c:1106 msgid "Warn if passing too many arguments to a function for its format string" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1102 +#: /home/jsm28/src/gcc-build/gcc/options.c:1109 msgid "Warn about format strings that are not literals" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1105 +#: /home/jsm28/src/gcc-build/gcc/options.c:1112 msgid "Warn about possible security problems with format functions" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1108 +#: /home/jsm28/src/gcc-build/gcc/options.c:1115 msgid "Warn about strftime formats yielding 2-digit years" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1111 +#: /home/jsm28/src/gcc-build/gcc/options.c:1118 msgid "Warn about zero-length formats" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1120 +#: /home/jsm28/src/gcc-build/gcc/options.c:1127 msgid "Warn about implicit function declarations" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1123 +#: /home/jsm28/src/gcc-build/gcc/options.c:1130 msgid "Warn when a declaration does not specify a type" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1126 +#: /home/jsm28/src/gcc-build/gcc/options.c:1133 +msgid "Warn about calls with implicit interface" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1136 msgid "Deprecated. This switch has no effect." msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1129 +#: /home/jsm28/src/gcc-build/gcc/options.c:1139 msgid "Warn about variables which are initialized to themselves." msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1132 +#: /home/jsm28/src/gcc-build/gcc/options.c:1142 msgid "Warn when an inlined function cannot be inlined" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1135 +#: /home/jsm28/src/gcc-build/gcc/options.c:1145 msgid "Warn about invalid uses of the \"offsetof\" macro" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1138 +#: /home/jsm28/src/gcc-build/gcc/options.c:1148 msgid "Warn about PCH files that are found but not used" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1141 +#: /home/jsm28/src/gcc-build/gcc/options.c:1151 msgid "-Wlarger-than-<number>\tWarn if an object is larger than <number> bytes" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1144 +#: /home/jsm28/src/gcc-build/gcc/options.c:1154 +msgid "Warn about truncated source lines" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1157 msgid "Do not warn about using \"long long\" when -pedantic" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1147 +#: /home/jsm28/src/gcc-build/gcc/options.c:1160 msgid "Warn about suspicious declarations of \"main\"" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1150 +#: /home/jsm28/src/gcc-build/gcc/options.c:1163 msgid "Warn about possibly missing braces around initializers" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1153 +#: /home/jsm28/src/gcc-build/gcc/options.c:1166 msgid "Warn about global functions without previous declarations" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1156 +#: /home/jsm28/src/gcc-build/gcc/options.c:1169 msgid "Warn about missing fields in struct initializers" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1159 +#: /home/jsm28/src/gcc-build/gcc/options.c:1172 msgid "Warn about functions which might be candidates for format attributes" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1162 +#: /home/jsm28/src/gcc-build/gcc/options.c:1175 msgid "Warn about user-specified include directories that do not exist" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1165 +#: /home/jsm28/src/gcc-build/gcc/options.c:1178 msgid "" "Warn about functions which might be candidates for __attribute__((noreturn))" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1168 +#: /home/jsm28/src/gcc-build/gcc/options.c:1181 msgid "Warn about global functions without prototypes" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1171 +#: /home/jsm28/src/gcc-build/gcc/options.c:1184 msgid "Warn about use of multi-character character constants" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1174 +#: /home/jsm28/src/gcc-build/gcc/options.c:1187 msgid "Warn about \"extern\" declarations not at file scope" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1177 +#: /home/jsm28/src/gcc-build/gcc/options.c:1190 msgid "" "Warn when non-templatized friend functions are declared within a template" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1180 +#: /home/jsm28/src/gcc-build/gcc/options.c:1193 msgid "Warn about non-virtual destructors" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1183 +#: /home/jsm28/src/gcc-build/gcc/options.c:1196 msgid "" "Warn about NULL being passed to argument slots marked as requiring non-NULL" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1186 +#: /home/jsm28/src/gcc-build/gcc/options.c:1199 msgid "Warn if a C-style cast is used in a program" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1189 +#: /home/jsm28/src/gcc-build/gcc/options.c:1202 msgid "Warn if an old-style parameter definition is used" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1192 +#: /home/jsm28/src/gcc-build/gcc/options.c:1205 msgid "Warn if .class files are out of date" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1195 +#: /home/jsm28/src/gcc-build/gcc/options.c:1208 msgid "Warn about overloaded virtual function names" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1198 +#: /home/jsm28/src/gcc-build/gcc/options.c:1211 msgid "Warn when the packed attribute has no effect on struct layout" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1201 +#: /home/jsm28/src/gcc-build/gcc/options.c:1214 msgid "Warn when padding is required to align structure members" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1204 +#: /home/jsm28/src/gcc-build/gcc/options.c:1217 msgid "Warn about possibly missing parentheses" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1207 +#: /home/jsm28/src/gcc-build/gcc/options.c:1220 msgid "Warn when converting the type of pointers to member functions" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1210 +#: /home/jsm28/src/gcc-build/gcc/options.c:1223 msgid "Warn about function pointer arithmetic" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1213 +#: /home/jsm28/src/gcc-build/gcc/options.c:1226 msgid "Warn if inherited methods are unimplemented" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1216 +#: /home/jsm28/src/gcc-build/gcc/options.c:1229 msgid "Warn about multiple declarations of the same object" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1219 +#: /home/jsm28/src/gcc-build/gcc/options.c:1232 msgid "Warn if modifiers are specified when not necessary" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1222 +#: /home/jsm28/src/gcc-build/gcc/options.c:1235 msgid "Warn when the compiler reorders code" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1225 +#: /home/jsm28/src/gcc-build/gcc/options.c:1238 msgid "" "Warn whenever a function's return type defaults to \"int\" (C), or about " "inconsistent return types (C++)" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1228 +#: /home/jsm28/src/gcc-build/gcc/options.c:1241 msgid "Warn if a selector has multiple methods" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1231 +#: /home/jsm28/src/gcc-build/gcc/options.c:1244 msgid "Warn about possible violations of sequence point rules" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1234 +#: /home/jsm28/src/gcc-build/gcc/options.c:1247 msgid "Warn when one local variable shadows another" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1237 +#: /home/jsm28/src/gcc-build/gcc/options.c:1250 msgid "Warn about signed-unsigned comparisons" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1240 +#: /home/jsm28/src/gcc-build/gcc/options.c:1253 msgid "Warn when overload promotes from unsigned to signed" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1243 -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1246 +#: /home/jsm28/src/gcc-build/gcc/options.c:1256 +#: /home/jsm28/src/gcc-build/gcc/options.c:1259 msgid "Warn about code which might break strict aliasing rules" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1249 +#: /home/jsm28/src/gcc-build/gcc/options.c:1262 msgid "Warn about unprototyped function declarations" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1252 +#: /home/jsm28/src/gcc-build/gcc/options.c:1265 +msgid "Warn about \"suspicious\" constructs" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1268 msgid "Warn about enumerated switches, with no default, missing a case" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1255 +#: /home/jsm28/src/gcc-build/gcc/options.c:1271 msgid "Warn about enumerated switches missing a \"default:\" statement" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1258 +#: /home/jsm28/src/gcc-build/gcc/options.c:1274 msgid "Warn about all enumerated switches missing a specific case" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1261 +#: /home/jsm28/src/gcc-build/gcc/options.c:1277 msgid "Warn when synthesis behavior differs from Cfront" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1264 +#: /home/jsm28/src/gcc-build/gcc/options.c:1280 msgid "Do not suppress warnings from system headers" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1267 +#: /home/jsm28/src/gcc-build/gcc/options.c:1283 msgid "Warn about features not present in traditional C" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1270 +#: /home/jsm28/src/gcc-build/gcc/options.c:1286 msgid "" "Warn if trigraphs are encountered that might affect the meaning of the " "program" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1273 +#: /home/jsm28/src/gcc-build/gcc/options.c:1289 msgid "Warn about @selector()s without previously declared methods" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1276 +#: /home/jsm28/src/gcc-build/gcc/options.c:1292 msgid "Warn if an undefined macro is used in an #if directive" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1279 +#: /home/jsm28/src/gcc-build/gcc/options.c:1295 +msgid "Warn about underflow of numerical constant expressions" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1298 msgid "Warn about uninitialized automatic variables" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1282 +#: /home/jsm28/src/gcc-build/gcc/options.c:1301 msgid "Warn about unrecognized pragmas" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1285 +#: /home/jsm28/src/gcc-build/gcc/options.c:1304 msgid "Warn about code that will never be executed" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1288 +#: /home/jsm28/src/gcc-build/gcc/options.c:1307 msgid "Enable all -Wunused- warnings" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1291 +#: /home/jsm28/src/gcc-build/gcc/options.c:1310 msgid "Warn when a function is unused" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1294 +#: /home/jsm28/src/gcc-build/gcc/options.c:1313 +#: /home/jsm28/src/gcc-build/gcc/options.c:1316 msgid "Warn when a label is unused" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1297 +#: /home/jsm28/src/gcc-build/gcc/options.c:1319 msgid "Warn about macros defined in the main file that are not used" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1300 +#: /home/jsm28/src/gcc-build/gcc/options.c:1322 msgid "Warn when a function parameter is unused" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1303 +#: /home/jsm28/src/gcc-build/gcc/options.c:1325 msgid "Warn when an expression value is unused" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1306 +#: /home/jsm28/src/gcc-build/gcc/options.c:1328 msgid "Warn when a variable is unused" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1309 +#: /home/jsm28/src/gcc-build/gcc/options.c:1331 msgid "Do not warn about using variadic macros when -pedantic" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1312 +#: /home/jsm28/src/gcc-build/gcc/options.c:1334 msgid "Give strings the type \"array of char\"" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1315 +#: /home/jsm28/src/gcc-build/gcc/options.c:1337 msgid "" "A synonym for -std=c89. In a future version of GCC it will become " "synonymous with -std=c99 instead" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1318 +#: /home/jsm28/src/gcc-build/gcc/options.c:1340 msgid "-aux-info <file>\tEmit declaration information into <file>" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1330 +#: /home/jsm28/src/gcc-build/gcc/options.c:1352 msgid "-d<letters>\tEnable dumps from specific passes of the compiler" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1333 +#: /home/jsm28/src/gcc-build/gcc/options.c:1355 +msgid "Set the default real and integer kinds to double precision" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1358 msgid "-dumpbase <file>\tSet the file basename to be used for dumps" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1336 +#: /home/jsm28/src/gcc-build/gcc/options.c:1361 msgid "--CLASSPATH\tDeprecated; use --classpath instead" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1339 +#: /home/jsm28/src/gcc-build/gcc/options.c:1364 msgid "Generate position-independent code if possible (large mode)" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1342 +#: /home/jsm28/src/gcc-build/gcc/options.c:1367 msgid "" "Generate position-independent code for executables if possible (large mode)" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1348 +#: /home/jsm28/src/gcc-build/gcc/options.c:1373 msgid "Enforce class member access control semantics" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1351 +#: /home/jsm28/src/gcc-build/gcc/options.c:1376 msgid "Align the start of functions" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1357 +#: /home/jsm28/src/gcc-build/gcc/options.c:1382 msgid "Align labels which are only reached by jumping" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1363 +#: /home/jsm28/src/gcc-build/gcc/options.c:1388 msgid "Align all labels" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1369 +#: /home/jsm28/src/gcc-build/gcc/options.c:1394 msgid "Align the start of loops" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1378 +#: /home/jsm28/src/gcc-build/gcc/options.c:1403 msgid "Change when template instances are emitted" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1381 +#: /home/jsm28/src/gcc-build/gcc/options.c:1406 msgid "Specify that arguments may alias each other and globals" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1384 +#: /home/jsm28/src/gcc-build/gcc/options.c:1409 msgid "Assume arguments may alias globals but not each other" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1387 +#: /home/jsm28/src/gcc-build/gcc/options.c:1412 msgid "Assume arguments alias neither each other nor globals" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1390 +#: /home/jsm28/src/gcc-build/gcc/options.c:1415 msgid "Recognize the \"asm\" keyword" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1393 +#: /home/jsm28/src/gcc-build/gcc/options.c:1418 msgid "Permit the use of the assert keyword" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1402 +#: /home/jsm28/src/gcc-build/gcc/options.c:1427 msgid "Generate unwind tables that are exact at each instruction boundary" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1405 +#: /home/jsm28/src/gcc-build/gcc/options.c:1430 msgid "--bootclasspath=<path>\tReplace system path" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1408 +#: /home/jsm28/src/gcc-build/gcc/options.c:1433 msgid "Generate code to check bounds before indexing arrays" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1411 +#: /home/jsm28/src/gcc-build/gcc/options.c:1436 msgid "Replace add, compare, branch with branch on count register" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1414 +#: /home/jsm28/src/gcc-build/gcc/options.c:1439 msgid "Use profiling information for branch probabilities" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1417 +#: /home/jsm28/src/gcc-build/gcc/options.c:1442 msgid "" "Perform branch target load optimization before prologue / epilogue threading" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1420 +#: /home/jsm28/src/gcc-build/gcc/options.c:1445 msgid "" "Perform branch target load optimization after prologue / epilogue threading" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1423 +#: /home/jsm28/src/gcc-build/gcc/options.c:1448 msgid "" "Restrict target load migration not to re-use registers in any basic block" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1426 +#: /home/jsm28/src/gcc-build/gcc/options.c:1451 msgid "Recognize built-in functions" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1432 +#: /home/jsm28/src/gcc-build/gcc/options.c:1457 msgid "" "-fcall-saved-<register>\tMark <register> as being preserved across functions" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1435 +#: /home/jsm28/src/gcc-build/gcc/options.c:1460 msgid "" "-fcall-used-<register>\tMark <register> as being corrupted by function calls" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1438 +#: /home/jsm28/src/gcc-build/gcc/options.c:1463 msgid "Save registers around function calls" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1441 +#: /home/jsm28/src/gcc-build/gcc/options.c:1466 msgid "Check the return value of new" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1444 +#: /home/jsm28/src/gcc-build/gcc/options.c:1469 msgid "Generate checks for references to NULL" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1447 +#: /home/jsm28/src/gcc-build/gcc/options.c:1472 msgid "--classpath=<path>\tSet class path" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1450 +#: /home/jsm28/src/gcc-build/gcc/options.c:1475 msgid "Do not put uninitialized globals in the common section" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1456 +#: /home/jsm28/src/gcc-build/gcc/options.c:1481 msgid "Allow the arguments of the '?' operator to have different types" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1459 +#: /home/jsm28/src/gcc-build/gcc/options.c:1484 msgid "Reduce the size of object files" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1462 +#: /home/jsm28/src/gcc-build/gcc/options.c:1487 msgid "Make string literals \"const char[]\" not \"char[]\"" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1465 +#: /home/jsm28/src/gcc-build/gcc/options.c:1490 msgid "-fconst-string-class=<name>\tUse class <name> for constant strings" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1468 +#: /home/jsm28/src/gcc-build/gcc/options.c:1493 msgid "Perform a register copy-propagation optimization pass" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1471 +#: /home/jsm28/src/gcc-build/gcc/options.c:1496 msgid "Perform cross-jumping optimization" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1474 +#: /home/jsm28/src/gcc-build/gcc/options.c:1499 msgid "When running CSE, follow jumps to their targets" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1477 +#: /home/jsm28/src/gcc-build/gcc/options.c:1502 msgid "When running CSE, follow conditional jumps" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1480 +#: /home/jsm28/src/gcc-build/gcc/options.c:1505 msgid "Place data items into their own section" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1483 +#: /home/jsm28/src/gcc-build/gcc/options.c:1508 msgid "Inline member functions by default" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1486 +#: /home/jsm28/src/gcc-build/gcc/options.c:1511 msgid "Defer popping functions args from stack until later" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1489 +#: /home/jsm28/src/gcc-build/gcc/options.c:1514 msgid "Attempt to fill delay slots of branch instructions" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1492 +#: /home/jsm28/src/gcc-build/gcc/options.c:1517 msgid "Delete useless null pointer checks" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1495 +#: /home/jsm28/src/gcc-build/gcc/options.c:1520 msgid "" "-fdiagnostics-show-location=[once|every-line]\tHow often to emit source " "location at the beginning of line-wrapped diagnostics" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1504 +#: /home/jsm28/src/gcc-build/gcc/options.c:1529 +msgid "Allow dollar signs in entity names" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1532 msgid "Permit '$' as an identifier character" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1507 +#: /home/jsm28/src/gcc-build/gcc/options.c:1535 msgid "-fdump-<type>\tDump various compiler internals to a file" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1510 +#: /home/jsm28/src/gcc-build/gcc/options.c:1538 +msgid "Display the code tree after parsing." +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1541 msgid "" "Suppress output of instruction numbers and line number notes in debugging " "dumps" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1516 +#: /home/jsm28/src/gcc-build/gcc/options.c:1547 msgid "Perform DWARF2 duplicate elimination" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1519 -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1522 +#: /home/jsm28/src/gcc-build/gcc/options.c:1550 +#: /home/jsm28/src/gcc-build/gcc/options.c:1553 msgid "Perform unused type elimination in debug info" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1525 +#: /home/jsm28/src/gcc-build/gcc/options.c:1556 msgid "Output a class file" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1528 +#: /home/jsm28/src/gcc-build/gcc/options.c:1559 msgid "Alias for -femit-class-file" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1537 +#: /home/jsm28/src/gcc-build/gcc/options.c:1568 msgid "" "--encoding=<encoding>\tChoose input encoding (defaults from your locale)" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1540 +#: /home/jsm28/src/gcc-build/gcc/options.c:1571 msgid "Generate code to check exception specifications" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1546 +#: /home/jsm28/src/gcc-build/gcc/options.c:1577 msgid "Enable exception handling" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1549 +#: /home/jsm28/src/gcc-build/gcc/options.c:1580 msgid "" "-fexec-charset=<cset>\tConvert all strings and character constants to " "character set <cset>" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1552 +#: /home/jsm28/src/gcc-build/gcc/options.c:1583 msgid "Perform a number of minor, expensive optimizations" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1564 +#: /home/jsm28/src/gcc-build/gcc/options.c:1595 msgid "Input file is a file with a list of filenames to compile" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1567 +#: /home/jsm28/src/gcc-build/gcc/options.c:1598 msgid "Assume no NaNs or infinities are generated" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1570 +#: /home/jsm28/src/gcc-build/gcc/options.c:1601 msgid "" "-ffixed-<register>\tMark <register> as being unavailable to the compiler" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1579 +#: /home/jsm28/src/gcc-build/gcc/options.c:1604 +msgid "Assume that the source file is fixed form" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1607 +msgid "-ffixed-line-length-<n>\t\tUse n as character line width in fixed mode" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1610 +msgid "Allow arbitrary character line width in fixed mode" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1613 msgid "Don't allocate floats and doubles in extended-precision registers" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1582 +#: /home/jsm28/src/gcc-build/gcc/options.c:1616 msgid "Scope of for-init-statement variables is local to the loop" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1585 +#: /home/jsm28/src/gcc-build/gcc/options.c:1619 msgid "Copy memory address constants into registers before use" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1588 +#: /home/jsm28/src/gcc-build/gcc/options.c:1622 msgid "Always check for non gcj generated classes archives" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1591 +#: /home/jsm28/src/gcc-build/gcc/options.c:1625 msgid "Copy memory operands into registers before use" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1594 +#: /home/jsm28/src/gcc-build/gcc/options.c:1628 +msgid "Assume that the source file is free form" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1631 msgid "Do not assume that standard C libraries and \"main\" exist" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1597 +#: /home/jsm28/src/gcc-build/gcc/options.c:1634 msgid "Allow function addresses to be held in registers" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1600 +#: /home/jsm28/src/gcc-build/gcc/options.c:1637 msgid "Place each function into its own section" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1603 +#: /home/jsm28/src/gcc-build/gcc/options.c:1640 msgid "Perform global common subexpression elimination" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1606 +#: /home/jsm28/src/gcc-build/gcc/options.c:1643 msgid "" "Perform global common subexpression elimination after register allocation" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1609 +#: /home/jsm28/src/gcc-build/gcc/options.c:1646 msgid "" "Perform redundant load after store elimination in global common subexpression" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1612 +#: /home/jsm28/src/gcc-build/gcc/options.c:1649 msgid "" "Perform enhanced load motion during global common subexpression elimination" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1615 +#: /home/jsm28/src/gcc-build/gcc/options.c:1652 msgid "Perform store motion after global common subexpression elimination" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1618 +#: /home/jsm28/src/gcc-build/gcc/options.c:1655 msgid "Recognize GNU-defined keywords" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1621 +#: /home/jsm28/src/gcc-build/gcc/options.c:1658 msgid "Generate code for GNU runtime environment" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1624 +#: /home/jsm28/src/gcc-build/gcc/options.c:1661 msgid "Enable guessing of branch probabilities" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1633 +#: /home/jsm28/src/gcc-build/gcc/options.c:1670 msgid "" "Assume the runtime uses a hash table to map an object to its synchronization " "structure" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1639 +#: /home/jsm28/src/gcc-build/gcc/options.c:1676 msgid "Assume normal C execution environment" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1642 +#: /home/jsm28/src/gcc-build/gcc/options.c:1679 msgid "Enable support for huge objects" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1645 +#: /home/jsm28/src/gcc-build/gcc/options.c:1682 msgid "Process #ident directives" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1648 +#: /home/jsm28/src/gcc-build/gcc/options.c:1685 msgid "Perform conversion of conditional jumps to branchless equivalents" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1651 +#: /home/jsm28/src/gcc-build/gcc/options.c:1688 msgid "Perform conversion of conditional jumps to conditional execution" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1654 +#: /home/jsm28/src/gcc-build/gcc/options.c:1691 msgid "Export functions even if they can be inlined" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1657 +#: /home/jsm28/src/gcc-build/gcc/options.c:1694 msgid "Emit implicit instantiations of inline templates" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1660 +#: /home/jsm28/src/gcc-build/gcc/options.c:1697 +msgid "" +"Specify that no implicit typing is allowed, unless overridden by explicit " +"IMPLICIT statements" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1700 msgid "Emit implicit instantiations of templates" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1663 +#: /home/jsm28/src/gcc-build/gcc/options.c:1703 msgid "Use offset tables for virtual method calls" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1666 +#: /home/jsm28/src/gcc-build/gcc/options.c:1706 msgid "Do not generate .size directives" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1669 +#: /home/jsm28/src/gcc-build/gcc/options.c:1709 msgid "Pay attention to the \"inline\" keyword" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1678 +#: /home/jsm28/src/gcc-build/gcc/options.c:1718 msgid "" "-finline-limit=<number>\tLimit the size of inlined functions to <number>" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1681 +#: /home/jsm28/src/gcc-build/gcc/options.c:1721 msgid "" "-finput-charset=<cset> Specify the default character set for source " "files." msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1684 +#: /home/jsm28/src/gcc-build/gcc/options.c:1724 msgid "Instrument function entry and exit with profiling calls" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1687 +#: /home/jsm28/src/gcc-build/gcc/options.c:1727 msgid "Optimize induction variables on trees" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1690 +#: /home/jsm28/src/gcc-build/gcc/options.c:1730 msgid "Assume native functions are implemented using JNI" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1693 +#: /home/jsm28/src/gcc-build/gcc/options.c:1733 msgid "Generate code for functions even if they are fully inlined" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1696 +#: /home/jsm28/src/gcc-build/gcc/options.c:1736 msgid "Emit static const variables even if they are not used" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1702 +#: /home/jsm28/src/gcc-build/gcc/options.c:1742 msgid "Give external symbols a leading underscore" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1705 +#: /home/jsm28/src/gcc-build/gcc/options.c:1745 msgid "Perform loop optimizations" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1708 +#: /home/jsm28/src/gcc-build/gcc/options.c:1748 msgid "Perform loop optimizations using the new loop optimizer" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1711 +#: /home/jsm28/src/gcc-build/gcc/options.c:1751 msgid "Set errno after built-in math functions" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1714 +#: /home/jsm28/src/gcc-build/gcc/options.c:1754 +msgid "-fmax-identifier-length=<n>\tMaximum identifier length." +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1757 +msgid "" +"-fmax-stack-var-size=<n>\tSize in bytes of the largest array that will be " +"put on the stack" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1760 msgid "Report on permanent memory allocation" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1717 +#: /home/jsm28/src/gcc-build/gcc/options.c:1763 msgid "Attempt to merge identical constants and constant variables" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1720 +#: /home/jsm28/src/gcc-build/gcc/options.c:1766 msgid "Attempt to merge identical constants across compilation units" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1723 +#: /home/jsm28/src/gcc-build/gcc/options.c:1769 msgid "" "-fmessage-length=<number>\tLimit diagnostics to <number> characters per " "line. 0 suppresses line-wrapping" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1726 +#: /home/jsm28/src/gcc-build/gcc/options.c:1772 +msgid "Set default accessibility of module entities to PRIVATE" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1775 msgid "Perform SMS based modulo scheduling before the first scheduling pass" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1729 +#: /home/jsm28/src/gcc-build/gcc/options.c:1778 msgid "Move loop invariant computations out of loops" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1732 +#: /home/jsm28/src/gcc-build/gcc/options.c:1781 msgid "Don't warn about uses of Microsoft extensions" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1735 +#: /home/jsm28/src/gcc-build/gcc/options.c:1784 msgid "" "Add mudflap bounds-checking instrumentation for single-threaded program." msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1738 +#: /home/jsm28/src/gcc-build/gcc/options.c:1787 msgid "Ignore read operations when inserting mudflap instrumentation." msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1741 +#: /home/jsm28/src/gcc-build/gcc/options.c:1790 msgid "Add mudflap bounds-checking instrumentation for multi-threaded program." msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1750 +#: /home/jsm28/src/gcc-build/gcc/options.c:1799 msgid "Use graph-coloring register allocation" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1753 +#: /home/jsm28/src/gcc-build/gcc/options.c:1802 msgid "Generate code for NeXT (Apple Mac OS X) runtime environment" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1756 +#: /home/jsm28/src/gcc-build/gcc/options.c:1805 msgid "Assume that receivers of Objective-C messages may be nil" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1759 +#: /home/jsm28/src/gcc-build/gcc/options.c:1808 +msgid "Don't generate code, just do syntax and semantics checking" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1811 msgid "Support synchronous non-call exceptions" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1768 +#: /home/jsm28/src/gcc-build/gcc/options.c:1820 msgid "Enable Objective-C exception and synchronization syntax" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1771 +#: /home/jsm28/src/gcc-build/gcc/options.c:1823 msgid "Enable Objective-C setjmp exception handling runtime" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1774 +#: /home/jsm28/src/gcc-build/gcc/options.c:1826 msgid "When possible do not generate stack frames" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1777 +#: /home/jsm28/src/gcc-build/gcc/options.c:1829 msgid "Recognize C++ kewords like \"compl\" and \"xor\"" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1780 +#: /home/jsm28/src/gcc-build/gcc/options.c:1832 msgid "Do the full register move optimization pass" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1783 +#: /home/jsm28/src/gcc-build/gcc/options.c:1835 msgid "Optimize sibling and tail recursive calls" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1786 +#: /home/jsm28/src/gcc-build/gcc/options.c:1838 msgid "Enable optimization of static class initialization code" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1789 +#: /home/jsm28/src/gcc-build/gcc/options.c:1841 msgid "Enable optional diagnostics" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1795 +#: /home/jsm28/src/gcc-build/gcc/options.c:1847 +msgid "Try to layout derived types as compact as possible" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1850 msgid "Pack structure members together without holes" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1798 +#: /home/jsm28/src/gcc-build/gcc/options.c:1853 msgid "-fpack-struct=<number>\tSet initial maximum structure member alignment" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1801 +#: /home/jsm28/src/gcc-build/gcc/options.c:1856 msgid "Return small aggregates in memory, not registers" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1807 +#: /home/jsm28/src/gcc-build/gcc/options.c:1862 msgid "Look for and use PCH files even when preprocessing" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1810 +#: /home/jsm28/src/gcc-build/gcc/options.c:1865 msgid "Perform loop peeling" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1813 +#: /home/jsm28/src/gcc-build/gcc/options.c:1868 msgid "Enable machine specific peephole optimizations" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1816 +#: /home/jsm28/src/gcc-build/gcc/options.c:1871 msgid "Enable an RTL peephole pass before sched2" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1819 +#: /home/jsm28/src/gcc-build/gcc/options.c:1874 msgid "Downgrade conformance errors to warnings" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1822 +#: /home/jsm28/src/gcc-build/gcc/options.c:1877 msgid "Generate position-independent code if possible (small mode)" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1825 +#: /home/jsm28/src/gcc-build/gcc/options.c:1880 msgid "" "Generate position-independent code for executables if possible (small mode)" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1828 +#: /home/jsm28/src/gcc-build/gcc/options.c:1883 msgid "Generate prefetch instructions, if available, for arrays in loops" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1831 +#: /home/jsm28/src/gcc-build/gcc/options.c:1886 msgid "Treat the input file as already preprocessed" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1834 +#: /home/jsm28/src/gcc-build/gcc/options.c:1889 msgid "Enable basic program profiling code" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1837 +#: /home/jsm28/src/gcc-build/gcc/options.c:1892 msgid "Insert arc-based program profiling code" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1840 +#: /home/jsm28/src/gcc-build/gcc/options.c:1895 msgid "" "Enable common options for generating profile info for profile feedback " "directed optimizations" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1843 +#: /home/jsm28/src/gcc-build/gcc/options.c:1898 msgid "" "Enable common options for performing profile feedback directed optimizations" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1846 +#: /home/jsm28/src/gcc-build/gcc/options.c:1901 msgid "Insert code to profile values of expressions" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1852 +#: /home/jsm28/src/gcc-build/gcc/options.c:1907 msgid "-frandom-seed=<string>\tMake compile reproducible using <string>" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1855 +#: /home/jsm28/src/gcc-build/gcc/options.c:1910 msgid "Return small aggregates in registers" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1858 +#: /home/jsm28/src/gcc-build/gcc/options.c:1913 msgid "Enables a register move optimization" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1861 +#: /home/jsm28/src/gcc-build/gcc/options.c:1916 msgid "Perform a register renaming optimization pass" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1864 +#: /home/jsm28/src/gcc-build/gcc/options.c:1919 msgid "Reorder basic blocks to improve code placement" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1867 +#: /home/jsm28/src/gcc-build/gcc/options.c:1922 msgid "Reorder basic blocks and partition into hot and cold sections" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1870 +#: /home/jsm28/src/gcc-build/gcc/options.c:1925 msgid "Reorder functions to improve code placement" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1873 +#: /home/jsm28/src/gcc-build/gcc/options.c:1928 +msgid "Copy array sections into a contiguous block on procedure entry" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1931 msgid "" "Used in Fix-and-Continue mode to indicate that object files may be swapped " "in at runtime" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1876 +#: /home/jsm28/src/gcc-build/gcc/options.c:1934 msgid "Enable automatic template instantiation" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1879 +#: /home/jsm28/src/gcc-build/gcc/options.c:1937 msgid "Add a common subexpression elimination pass after loop optimizations" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1882 +#: /home/jsm28/src/gcc-build/gcc/options.c:1940 msgid "Run the loop optimizer twice" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1885 +#: /home/jsm28/src/gcc-build/gcc/options.c:1943 msgid "" "Enable/Disable the traditional scheduling in loops that already passed " "modulo scheduling" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1888 +#: /home/jsm28/src/gcc-build/gcc/options.c:1946 msgid "Disable optimizations that assume default FP rounding behavior" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1891 +#: /home/jsm28/src/gcc-build/gcc/options.c:1949 msgid "Generate run time type descriptor information" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1894 +#: /home/jsm28/src/gcc-build/gcc/options.c:1952 msgid "Enable scheduling across basic blocks" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1897 +#: /home/jsm28/src/gcc-build/gcc/options.c:1955 msgid "Allow speculative motion of non-loads" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1900 +#: /home/jsm28/src/gcc-build/gcc/options.c:1958 msgid "Allow speculative motion of some loads" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1903 +#: /home/jsm28/src/gcc-build/gcc/options.c:1961 msgid "Allow speculative motion of more loads" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1906 +#: /home/jsm28/src/gcc-build/gcc/options.c:1964 msgid "Allow premature scheduling of queued insns" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1909 +#: /home/jsm28/src/gcc-build/gcc/options.c:1967 msgid "" "Set dependence distance checking in premature scheduling of queued insns" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1912 +#: /home/jsm28/src/gcc-build/gcc/options.c:1970 msgid "" "-fsched-stalled-insns-dep=<number> Set dependence distance checking in " "premature scheduling of queued insns" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1915 +#: /home/jsm28/src/gcc-build/gcc/options.c:1973 msgid "" "-fsched-stalled-insns=<number> Set number of queued insns that can be " "prematurely scheduled" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1918 +#: /home/jsm28/src/gcc-build/gcc/options.c:1976 msgid "-fsched-verbose=<number>\tSet the verbosity level of the scheduler" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1921 +#: /home/jsm28/src/gcc-build/gcc/options.c:1979 msgid "If scheduling post reload, do superblock scheduling" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1924 +#: /home/jsm28/src/gcc-build/gcc/options.c:1982 msgid "If scheduling post reload, do trace scheduling" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1927 +#: /home/jsm28/src/gcc-build/gcc/options.c:1985 msgid "Reschedule instructions before register allocation" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1930 +#: /home/jsm28/src/gcc-build/gcc/options.c:1988 msgid "Reschedule instructions after register allocation" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1933 +#: /home/jsm28/src/gcc-build/gcc/options.c:1991 +msgid "Append a second underscore if the name already contains an underscore" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:1994 msgid "Mark data as shared rather than private" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1936 +#: /home/jsm28/src/gcc-build/gcc/options.c:1997 msgid "Use the same size for double as for float" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1939 +#: /home/jsm28/src/gcc-build/gcc/options.c:2000 msgid "Use the narrowest integer type possible for enumeration types" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1942 +#: /home/jsm28/src/gcc-build/gcc/options.c:2003 msgid "Force the underlying type for \"wchar_t\" to be \"unsigned short\"" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1948 +#: /home/jsm28/src/gcc-build/gcc/options.c:2009 msgid "Disable optimizations observable by IEEE signaling NaNs" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1951 +#: /home/jsm28/src/gcc-build/gcc/options.c:2012 msgid "When \"signed\" or \"unsigned\" is not given make the bitfield signed" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1954 +#: /home/jsm28/src/gcc-build/gcc/options.c:2015 msgid "Make \"char\" signed by default" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1957 +#: /home/jsm28/src/gcc-build/gcc/options.c:2018 msgid "Convert floating point constants to single precision constants" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1960 +#: /home/jsm28/src/gcc-build/gcc/options.c:2021 msgid "Use value profiling for speculative prefetching" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1963 +#: /home/jsm28/src/gcc-build/gcc/options.c:2024 msgid "Split lifetimes of induction variables when loops are unrolled." msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1969 +#: /home/jsm28/src/gcc-build/gcc/options.c:2030 msgid "Insert stack checking code into the program" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1975 +#: /home/jsm28/src/gcc-build/gcc/options.c:2036 msgid "" "-fstack-limit-register=<register>\tTrap if the stack goes past <register>" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1978 +#: /home/jsm28/src/gcc-build/gcc/options.c:2039 msgid "-fstack-limit-symbol=<name>\tTrap if the stack goes past symbol <name>" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1981 +#: /home/jsm28/src/gcc-build/gcc/options.c:2042 msgid "Display statistics accumulated during compilation" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1984 +#: /home/jsm28/src/gcc-build/gcc/options.c:2045 msgid "Enable assignability checks for stores into object arrays" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1987 +#: /home/jsm28/src/gcc-build/gcc/options.c:2048 msgid "Perform strength reduction optimizations" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1990 +#: /home/jsm28/src/gcc-build/gcc/options.c:2051 msgid "Assume strict aliasing rules apply" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1996 +#: /home/jsm28/src/gcc-build/gcc/options.c:2057 msgid "Check for syntax errors, then stop" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:1999 +#: /home/jsm28/src/gcc-build/gcc/options.c:2060 msgid "-ftabstop=<number>\tDistance between tab stops for column reporting" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2002 +#: /home/jsm28/src/gcc-build/gcc/options.c:2063 msgid "-ftemplate-depth-<number>\tSpecify maximum template instantiation depth" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2005 +#: /home/jsm28/src/gcc-build/gcc/options.c:2066 msgid "Create data files needed by \"gcov\"" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2011 +#: /home/jsm28/src/gcc-build/gcc/options.c:2072 msgid "Perform jump threading optimizations" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2014 +#: /home/jsm28/src/gcc-build/gcc/options.c:2075 msgid "" "-fno-threadsafe-statics\tDo not generate thread-safe code for initializing " "local statics." msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2017 +#: /home/jsm28/src/gcc-build/gcc/options.c:2078 msgid "Report the time taken by each compiler pass" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2020 +#: /home/jsm28/src/gcc-build/gcc/options.c:2081 msgid "" "-ftls-model=[global-dynamic|local-dynamic|initial-exec|local-exec]\tSet the " "default thread-local storage code generation model" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2023 +#: /home/jsm28/src/gcc-build/gcc/options.c:2084 msgid "Perform superblock formation via tail duplication" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2026 +#: /home/jsm28/src/gcc-build/gcc/options.c:2087 msgid "Assume floating-point operations can trap" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2029 +#: /home/jsm28/src/gcc-build/gcc/options.c:2090 msgid "Trap for signed overflow in addition, subtraction and multiplication" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2032 +#: /home/jsm28/src/gcc-build/gcc/options.c:2093 msgid "Use tree-ssa based implementation of profiling" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2035 +#: /home/jsm28/src/gcc-build/gcc/options.c:2096 msgid "Enable SSA-CCP optimization on trees" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2038 +#: /home/jsm28/src/gcc-build/gcc/options.c:2099 msgid "Enable loop header copying on trees" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2041 +#: /home/jsm28/src/gcc-build/gcc/options.c:2102 msgid "Coalesce memory temporaries in the SSA->normal pass" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2044 +#: /home/jsm28/src/gcc-build/gcc/options.c:2105 msgid "Replace SSA temporaries with better names in copies." msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2047 +#: /home/jsm28/src/gcc-build/gcc/options.c:2108 msgid "Enable SSA dead code elimination optimization on trees" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2050 +#: /home/jsm28/src/gcc-build/gcc/options.c:2111 msgid "Enable dominator optimizations" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2053 +#: /home/jsm28/src/gcc-build/gcc/options.c:2114 msgid "Enable dead store elimination" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2056 +#: /home/jsm28/src/gcc-build/gcc/options.c:2117 msgid "Enable Full Redundancy Elimination (FRE) on trees" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2059 +#: /home/jsm28/src/gcc-build/gcc/options.c:2120 msgid "Enable loop invariant motion on trees" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2062 +#: /home/jsm28/src/gcc-build/gcc/options.c:2123 msgid "Create canonical induction variables in loops" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2065 +#: /home/jsm28/src/gcc-build/gcc/options.c:2126 msgid "Enable linear loop transforms on trees" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2068 +#: /home/jsm28/src/gcc-build/gcc/options.c:2129 msgid "Enable loop optimizations on tree level" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2071 +#: /home/jsm28/src/gcc-build/gcc/options.c:2132 msgid "Perform live range splitting during the SSA->normal pass." msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2074 +#: /home/jsm28/src/gcc-build/gcc/options.c:2135 msgid "Enable SSA-PRE optimization on trees" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2077 +#: /home/jsm28/src/gcc-build/gcc/options.c:2138 msgid "Perform scalar replacement of aggregates" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2080 +#: /home/jsm28/src/gcc-build/gcc/options.c:2141 msgid "Replace temporary expressions in the SSA->normal pass" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2083 +#: /home/jsm28/src/gcc-build/gcc/options.c:2144 msgid "Enable loop vectorization on trees" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2086 +#: /home/jsm28/src/gcc-build/gcc/options.c:2147 +msgid "Append underscores to externally visible names" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:2150 msgid "Compile whole compilation unit at a time" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2089 +#: /home/jsm28/src/gcc-build/gcc/options.c:2153 msgid "Perform loop unrolling for all loops" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2092 +#: /home/jsm28/src/gcc-build/gcc/options.c:2156 msgid "Perform loop unrolling when iteration count is known" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2095 +#: /home/jsm28/src/gcc-build/gcc/options.c:2159 msgid "Allow math optimizations that may violate IEEE or ISO standards" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2098 +#: /home/jsm28/src/gcc-build/gcc/options.c:2162 msgid "When \"signed\" or \"unsigned\" is not given make the bitfield unsigned" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2101 +#: /home/jsm28/src/gcc-build/gcc/options.c:2165 msgid "Make \"char\" unsigned by default" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2104 +#: /home/jsm28/src/gcc-build/gcc/options.c:2168 msgid "Perform loop unswitching" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2107 +#: /home/jsm28/src/gcc-build/gcc/options.c:2171 msgid "Just generate unwind tables for exception handling" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2110 +#: /home/jsm28/src/gcc-build/gcc/options.c:2174 msgid "Generate code for the Boehm GC" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2113 +#: /home/jsm28/src/gcc-build/gcc/options.c:2177 msgid "Use __cxa_atexit to register destructors" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2116 +#: /home/jsm28/src/gcc-build/gcc/options.c:2180 msgid "Call a library routine to do integer divisions" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2119 +#: /home/jsm28/src/gcc-build/gcc/options.c:2183 msgid "Perform variable tracking" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2122 +#: /home/jsm28/src/gcc-build/gcc/options.c:2186 msgid "Add extra commentary to assembler output" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2125 +#: /home/jsm28/src/gcc-build/gcc/options.c:2189 msgid "Marks all inlined methods as having hidden visibility" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2128 +#: /home/jsm28/src/gcc-build/gcc/options.c:2192 msgid "" "-fvisibility=[default|internal|hidden|protected]\tSet the default symbol " "visibility" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2131 +#: /home/jsm28/src/gcc-build/gcc/options.c:2195 msgid "Use expression value profiles in optimizations" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2134 +#: /home/jsm28/src/gcc-build/gcc/options.c:2198 msgid "Discard unused virtual functions" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2137 +#: /home/jsm28/src/gcc-build/gcc/options.c:2201 msgid "Implement vtables using thunks" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2140 +#: /home/jsm28/src/gcc-build/gcc/options.c:2204 msgid "Emit common-like symbols as weak symbols" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2143 +#: /home/jsm28/src/gcc-build/gcc/options.c:2207 msgid "Construct webs and split unrelated uses of single variable" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2146 +#: /home/jsm28/src/gcc-build/gcc/options.c:2210 msgid "" "-fwide-exec-charset=<cset>\tConvert all wide strings and character constants " "to character set <cset>" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2149 +#: /home/jsm28/src/gcc-build/gcc/options.c:2213 msgid "Generate a #line directive pointing at the current working directory" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2152 +#: /home/jsm28/src/gcc-build/gcc/options.c:2216 msgid "Assume signed arithmetic overflow wraps around" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2155 +#: /home/jsm28/src/gcc-build/gcc/options.c:2219 msgid "Emit cross referencing information" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2158 +#: /home/jsm28/src/gcc-build/gcc/options.c:2222 msgid "Put zero initialized data in the bss section" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2161 +#: /home/jsm28/src/gcc-build/gcc/options.c:2225 msgid "" "Generate lazy class lookup (via objc_getClass()) for use in Zero-Link mode" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2164 +#: /home/jsm28/src/gcc-build/gcc/options.c:2228 msgid "Generate debug information in default format" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2167 +#: /home/jsm28/src/gcc-build/gcc/options.c:2231 msgid "Generate debug information in COFF format" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2170 +#: /home/jsm28/src/gcc-build/gcc/options.c:2234 msgid "Generate debug information in DWARF v2 format" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2173 +#: /home/jsm28/src/gcc-build/gcc/options.c:2237 msgid "Dump declarations to a .decl file" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2176 +#: /home/jsm28/src/gcc-build/gcc/options.c:2240 msgid "Generate debug information in default extended format" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2179 +#: /home/jsm28/src/gcc-build/gcc/options.c:2243 msgid "Generate debug information in STABS format" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2182 +#: /home/jsm28/src/gcc-build/gcc/options.c:2246 msgid "Generate debug information in extended STABS format" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2185 +#: /home/jsm28/src/gcc-build/gcc/options.c:2249 msgid "Generate debug information in VMS format" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2188 +#: /home/jsm28/src/gcc-build/gcc/options.c:2252 msgid "Generate debug information in XCOFF format" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2191 +#: /home/jsm28/src/gcc-build/gcc/options.c:2255 msgid "Generate debug information in extended XCOFF format" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2194 +#: /home/jsm28/src/gcc-build/gcc/options.c:2258 +msgid "Set the default integer kind to double precision" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:2261 msgid "-idirafter <dir>\tAdd <dir> to the end of the system include path" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2197 +#: /home/jsm28/src/gcc-build/gcc/options.c:2264 msgid "-imacros <file>\tAccept definition of macros in <file>" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2200 +#: /home/jsm28/src/gcc-build/gcc/options.c:2267 msgid "-include <file>\tInclude the contents of <file> before other files" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2203 +#: /home/jsm28/src/gcc-build/gcc/options.c:2270 msgid "-iprefix <path>\tSpecify <path> as a prefix for next two options" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2206 +#: /home/jsm28/src/gcc-build/gcc/options.c:2273 msgid "-iquote <dir>\tAdd <dir> to the end of the quote include path" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2209 +#: /home/jsm28/src/gcc-build/gcc/options.c:2276 msgid "-isysroot <dir>\tSet <dir> to be the system root directory" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2212 +#: /home/jsm28/src/gcc-build/gcc/options.c:2279 msgid "-isystem <dir>\tAdd <dir> to the start of the system include path" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2215 +#: /home/jsm28/src/gcc-build/gcc/options.c:2282 msgid "-iwithprefix <dir>\tAdd <dir> to the end of the system include path" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2218 +#: /home/jsm28/src/gcc-build/gcc/options.c:2285 msgid "-iwithprefixbefore <dir>\tAdd <dir> to the end of the main include path" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2230 +#: /home/jsm28/src/gcc-build/gcc/options.c:2297 msgid "" "Do not search standard system include directories (those specified with -" "isystem will still be used)" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2233 +#: /home/jsm28/src/gcc-build/gcc/options.c:2300 msgid "Do not search standard system include directories for C++" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2236 +#: /home/jsm28/src/gcc-build/gcc/options.c:2303 msgid "-o <file>\tPlace output into <file>" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2239 +#: /home/jsm28/src/gcc-build/gcc/options.c:2306 msgid "Enable function profiling" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2242 +#: /home/jsm28/src/gcc-build/gcc/options.c:2309 msgid "Issue warnings needed for strict compliance to the standard" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2245 +#: /home/jsm28/src/gcc-build/gcc/options.c:2312 msgid "Like -pedantic but issue them as errors" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2248 +#: /home/jsm28/src/gcc-build/gcc/options.c:2315 msgid "Generate C header of platform-specific features" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2251 +#: /home/jsm28/src/gcc-build/gcc/options.c:2318 +msgid "-qkind=<n>\tSet the kind for a real with the 'q' exponent to 'n'" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:2321 msgid "Do not display functions compiled or elapsed time" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2254 +#: /home/jsm28/src/gcc-build/gcc/options.c:2324 +msgid "Set the default real kind to double precision" +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:2327 msgid "Remap file names when including files" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2257 +#: /home/jsm28/src/gcc-build/gcc/options.c:2330 msgid "Conform to the ISO 1998 C++ standard" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2260 +#: /home/jsm28/src/gcc-build/gcc/options.c:2333 msgid "Conform to the ISO 1990 C standard" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2263 +#: /home/jsm28/src/gcc-build/gcc/options.c:2336 msgid "Conform to the ISO 1999 C standard" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2266 -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2287 -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2290 +#: /home/jsm28/src/gcc-build/gcc/options.c:2339 +#: /home/jsm28/src/gcc-build/gcc/options.c:2369 +#: /home/jsm28/src/gcc-build/gcc/options.c:2372 msgid "Deprecated in favor of -std=c99" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2269 +#: /home/jsm28/src/gcc-build/gcc/options.c:2342 +msgid "Conform to the ISO Fortran 2003 standard." +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:2345 +msgid "Conform to the ISO Fortran 95 standard." +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:2348 +msgid "Conform nothing in particular." +msgstr "" + +#: /home/jsm28/src/gcc-build/gcc/options.c:2351 msgid "Conform to the ISO 1998 C++ standard with GNU extensions" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2272 +#: /home/jsm28/src/gcc-build/gcc/options.c:2354 msgid "Conform to the ISO 1990 C standard with GNU extensions" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2275 +#: /home/jsm28/src/gcc-build/gcc/options.c:2357 msgid "Conform to the ISO 1999 C standard with GNU extensions" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2278 +#: /home/jsm28/src/gcc-build/gcc/options.c:2360 msgid "Deprecated in favor of -std=gnu99" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2281 +#: /home/jsm28/src/gcc-build/gcc/options.c:2363 msgid "Deprecated in favor of -std=c89" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2284 +#: /home/jsm28/src/gcc-build/gcc/options.c:2366 msgid "Conform to the ISO 1990 C standard as amended in 1994" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2293 +#: /home/jsm28/src/gcc-build/gcc/options.c:2375 msgid "Enable traditional preprocessing" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2296 +#: /home/jsm28/src/gcc-build/gcc/options.c:2378 msgid "-trigraphs\tSupport ISO C trigraphs" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2299 +#: /home/jsm28/src/gcc-build/gcc/options.c:2381 msgid "Do not predefine system-specific and GCC-specific macros" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2302 +#: /home/jsm28/src/gcc-build/gcc/options.c:2384 msgid "Enable verbose output" msgstr "" -#: /home/zack/src/gcc/HEAD/pos-diag/build-sirius/gcc/options.c:2308 +#: /home/jsm28/src/gcc-build/gcc/options.c:2390 msgid "Suppress warnings" msgstr "" -#: java/jvspec.c:80 gcc.c:796 ada/lang-specs.h:34 -msgid "-pg and -fomit-frame-pointer are incompatible" +#: config/mips/mips.h:1114 config/arc/arc.h:63 +msgid "may not use both -EB and -EL" msgstr "" -#: config/i386/cygwin.h:29 -msgid "mno-cygwin and mno-win32 are not compatible" +#: config/mips/r3900.h:35 +msgid "-mhard-float not supported" msgstr "" -#: config/i386/cygwin.h:70 config/i386/mingw32.h:58 -msgid "shared and mdll are not compatible" +#: config/mips/r3900.h:37 +msgid "-msingle-float and -msoft-float cannot both be specified" msgstr "" #: config/sh/sh.h:685 msgid "SH2a does not support little-endian" msgstr "" -#: config/sparc/linux64.h:207 config/sparc/linux64.h:218 -#: config/sparc/netbsd-elf.h:136 config/sparc/netbsd-elf.h:155 -#: config/sparc/sol2-bi.h:195 config/sparc/sol2-bi.h:205 -msgid "may not use both -m32 and -m64" -msgstr "" - -#: config/i386/sco5.h:189 -msgid "-pg not supported on this platform" +#: java/lang-specs.h:34 +msgid "-fjni and -femit-class-files are incompatible" msgstr "" -#: config/i386/sco5.h:190 -msgid "-p and -pp specified - pick one" +#: java/lang-specs.h:35 +msgid "-fjni and -femit-class-file are incompatible" msgstr "" -#: config/i386/sco5.h:264 -msgid "-G and -static are mutually exclusive" +#: java/lang-specs.h:36 java/lang-specs.h:37 +msgid "-femit-class-file should used along with -fsyntax-only" msgstr "" -#: config/vax/vax.h:50 config/vax/vax.h:51 -msgid "profiling not supported with -mg\n" +#: config/i386/mingw32.h:58 config/i386/cygwin.h:70 +msgid "shared and mdll are not compatible" msgstr "" #: config/darwin.h:248 @@ -21249,79 +21413,85 @@ msgstr "" msgid "-private_bundle not allowed with -dynamiclib" msgstr "" -#: config/lynx.h:71 -msgid "Cannot use mthreads and mlegacy-threads together." +#: config/arm/arm.h:151 +msgid "-msoft-float and -mhard_float may not be used together" msgstr "" -#: config/lynx.h:96 -msgid "Cannot use mshared and static together." +#: config/arm/arm.h:153 +msgid "-mbig-endian and -mlittle-endian may not be used together" msgstr "" -#: config/mcore/mcore.h:57 -msgid "the m210 does not have little endian support" +#: config/vax/netbsd-elf.h:42 +msgid "The -shared option is not currently supported for VAX ELF." msgstr "" -#: config/arm/arm.h:151 -msgid "-msoft-float and -mhard_float may not be used together" +#: config/i386/nwld.h:34 +msgid "Static linking is not supported.\n" msgstr "" -#: config/arm/arm.h:153 -msgid "-mbig-endian and -mlittle-endian may not be used together" +#: config/sparc/linux64.h:207 config/sparc/linux64.h:218 +#: config/sparc/netbsd-elf.h:136 config/sparc/netbsd-elf.h:155 +#: config/sparc/sol2-bi.h:195 config/sparc/sol2-bi.h:205 +msgid "may not use both -m32 and -m64" msgstr "" -#: gcc.c:769 -msgid "GCC does not support -C or -CC without -E" +#: treelang/lang-specs.h:52 +msgid "-pg or -p and -fomit-frame-pointer are incompatible" msgstr "" -#: gcc.c:963 -msgid "-E required when input is from standard input" +#: java/jvspec.c:80 ada/lang-specs.h:34 gcc.c:796 +msgid "-pg and -fomit-frame-pointer are incompatible" +msgstr "" + +#: config/vax/vax.h:50 config/vax/vax.h:51 +msgid "profiling not supported with -mg\n" msgstr "" #: ada/lang-specs.h:35 msgid "-c or -S required for Ada" msgstr "" -#: config/rs6000/darwin.h:132 -msgid " conflicting code gen style switches are used" +#: config/i386/sco5.h:189 +msgid "-pg not supported on this platform" msgstr "" -#: config/i386/nwld.h:34 -msgid "Static linking is not supported.\n" +#: config/i386/sco5.h:190 +msgid "-p and -pp specified - pick one" msgstr "" -#: config/sparc/sol2-bi.h:167 config/sparc/sol2-bi.h:172 -#: config/sparc/sol2-gld-bi.h:17 config/sparc/sol2-gld-bi.h:22 -msgid "does not support multilib" +#: config/i386/sco5.h:264 +msgid "-G and -static are mutually exclusive" msgstr "" -#: config/vax/netbsd-elf.h:42 -msgid "The -shared option is not currently supported for VAX ELF." +#: config/i386/cygwin.h:29 +msgid "mno-cygwin and mno-win32 are not compatible" msgstr "" -#: java/lang-specs.h:34 -msgid "-fjni and -femit-class-files are incompatible" +#: config/mcore/mcore.h:57 +msgid "the m210 does not have little endian support" msgstr "" -#: java/lang-specs.h:35 -msgid "-fjni and -femit-class-file are incompatible" +#: gcc.c:769 +msgid "GCC does not support -C or -CC without -E" msgstr "" -#: java/lang-specs.h:36 java/lang-specs.h:37 -msgid "-femit-class-file should used along with -fsyntax-only" +#: gcc.c:963 +msgid "-E required when input is from standard input" msgstr "" -#: config/arc/arc.h:63 config/mips/mips.h:1114 -msgid "may not use both -EB and -EL" +#: config/lynx.h:71 +msgid "Cannot use mthreads and mlegacy-threads together." msgstr "" -#: treelang/lang-specs.h:52 -msgid "-pg or -p and -fomit-frame-pointer are incompatible" +#: config/lynx.h:96 +msgid "Cannot use mshared and static together." msgstr "" -#: config/mips/r3900.h:35 -msgid "-mhard-float not supported" +#: config/sparc/sol2-bi.h:167 config/sparc/sol2-bi.h:172 +#: config/sparc/sol2-gld-bi.h:17 config/sparc/sol2-gld-bi.h:22 +msgid "does not support multilib" msgstr "" -#: config/mips/r3900.h:37 -msgid "-msingle-float and -msoft-float cannot both be specified" +#: config/rs6000/darwin.h:132 +msgid " conflicting code gen style switches are used" msgstr "" diff --git a/gcc/predict.c b/gcc/predict.c index 8611f30d8aa..f2cd8bd8d25 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -1010,7 +1010,7 @@ strip_builtin_expect (void) && TREE_CHAIN (arglist)) { TREE_OPERAND (stmt, 1) = TREE_VALUE (arglist); - modify_stmt (stmt); + update_stmt (stmt); } } } diff --git a/gcc/rtl.h b/gcc/rtl.h index ac2419b41e2..e0f86ee1c3d 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -1432,6 +1432,10 @@ extern void push_to_full_sequence (rtx, rtx); extern rtx immed_double_const (HOST_WIDE_INT, HOST_WIDE_INT, enum machine_mode); +/* In loop-iv.c */ + +extern rtx lowpart_subreg (enum machine_mode, rtx, enum machine_mode); + /* In varasm.c */ extern rtx force_const_mem (enum machine_mode, rtx); diff --git a/gcc/system.h b/gcc/system.h index 19eabd39563..bdfe2953f24 100644 --- a/gcc/system.h +++ b/gcc/system.h @@ -653,7 +653,7 @@ extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN; SUNOS4_SHARED_LIBRARIES PROMOTE_FOR_CALL_ONLY \ SPACE_AFTER_L_OPTION NO_RECURSIVE_FUNCTION_CSE \ DEFAULT_MAIN_RETURN TARGET_MEM_FUNCTIONS EXPAND_BUILTIN_VA_ARG \ - COLLECT_PARSE_FLAG + COLLECT_PARSE_FLAG DWARF2_GENERATE_TEXT_SECTION_LABEL /* Hooks that are no longer used. */ #pragma GCC poison LANG_HOOKS_FUNCTION_MARK LANG_HOOKS_FUNCTION_FREE \ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8a39312affb..bf8231b7357 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,104 @@ +2004-10-08 Andrew Pinski <pinskia@physics.uc.edu> + + PR c/16999 + * gcc.dg/cpp/ident-1.c: New test. + +2004-10-08 Nathan Sidwell <nathan@codesourcery.com> + + * gcc.c-torture/compile/acc1.c: New. + +2004-10-08 Andrew Pinski <pinskia@physics.uc.edu> + + * gcc.dg/darwin-longdouble.c: Include stdlib.h and string.h. + * gcc.dg/darwin-abi-2.c: Include stdlib.h. + +2004-10-08 Christian Ehrhardt <ehrhardt@mathematik.uni-ulm.de> + + * gcc.dg/ultrasp11.c: New test. + +2004-10-08 Michael Matz <matz@suse.de> + + * gcc.dg/doloop-2.c: New test. + +2004-10-08 Joseph S. Myers <jsm@polyomino.org.uk> + + * gcc.dg/assign-warn-1.c, gcc.dg/assign-warn-2.c: New tests. + * gcc.dg/warn-1.c, gcc.dg/noncompile/20020213-1.c, + objc.dg/method-9.m: Update expected diagnostics. + +2004-10-07 Geoffrey Keating <geoffk@apple.com> + + * gcc.dg/ppc-fsel-3.c: New file. + * gcc.dg/ppc-fsel-1.c: Add -fno-trapping-math, update comment. + +2004-10-07 Paul Brook <paul@codesourcery.com> + + * gfortran.dg/intrinsic_verify_1.f90: New test. + +2004-10-07 Paul Brook <paul@codesourcery.com> + + * gfortran.dg/empty_format_1.f90: Remove stray commas. + +2004-10-07 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de> + + * gfortran.fortran-torture/execute/intrinsic_mvbits.f90, + gfortran.dg/ishft.f90: Add more tests. Add dg-warning in followup + commit. + +2004-10-07 Andrew Pinski <pinskia@physics.uc.edu> + + * g++.dg/ext/asm6.C: Remove extraneous semicolon. + +2004-10-07 Giovanni Bajo <giovannibajo@gcc.gnu.org> + + PR c++/17115 + * g++.dg/warn/Winline-4.C: New test. + +2004-10-07 Christian Ehrhardt <ehrhardt@mathematik.uni-ulm.de> + + * gcc.c-torture/compile/20041007-1.c: New test. + +2004-10-07 Paul Brook <paul@codesourcery.com> + + PR fortran/17678 + * gfortran.dg/use_allocated_1.f90: New test. + +2004-10-06 Andrew Pinski <pinskia@physics.uc.edu> + + PR middle-end/17849 + * gfortran.fortran-torture/compile/nested.f90: New test + +2004-10-06 Joseph S. Myers <jsm@polyomino.org.uk> + + * gcc.dg/Wconversion-2.c, gcc.dg/func-args-1.c: New tests. + +2004-10-06 Andrew Pinski <pinskia@physics.uc.edu> + + PR c++/17368 + * g++.dg/ext/asm6.C: New test. + +2004-10-06 Kenneth Zadeck <zadeck@naturalbridge.com> + + * gcc.dg/20011119-1.c : Added memory attribute to asm sequence. + +2004-10-06 Paul Brook <paul@codesourcery.com> + + PR libfortran/17709 + * gfortran.dg/empty_format_1.f90: New test. + +2004-10-06 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de> + + PR fortran/17568 + * gfortran.dg/ishft.f90: New test. + + PR fortran/17283 + * gfortran.fortran-torture/execute/intrinsic_pack.f90: Enable new + tests. + +2004-10-06 Paul Brook <paul@codesourcery.com> + + * gfortran.dg/do_1.f90: New test. + 2004-10-06 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> * gcc.c-torture/execute/builtins/lib/strcpy.c: Don't abort when @@ -22237,7 +22338,7 @@ Thu Apr 27 15:58:18 MET DST 2000 Jan Hubicka <jh@suse.cz> * gcc.c-torture/compile/labels-2.c: New test. -1999-12-27 Martin von Löwis <loewis@informatik.hu-berlin.de> +1999-12-27 Martin von Löwis <loewis@informatik.hu-berlin.de> * gcc.c-torture/execute/991227-1.c: New test. @@ -22245,7 +22346,7 @@ Thu Apr 27 15:58:18 MET DST 2000 Jan Hubicka <jh@suse.cz> * g++.old-deja/g++.pt/instantiate6.C: Remove excess errors XFAIL. -1999-12-21 Martin von Löwis <loewis@informatik.hu-berlin.de> +1999-12-21 Martin von Löwis <loewis@informatik.hu-berlin.de> * gcc.c-torture/execute/991221-1.c: New test. diff --git a/gcc/testsuite/g++.dg/ext/asm6.C b/gcc/testsuite/g++.dg/ext/asm6.C new file mode 100644 index 00000000000..96ef9d385a8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/asm6.C @@ -0,0 +1,11 @@ +struct A +{ + ~A(); +}; +int foo(A); +void bar() +{ + A a; + asm("" : : "r"(foo(a)) );//<-- cleanup needed here. +} + diff --git a/gcc/testsuite/g++.dg/warn/Winline-4.C b/gcc/testsuite/g++.dg/warn/Winline-4.C new file mode 100644 index 00000000000..188ab5aa896 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Winline-4.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-options "-O2 -Winline" } +// Origin: <markus at oberhumer dot com> +// PR 17115: We should not emit -Winline warning for functions marked with +// noinline + +struct Foo { + __attribute__((noinline)) int a(int r) { return r & 1; } + virtual __attribute__((noinline)) int b(int r) { return r & 1; } + static __attribute__((noinline)) int c(int r) { return r & 1; } +}; + +int bar(int r) { + Foo f; + int k = 1; k &= f.a(r); k &= f.b(r); k &= f.a(r); + return k; +} diff --git a/gcc/testsuite/gcc.c-torture/compile/20041007-1.c b/gcc/testsuite/gcc.c-torture/compile/20041007-1.c new file mode 100644 index 00000000000..ce524703d86 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20041007-1.c @@ -0,0 +1,16 @@ +/* PR rtl-optimization/17027 */ +/* Origin: dbk <sfc@village.uunet.be> */ +/* Testcase by Christian Ehrhardt <ehrhardt@mathematik.uni-ulm.de> */ + +int bar(void); +void baz (void) __attribute__ ((noreturn)); /* noreturn is required */ + +void foo (void) +{ + while (bar ()) { + switch (1) { + default: + baz (); + } + } +} diff --git a/gcc/testsuite/gcc.c-torture/compile/acc1.c b/gcc/testsuite/gcc.c-torture/compile/acc1.c new file mode 100644 index 00000000000..206d16b8ce8 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/acc1.c @@ -0,0 +1,21 @@ +/* { dg-options "-O2 -ffast-math" } */ + +/* Fast maths allows tail recursion to be turned into iteration. */ + +double +foo (int n, double f) +{ + if (n == 0) + return f; + else + return f + foo (n - 1, f); +} + +double +bar (int n, double f) +{ + if (n == 0) + return f; + else + return f * bar (n - 1, f); +} diff --git a/gcc/testsuite/gcc.dg/20011119-1.c b/gcc/testsuite/gcc.dg/20011119-1.c index 5b3c00cd36f..0df09a3f778 100644 --- a/gcc/testsuite/gcc.dg/20011119-1.c +++ b/gcc/testsuite/gcc.dg/20011119-1.c @@ -74,7 +74,7 @@ main() "call %P0\n\t" "addl $12, %%esp\n\t" "popl %%ebp" - : : "i"(ustrzcat)); + : : "i"(ustrzcat) : "memory" ); return 0; } diff --git a/gcc/testsuite/gcc.dg/Wconversion-2.c b/gcc/testsuite/gcc.dg/Wconversion-2.c new file mode 100644 index 00000000000..320f41f0120 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wconversion-2.c @@ -0,0 +1,64 @@ +/* Test messages for -Wconversion, including that they are not + pedwarns. */ +/* Origin: Joseph Myers <jsm@polyomino.org.uk> */ +/* { dg-do compile } */ +/* { dg-options "-std=c99 -pedantic-errors -Wconversion" } */ + +void fsc(signed char); +void fsi(signed int); +void fsll(signed long long); +void fuc(unsigned char); +void fui(unsigned int); +void full(unsigned long long); +void ff(float); +void fld(long double); +void fcf(_Complex float); + +struct s { + void (*fsc)(signed char); + void (*fsi)(signed int); + void (*fsll)(signed long long); + void (*fuc)(unsigned char); + void (*fui)(unsigned int); + void (*full)(unsigned long long); + void (*ff)(float); + void (*fld)(long double); + void (*fcf)(_Complex float); +} x; + +signed char sc; +signed int si; +signed long long sll; +unsigned char uc; +unsigned int ui; +unsigned long long ull; +float f; +long double ld; +_Complex float cf; + +void +g (void) +{ + fsi(f); /* { dg-warning "warning: passing argument 1 of 'fsi' as integer rather than floating due to prototype" } */ + x.fsi(f); /* { dg-warning "warning: passing argument 1 of 'x.fsi' as integer rather than floating due to prototype" } */ + fsi(cf); /* { dg-warning "warning: passing argument 1 of 'fsi' as integer rather than complex due to prototype" } */ + x.fsi(cf); /* { dg-warning "warning: passing argument 1 of 'x.fsi' as integer rather than complex due to prototype" } */ + fcf(f); /* { dg-warning "warning: passing argument 1 of 'fcf' as complex rather than floating due to prototype" } */ + x.fcf(f); /* { dg-warning "warning: passing argument 1 of 'x.fcf' as complex rather than floating due to prototype" } */ + fcf(si); /* { dg-warning "warning: passing argument 1 of 'fcf' as complex rather than integer due to prototype" } */ + x.fcf(si); /* { dg-warning "warning: passing argument 1 of 'x.fcf' as complex rather than integer due to prototype" } */ + ff(sc); /* { dg-warning "warning: passing argument 1 of 'ff' as floating rather than integer due to prototype" } */ + x.ff(sc); /* { dg-warning "warning: passing argument 1 of 'x.ff' as floating rather than integer due to prototype" } */ + ff(cf); /* { dg-warning "warning: passing argument 1 of 'ff' as floating rather than complex due to prototype" } */ + x.ff(cf); /* { dg-warning "warning: passing argument 1 of 'x.ff' as floating rather than complex due to prototype" } */ + ff(1.0); /* { dg-warning "warning: passing argument 1 of 'ff' as 'float' rather than 'double' due to prototype" } */ + x.ff(1.0); /* { dg-warning "warning: passing argument 1 of 'x.ff' as 'float' rather than 'double' due to prototype" } */ + fsll(sc); /* { dg-warning "warning: passing argument 1 of 'fsll' with different width due to prototype" } */ + x.fsll(sc); /* { dg-warning "warning: passing argument 1 of 'x.fsll' with different width due to prototype" } */ + fsc(sll); /* { dg-warning "warning: passing argument 1 of 'fsc' with different width due to prototype" } */ + x.fsc(sll); /* { dg-warning "warning: passing argument 1 of 'x.fsc' with different width due to prototype" } */ + fsi(ui); /* { dg-warning "warning: passing argument 1 of 'fsi' as signed due to prototype" } */ + x.fsi(ui); /* { dg-warning "warning: passing argument 1 of 'x.fsi' as signed due to prototype" } */ + full(sll); /* { dg-warning "warning: passing argument 1 of 'full' as unsigned due to prototype" } */ + x.full(sll); /* { dg-warning "warning: passing argument 1 of 'x.full' as unsigned due to prototype" } */ +} diff --git a/gcc/testsuite/gcc.dg/assign-warn-1.c b/gcc/testsuite/gcc.dg/assign-warn-1.c new file mode 100644 index 00000000000..857b1a85333 --- /dev/null +++ b/gcc/testsuite/gcc.dg/assign-warn-1.c @@ -0,0 +1,123 @@ +/* Test diagnostics for bad implicit type conversions. */ +/* Origin: Joseph Myers <jsm@polyomino.org.uk> */ +/* { dg-do compile } */ +/* { dg-options "-pedantic" } */ + +#define TESTARG(ID, TL, TR) void ID##F(TL); void ID##F2(TR x) { ID##F(x); } extern int dummy +#define TESTARP(ID, TL, TR) struct { void (*x)(TL); } ID##Fp; void ID##F2(TR x) { ID##Fp.x(x); } extern int dummy +#define TESTASS(ID, TL, TR) void ID##F(TR x) { TL y; y = x; } extern int dummy +#define TESTINI(ID, TL, TR) void ID##F(TR x) { TL y = x; } extern int dummy +#define TESTRET(ID, TL, TR) TR ID##V; TL ID##F(void) { return ID##V; } extern int dummy + +typedef void (*fp)(void); +typedef void (*nrfp)(void) __attribute__((noreturn)); + +TESTARG(fqa, nrfp, fp); /* { dg-warning "warning: passing argument 1 of 'fqaF' makes qualified function pointer from unqualified" } */ +TESTARP(fqb, nrfp, fp); /* { dg-warning "warning: passing argument 1 of 'fqbFp.x' makes qualified function pointer from unqualified" } */ +TESTASS(fqc, nrfp, fp); /* { dg-warning "warning: assignment makes qualified function pointer from unqualified" } */ +TESTINI(fqd, nrfp, fp); /* { dg-warning "warning: initialization makes qualified function pointer from unqualified" } */ +TESTRET(fqe, nrfp, fp); /* { dg-warning "warning: return makes qualified function pointer from unqualified" } */ + +TESTARG(ofqa, fp, nrfp); +TESTARP(ofqb, fp, nrfp); +TESTASS(ofqc, fp, nrfp); +TESTINI(ofqd, fp, nrfp); +TESTRET(ofqe, fp, nrfp); + +TESTARG(qa, char *, const char *); /* { dg-warning "warning: passing argument 1 of 'qaF' discards qualifiers from pointer target type" } */ +TESTARP(qb, char *, const char *); /* { dg-warning "warning: passing argument 1 of 'qbFp.x' discards qualifiers from pointer target type" } */ +TESTASS(qc, char *, const char *); /* { dg-warning "warning: assignment discards qualifiers from pointer target type" } */ +TESTINI(qd, char *, const char *); /* { dg-warning "warning: initialization discards qualifiers from pointer target type" } */ +TESTRET(qe, char *, const char *); /* { dg-warning "warning: return discards qualifiers from pointer target type" } */ + +TESTARG(oqa, const char *, char *); +TESTARP(oqb, const char *, char *); +TESTASS(oqc, const char *, char *); +TESTINI(oqd, const char *, char *); +TESTRET(oqe, const char *, char *); + +TESTARG(fda, fp, void *); /* { dg-warning "warning: ISO C forbids passing argument 1 of 'fdaF' between function pointer and 'void \\*'" } */ +TESTARP(fdb, fp, void *); /* { dg-warning "warning: ISO C forbids passing argument 1 of 'fdbFp.x' between function pointer and 'void \\*'" } */ +TESTASS(fdc, fp, void *); /* { dg-warning "warning: ISO C forbids assignment between function pointer and 'void \\*'" } */ +TESTINI(fdd, fp, void *); /* { dg-warning "warning: ISO C forbids initialization between function pointer and 'void \\*'" } */ +TESTRET(fde, fp, void *); /* { dg-warning "warning: ISO C forbids return between function pointer and 'void \\*'" } */ + +TESTARG(dfa, void *, fp); /* { dg-warning "warning: ISO C forbids passing argument 1 of 'dfaF' between function pointer and 'void \\*'" } */ +TESTARP(dfb, void *, fp); /* { dg-warning "warning: ISO C forbids passing argument 1 of 'dfbFp.x' between function pointer and 'void \\*'" } */ +TESTASS(dfc, void *, fp); /* { dg-warning "warning: ISO C forbids assignment between function pointer and 'void \\*'" } */ +TESTINI(dfd, void *, fp); /* { dg-warning "warning: ISO C forbids initialization between function pointer and 'void \\*'" } */ +TESTRET(dfe, void *, fp); /* { dg-warning "warning: ISO C forbids return between function pointer and 'void \\*'" } */ + +TESTARG(sua, int *, unsigned int *); /* { dg-warning "warning: pointer targets in passing argument 1 of 'suaF' differ in signedness" } */ +TESTARP(sub, int *, unsigned int *); /* { dg-warning "warning: pointer targets in passing argument 1 of 'subFp.x' differ in signedness" } */ +TESTASS(suc, int *, unsigned int *); /* { dg-warning "warning: pointer targets in assignment differ in signedness" } */ +TESTINI(sud, int *, unsigned int *); /* { dg-warning "warning: pointer targets in initialization differ in signedness" } */ +TESTRET(sue, int *, unsigned int *); /* { dg-warning "warning: pointer targets in return differ in signedness" } */ + +TESTARG(usa, unsigned int *, int *); /* { dg-warning "warning: pointer targets in passing argument 1 of 'usaF' differ in signedness" } */ +TESTARP(usb, unsigned int *, int *); /* { dg-warning "warning: pointer targets in passing argument 1 of 'usbFp.x' differ in signedness" } */ +TESTASS(usc, unsigned int *, int *); /* { dg-warning "warning: pointer targets in assignment differ in signedness" } */ +TESTINI(usd, unsigned int *, int *); /* { dg-warning "warning: pointer targets in initialization differ in signedness" } */ +TESTRET(use, unsigned int *, int *); /* { dg-warning "warning: pointer targets in return differ in signedness" } */ + +TESTARG(cua, char *, unsigned char *); /* { dg-warning "warning: pointer targets in passing argument 1 of 'cuaF' differ in signedness" } */ +TESTARP(cub, char *, unsigned char *); /* { dg-warning "warning: pointer targets in passing argument 1 of 'cubFp.x' differ in signedness" } */ +TESTASS(cuc, char *, unsigned char *); /* { dg-warning "warning: pointer targets in assignment differ in signedness" } */ +TESTINI(cud, char *, unsigned char *); /* { dg-warning "warning: pointer targets in initialization differ in signedness" } */ +TESTRET(cue, char *, unsigned char *); /* { dg-warning "warning: pointer targets in return differ in signedness" } */ + +TESTARG(uca, unsigned char *, char *); /* { dg-warning "warning: pointer targets in passing argument 1 of 'ucaF' differ in signedness" } */ +TESTARP(ucb, unsigned char *, char *); /* { dg-warning "warning: pointer targets in passing argument 1 of 'ucbFp.x' differ in signedness" } */ +TESTASS(ucc, unsigned char *, char *); /* { dg-warning "warning: pointer targets in assignment differ in signedness" } */ +TESTINI(ucd, unsigned char *, char *); /* { dg-warning "warning: pointer targets in initialization differ in signedness" } */ +TESTRET(uce, unsigned char *, char *); /* { dg-warning "warning: pointer targets in return differ in signedness" } */ + +TESTARG(csa, char *, signed char *); /* { dg-warning "warning: pointer targets in passing argument 1 of 'csaF' differ in signedness" } */ +TESTARP(csb, char *, signed char *); /* { dg-warning "warning: pointer targets in passing argument 1 of 'csbFp.x' differ in signedness" } */ +TESTASS(csc, char *, signed char *); /* { dg-warning "warning: pointer targets in assignment differ in signedness" } */ +TESTINI(csd, char *, signed char *); /* { dg-warning "warning: pointer targets in initialization differ in signedness" } */ +TESTRET(cse, char *, signed char *); /* { dg-warning "warning: pointer targets in return differ in signedness" } */ + +TESTARG(sca, signed char *, char *); /* { dg-warning "warning: pointer targets in passing argument 1 of 'scaF' differ in signedness" } */ +TESTARP(scb, signed char *, char *); /* { dg-warning "warning: pointer targets in passing argument 1 of 'scbFp.x' differ in signedness" } */ +TESTASS(scc, signed char *, char *); /* { dg-warning "warning: pointer targets in assignment differ in signedness" } */ +TESTINI(scd, signed char *, char *); /* { dg-warning "warning: pointer targets in initialization differ in signedness" } */ +TESTRET(sce, signed char *, char *); /* { dg-warning "warning: pointer targets in return differ in signedness" } */ + +TESTARG(cia, char *, int *); /* { dg-warning "warning: passing argument 1 of 'ciaF' from incompatible pointer type" } */ +TESTARP(cib, char *, int *); /* { dg-warning "warning: passing argument 1 of 'cibFp.x' from incompatible pointer type" } */ +TESTASS(cic, char *, int *); /* { dg-warning "warning: assignment from incompatible pointer type" } */ +TESTINI(cid, char *, int *); /* { dg-warning "warning: initialization from incompatible pointer type" } */ +TESTRET(cie, char *, int *); /* { dg-warning "warning: return from incompatible pointer type" } */ + +TESTARG(ica, int *, char *); /* { dg-warning "warning: passing argument 1 of 'icaF' from incompatible pointer type" } */ +TESTARP(icb, int *, char *); /* { dg-warning "warning: passing argument 1 of 'icbFp.x' from incompatible pointer type" } */ +TESTASS(icc, int *, char *); /* { dg-warning "warning: assignment from incompatible pointer type" } */ +TESTINI(icd, int *, char *); /* { dg-warning "warning: initialization from incompatible pointer type" } */ +TESTRET(ice, int *, char *); /* { dg-warning "warning: return from incompatible pointer type" } */ + +TESTARG(ciia, char *, int); /* { dg-warning "warning: passing argument 1 of 'ciiaF' makes pointer from integer without a cast" } */ +TESTARP(ciib, char *, int); /* { dg-warning "warning: passing argument 1 of 'ciibFp.x' makes pointer from integer without a cast" } */ +TESTASS(ciic, char *, int); /* { dg-warning "warning: assignment makes pointer from integer without a cast" } */ +TESTINI(ciid, char *, int); /* { dg-warning "warning: initialization makes pointer from integer without a cast" } */ +TESTRET(ciie, char *, int); /* { dg-warning "warning: return makes pointer from integer without a cast" } */ + +TESTARG(iica, int, char *); /* { dg-warning "warning: passing argument 1 of 'iicaF' makes integer from pointer without a cast" } */ +TESTARP(iicb, int, char *); /* { dg-warning "warning: passing argument 1 of 'iicbFp.x' makes integer from pointer without a cast" } */ +TESTASS(iicc, int, char *); /* { dg-warning "warning: assignment makes integer from pointer without a cast" } */ +TESTINI(iicd, int, char *); /* { dg-warning "warning: initialization makes integer from pointer without a cast" } */ +TESTRET(iice, int, char *); /* { dg-warning "warning: return makes integer from pointer without a cast" } */ + +struct s { int a; }; + +TESTARG(stria, struct s, int); /* { dg-error "error: incompatible type for argument 1 of 'striaF'" } */ +TESTARP(strib, struct s, int); /* { dg-error "error: incompatible type for argument 1 of 'stribFp.x'" } */ +TESTASS(stric, struct s, int); /* { dg-error "error: incompatible types in assignment" } */ +TESTINI(strid, struct s, int); /* { dg-error "error: invalid initializer" } */ +TESTRET(strie, struct s, int); /* { dg-error "error: incompatible types in return" } */ + +TESTARG(istra, int, struct s); /* { dg-error "error: incompatible type for argument 1 of 'istraF'" } */ +TESTARP(istrb, int, struct s); /* { dg-error "error: incompatible type for argument 1 of 'istrbFp.x'" } */ +TESTASS(istrc, int, struct s); /* { dg-error "error: incompatible types in assignment" } */ +TESTINI(istrd, int, struct s); /* { dg-error "error: incompatible types in initialization" } */ +TESTRET(istre, int, struct s); /* { dg-error "error: incompatible types in return" } */ diff --git a/gcc/testsuite/gcc.dg/assign-warn-2.c b/gcc/testsuite/gcc.dg/assign-warn-2.c new file mode 100644 index 00000000000..eae22d1549b --- /dev/null +++ b/gcc/testsuite/gcc.dg/assign-warn-2.c @@ -0,0 +1,124 @@ +/* Test diagnostics for bad implicit type conversions. + -pedantic-errors test. */ +/* Origin: Joseph Myers <jsm@polyomino.org.uk> */ +/* { dg-do compile } */ +/* { dg-options "-pedantic-errors" } */ + +#define TESTARG(ID, TL, TR) void ID##F(TL); void ID##F2(TR x) { ID##F(x); } extern int dummy +#define TESTARP(ID, TL, TR) struct { void (*x)(TL); } ID##Fp; void ID##F2(TR x) { ID##Fp.x(x); } extern int dummy +#define TESTASS(ID, TL, TR) void ID##F(TR x) { TL y; y = x; } extern int dummy +#define TESTINI(ID, TL, TR) void ID##F(TR x) { TL y = x; } extern int dummy +#define TESTRET(ID, TL, TR) TR ID##V; TL ID##F(void) { return ID##V; } extern int dummy + +typedef void (*fp)(void); +typedef void (*nrfp)(void) __attribute__((noreturn)); + +TESTARG(fqa, nrfp, fp); /* { dg-error "error: passing argument 1 of 'fqaF' makes qualified function pointer from unqualified" } */ +TESTARP(fqb, nrfp, fp); /* { dg-error "error: passing argument 1 of 'fqbFp.x' makes qualified function pointer from unqualified" } */ +TESTASS(fqc, nrfp, fp); /* { dg-error "error: assignment makes qualified function pointer from unqualified" } */ +TESTINI(fqd, nrfp, fp); /* { dg-error "error: initialization makes qualified function pointer from unqualified" } */ +TESTRET(fqe, nrfp, fp); /* { dg-error "error: return makes qualified function pointer from unqualified" } */ + +TESTARG(ofqa, fp, nrfp); +TESTARP(ofqb, fp, nrfp); +TESTASS(ofqc, fp, nrfp); +TESTINI(ofqd, fp, nrfp); +TESTRET(ofqe, fp, nrfp); + +TESTARG(qa, char *, const char *); /* { dg-error "error: passing argument 1 of 'qaF' discards qualifiers from pointer target type" } */ +TESTARP(qb, char *, const char *); /* { dg-error "error: passing argument 1 of 'qbFp.x' discards qualifiers from pointer target type" } */ +TESTASS(qc, char *, const char *); /* { dg-error "error: assignment discards qualifiers from pointer target type" } */ +TESTINI(qd, char *, const char *); /* { dg-error "error: initialization discards qualifiers from pointer target type" } */ +TESTRET(qe, char *, const char *); /* { dg-error "error: return discards qualifiers from pointer target type" } */ + +TESTARG(oqa, const char *, char *); +TESTARP(oqb, const char *, char *); +TESTASS(oqc, const char *, char *); +TESTINI(oqd, const char *, char *); +TESTRET(oqe, const char *, char *); + +TESTARG(fda, fp, void *); /* { dg-error "error: ISO C forbids passing argument 1 of 'fdaF' between function pointer and 'void \\*'" } */ +TESTARP(fdb, fp, void *); /* { dg-error "error: ISO C forbids passing argument 1 of 'fdbFp.x' between function pointer and 'void \\*'" } */ +TESTASS(fdc, fp, void *); /* { dg-error "error: ISO C forbids assignment between function pointer and 'void \\*'" } */ +TESTINI(fdd, fp, void *); /* { dg-error "error: ISO C forbids initialization between function pointer and 'void \\*'" } */ +TESTRET(fde, fp, void *); /* { dg-error "error: ISO C forbids return between function pointer and 'void \\*'" } */ + +TESTARG(dfa, void *, fp); /* { dg-error "error: ISO C forbids passing argument 1 of 'dfaF' between function pointer and 'void \\*'" } */ +TESTARP(dfb, void *, fp); /* { dg-error "error: ISO C forbids passing argument 1 of 'dfbFp.x' between function pointer and 'void \\*'" } */ +TESTASS(dfc, void *, fp); /* { dg-error "error: ISO C forbids assignment between function pointer and 'void \\*'" } */ +TESTINI(dfd, void *, fp); /* { dg-error "error: ISO C forbids initialization between function pointer and 'void \\*'" } */ +TESTRET(dfe, void *, fp); /* { dg-error "error: ISO C forbids return between function pointer and 'void \\*'" } */ + +TESTARG(sua, int *, unsigned int *); /* { dg-error "error: pointer targets in passing argument 1 of 'suaF' differ in signedness" } */ +TESTARP(sub, int *, unsigned int *); /* { dg-error "error: pointer targets in passing argument 1 of 'subFp.x' differ in signedness" } */ +TESTASS(suc, int *, unsigned int *); /* { dg-error "error: pointer targets in assignment differ in signedness" } */ +TESTINI(sud, int *, unsigned int *); /* { dg-error "error: pointer targets in initialization differ in signedness" } */ +TESTRET(sue, int *, unsigned int *); /* { dg-error "error: pointer targets in return differ in signedness" } */ + +TESTARG(usa, unsigned int *, int *); /* { dg-error "error: pointer targets in passing argument 1 of 'usaF' differ in signedness" } */ +TESTARP(usb, unsigned int *, int *); /* { dg-error "error: pointer targets in passing argument 1 of 'usbFp.x' differ in signedness" } */ +TESTASS(usc, unsigned int *, int *); /* { dg-error "error: pointer targets in assignment differ in signedness" } */ +TESTINI(usd, unsigned int *, int *); /* { dg-error "error: pointer targets in initialization differ in signedness" } */ +TESTRET(use, unsigned int *, int *); /* { dg-error "error: pointer targets in return differ in signedness" } */ + +TESTARG(cua, char *, unsigned char *); /* { dg-error "error: pointer targets in passing argument 1 of 'cuaF' differ in signedness" } */ +TESTARP(cub, char *, unsigned char *); /* { dg-error "error: pointer targets in passing argument 1 of 'cubFp.x' differ in signedness" } */ +TESTASS(cuc, char *, unsigned char *); /* { dg-error "error: pointer targets in assignment differ in signedness" } */ +TESTINI(cud, char *, unsigned char *); /* { dg-error "error: pointer targets in initialization differ in signedness" } */ +TESTRET(cue, char *, unsigned char *); /* { dg-error "error: pointer targets in return differ in signedness" } */ + +TESTARG(uca, unsigned char *, char *); /* { dg-error "error: pointer targets in passing argument 1 of 'ucaF' differ in signedness" } */ +TESTARP(ucb, unsigned char *, char *); /* { dg-error "error: pointer targets in passing argument 1 of 'ucbFp.x' differ in signedness" } */ +TESTASS(ucc, unsigned char *, char *); /* { dg-error "error: pointer targets in assignment differ in signedness" } */ +TESTINI(ucd, unsigned char *, char *); /* { dg-error "error: pointer targets in initialization differ in signedness" } */ +TESTRET(uce, unsigned char *, char *); /* { dg-error "error: pointer targets in return differ in signedness" } */ + +TESTARG(csa, char *, signed char *); /* { dg-error "error: pointer targets in passing argument 1 of 'csaF' differ in signedness" } */ +TESTARP(csb, char *, signed char *); /* { dg-error "error: pointer targets in passing argument 1 of 'csbFp.x' differ in signedness" } */ +TESTASS(csc, char *, signed char *); /* { dg-error "error: pointer targets in assignment differ in signedness" } */ +TESTINI(csd, char *, signed char *); /* { dg-error "error: pointer targets in initialization differ in signedness" } */ +TESTRET(cse, char *, signed char *); /* { dg-error "error: pointer targets in return differ in signedness" } */ + +TESTARG(sca, signed char *, char *); /* { dg-error "error: pointer targets in passing argument 1 of 'scaF' differ in signedness" } */ +TESTARP(scb, signed char *, char *); /* { dg-error "error: pointer targets in passing argument 1 of 'scbFp.x' differ in signedness" } */ +TESTASS(scc, signed char *, char *); /* { dg-error "error: pointer targets in assignment differ in signedness" } */ +TESTINI(scd, signed char *, char *); /* { dg-error "error: pointer targets in initialization differ in signedness" } */ +TESTRET(sce, signed char *, char *); /* { dg-error "error: pointer targets in return differ in signedness" } */ + +TESTARG(cia, char *, int *); /* { dg-error "error: passing argument 1 of 'ciaF' from incompatible pointer type" } */ +TESTARP(cib, char *, int *); /* { dg-error "error: passing argument 1 of 'cibFp.x' from incompatible pointer type" } */ +TESTASS(cic, char *, int *); /* { dg-error "error: assignment from incompatible pointer type" } */ +TESTINI(cid, char *, int *); /* { dg-error "error: initialization from incompatible pointer type" } */ +TESTRET(cie, char *, int *); /* { dg-error "error: return from incompatible pointer type" } */ + +TESTARG(ica, int *, char *); /* { dg-error "error: passing argument 1 of 'icaF' from incompatible pointer type" } */ +TESTARP(icb, int *, char *); /* { dg-error "error: passing argument 1 of 'icbFp.x' from incompatible pointer type" } */ +TESTASS(icc, int *, char *); /* { dg-error "error: assignment from incompatible pointer type" } */ +TESTINI(icd, int *, char *); /* { dg-error "error: initialization from incompatible pointer type" } */ +TESTRET(ice, int *, char *); /* { dg-error "error: return from incompatible pointer type" } */ + +TESTARG(ciia, char *, int); /* { dg-error "error: passing argument 1 of 'ciiaF' makes pointer from integer without a cast" } */ +TESTARP(ciib, char *, int); /* { dg-error "error: passing argument 1 of 'ciibFp.x' makes pointer from integer without a cast" } */ +TESTASS(ciic, char *, int); /* { dg-error "error: assignment makes pointer from integer without a cast" } */ +TESTINI(ciid, char *, int); /* { dg-error "error: initialization makes pointer from integer without a cast" } */ +TESTRET(ciie, char *, int); /* { dg-error "error: return makes pointer from integer without a cast" } */ + +TESTARG(iica, int, char *); /* { dg-error "error: passing argument 1 of 'iicaF' makes integer from pointer without a cast" } */ +TESTARP(iicb, int, char *); /* { dg-error "error: passing argument 1 of 'iicbFp.x' makes integer from pointer without a cast" } */ +TESTASS(iicc, int, char *); /* { dg-error "error: assignment makes integer from pointer without a cast" } */ +TESTINI(iicd, int, char *); /* { dg-error "error: initialization makes integer from pointer without a cast" } */ +TESTRET(iice, int, char *); /* { dg-error "error: return makes integer from pointer without a cast" } */ + +struct s { int a; }; + +TESTARG(stria, struct s, int); /* { dg-error "error: incompatible type for argument 1 of 'striaF'" } */ +TESTARP(strib, struct s, int); /* { dg-error "error: incompatible type for argument 1 of 'stribFp.x'" } */ +TESTASS(stric, struct s, int); /* { dg-error "error: incompatible types in assignment" } */ +TESTINI(strid, struct s, int); /* { dg-error "error: invalid initializer" } */ +TESTRET(strie, struct s, int); /* { dg-error "error: incompatible types in return" } */ + +TESTARG(istra, int, struct s); /* { dg-error "error: incompatible type for argument 1 of 'istraF'" } */ +TESTARP(istrb, int, struct s); /* { dg-error "error: incompatible type for argument 1 of 'istrbFp.x'" } */ +TESTASS(istrc, int, struct s); /* { dg-error "error: incompatible types in assignment" } */ +TESTINI(istrd, int, struct s); /* { dg-error "error: incompatible types in initialization" } */ +TESTRET(istre, int, struct s); /* { dg-error "error: incompatible types in return" } */ diff --git a/gcc/testsuite/gcc.dg/cpp/ident-1.c b/gcc/testsuite/gcc.dg/cpp/ident-1.c new file mode 100644 index 00000000000..5437296ddd1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/cpp/ident-1.c @@ -0,0 +1,7 @@ +/* { dg-do preprocess } */ + +/* Based on PR 16999 */ + +#ident "this is an ident" + +/* { dg-final { scan-file "ident-1.i" "(^|\\n)#ident \"this is an ident\"($|\\n)" } } */ diff --git a/gcc/testsuite/gcc.dg/darwin-abi-2.c b/gcc/testsuite/gcc.dg/darwin-abi-2.c index 81da83c424f..4764831e847 100644 --- a/gcc/testsuite/gcc.dg/darwin-abi-2.c +++ b/gcc/testsuite/gcc.dg/darwin-abi-2.c @@ -5,6 +5,7 @@ tests that the ABI is correct. */ #include <stdio.h> +#include <stdlib.h> #define vector __attribute__((vector_size(16))) diff --git a/gcc/testsuite/gcc.dg/darwin-longdouble.c b/gcc/testsuite/gcc.dg/darwin-longdouble.c index 54f090ddff6..8e4259af350 100644 --- a/gcc/testsuite/gcc.dg/darwin-longdouble.c +++ b/gcc/testsuite/gcc.dg/darwin-longdouble.c @@ -3,6 +3,8 @@ /* No options so 'long long' can be used. */ #include <stdio.h> +#include <stdlib.h> +#include <string.h> typedef unsigned long long uint64_t; typedef uint64_t ldbits[2]; diff --git a/gcc/testsuite/gcc.dg/doloop-2.c b/gcc/testsuite/gcc.dg/doloop-2.c new file mode 100644 index 00000000000..115ec742ba3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/doloop-2.c @@ -0,0 +1,19 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ +extern void abort (void); +unsigned global_iters; + +void bi_reverse(int len) +{ + do { + global_iters++; + } while (--len > 0); +} + +int main() +{ + bi_reverse(5); + if (global_iters != 5) + abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.dg/func-args-1.c b/gcc/testsuite/gcc.dg/func-args-1.c new file mode 100644 index 00000000000..306a5dfa04d --- /dev/null +++ b/gcc/testsuite/gcc.dg/func-args-1.c @@ -0,0 +1,53 @@ +/* Test messages for wrong number of arguments to function. */ +/* Origin: Joseph Myers <jsm@polyomino.org.uk> */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +void f0(void); +void f1(int); +void f1v(int, ...); +void f2(int, int); +void f2v(int, int, ...); + +struct s { + void (*f0)(void); + void (*f1)(int); + void (*f1v)(int, ...); + void (*f2)(int, int); + void (*f2v)(int, int, ...); +} x; + +void +g (int a) +{ + f0(); + x.f0(); + f0(a); /* { dg-error "error: too many arguments to function 'f0'" } */ + x.f0(a); /* { dg-error "error: too many arguments to function 'x.f0'" } */ + f0(a, a); /* { dg-error "error: too many arguments to function 'f0'" } */ + x.f0(a, a); /* { dg-error "error: too many arguments to function 'x.f0'" } */ + f1(); /* { dg-error "error: too few arguments to function 'f1'" } */ + x.f1(); /* { dg-error "error: too few arguments to function 'x.f1'" } */ + f1(a); + x.f1(a); + f1(a, a); /* { dg-error "error: too many arguments to function 'f1'" } */ + x.f1(a, a); /* { dg-error "error: too many arguments to function 'x.f1'" } */ + f1v(); /* { dg-error "error: too few arguments to function 'f1v'" } */ + x.f1v(); /* { dg-error "error: too few arguments to function 'x.f1v'" } */ + f1v(a); + x.f1v(a); + f1v(a, a); + x.f1v(a, a); + f2(a); /* { dg-error "error: too few arguments to function 'f2'" } */ + x.f2(a); /* { dg-error "error: too few arguments to function 'x.f2'" } */ + f2(a, a); + x.f2(a, a); + f2(a, a, a); /* { dg-error "error: too many arguments to function 'f2'" } */ + x.f2(a, a, a); /* { dg-error "error: too many arguments to function 'x.f2'" } */ + f2v(a); /* { dg-error "error: too few arguments to function 'f2v'" } */ + x.f2v(a); /* { dg-error "error: too few arguments to function 'x.f2v'" } */ + f2v(a, a); + x.f2v(a, a); + f2v(a, a, a); + x.f2v(a, a, a); +} diff --git a/gcc/testsuite/gcc.dg/noncompile/20020213-1.c b/gcc/testsuite/gcc.dg/noncompile/20020213-1.c index 77798b57c4b..c1de5663ace 100644 --- a/gcc/testsuite/gcc.dg/noncompile/20020213-1.c +++ b/gcc/testsuite/gcc.dg/noncompile/20020213-1.c @@ -24,8 +24,8 @@ int main () return 0; } -/* { dg-warning "passing arg 2 of" "2nd incompatible" { target *-*-* } 15 } */ -/* { dg-warning "passing arg 1 of" "1st incompatible" { target *-*-* } 16 } */ -/* { dg-warning "passing arg 2 of" "2nd incompatible" { target *-*-* } 16 } */ -/* { dg-warning "passing arg 1 of" "1st incompatible" { target *-*-* } 18 } */ -/* { dg-warning "passing arg 1 of" "1st incompatible" { target *-*-* } 20 } */ +/* { dg-warning "passing argument 2 of" "2nd incompatible" { target *-*-* } 15 } */ +/* { dg-warning "passing argument 1 of" "1st incompatible" { target *-*-* } 16 } */ +/* { dg-warning "passing argument 2 of" "2nd incompatible" { target *-*-* } 16 } */ +/* { dg-warning "passing argument 1 of" "1st incompatible" { target *-*-* } 18 } */ +/* { dg-warning "passing argument 1 of" "1st incompatible" { target *-*-* } 20 } */ diff --git a/gcc/testsuite/gcc.dg/ppc-fsel-1.c b/gcc/testsuite/gcc.dg/ppc-fsel-1.c index 266b8dbd5a5..8d364352ac9 100644 --- a/gcc/testsuite/gcc.dg/ppc-fsel-1.c +++ b/gcc/testsuite/gcc.dg/ppc-fsel-1.c @@ -1,8 +1,8 @@ /* { dg-do compile { target powerpc*-*-* } } */ -/* { dg-options "-O -mpowerpc-gfxopt" } */ +/* { dg-options "-O -mpowerpc-gfxopt -fno-trapping-math" } */ /* { dg-final { scan-assembler "fsel" } } */ -/* Check that fsel can be generated even without -ffast-math. */ +/* If the user doesn't care about signals, fsel can be used in many cases. */ double foo(double a, double b, double c, double d) { diff --git a/gcc/testsuite/gcc.dg/ppc-fsel-3.c b/gcc/testsuite/gcc.dg/ppc-fsel-3.c new file mode 100644 index 00000000000..1d07c528eb1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/ppc-fsel-3.c @@ -0,0 +1,11 @@ +/* { dg-do compile { target powerpc*-*-* } } */ +/* { dg-options "-O -mpowerpc-gfxopt" } */ +/* { dg-final { scan-assembler-not "fsub" } } */ + +/* Check that an fsub isn't generated when no arithmetic was requested; + such an fsub might incorrectly set floating-point exception flags. */ + +double foo(double a, double b, double c, double d) +{ + return a < b ? c : d; +} diff --git a/gcc/testsuite/gcc.dg/ultrasp11.c b/gcc/testsuite/gcc.dg/ultrasp11.c new file mode 100644 index 00000000000..8f279f721ae --- /dev/null +++ b/gcc/testsuite/gcc.dg/ultrasp11.c @@ -0,0 +1,25 @@ +/* PR target/17245 */ +/* Origin: <aaronw@net.com> */ +/* Testcase by Christian Ehrhardt <ehrhardt@mathematik.uni-ulm.de> */ +/* { dg-do compile { target sparc*-*-* } } */ +/* { dg-options "-O -mcpu=v9" } */ + +/* This used to fail on 32-bit Ultrasparc because reload was emitting + a move insn that doesn't satisfy its constraints. */ + +int n; +double range ; +double bin ; +double wmean; + +double f () +{ + int i ; + long double W = 0 ; + for ( i = 0 ; i < n ; i ++) { + double xi = range; + double wi = bin; + W += wi ; + wmean += ( xi - wmean) * ( wi / W); + } +} diff --git a/gcc/testsuite/gcc.dg/warn-1.c b/gcc/testsuite/gcc.dg/warn-1.c index ce35b41e941..dc2cd0e7c71 100644 --- a/gcc/testsuite/gcc.dg/warn-1.c +++ b/gcc/testsuite/gcc.dg/warn-1.c @@ -12,5 +12,5 @@ void bar (void) { void *vp; - foo (vp); /* { dg-warning "passing arg 1 of" } */ + foo (vp); /* { dg-warning "passing argument 1 of" } */ } diff --git a/gcc/testsuite/gfortran.dg/do_1.f90 b/gcc/testsuite/gfortran.dg/do_1.f90 new file mode 100644 index 00000000000..20e1f31ca67 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/do_1.f90 @@ -0,0 +1,80 @@ +! { dg-do run } +! Program to check corner cases for DO statements. +program do_1 + implicit none + integer i, j + + ! limit=HUGE(i), step 1 + j = 0 + do i = HUGE(i) - 10, HUGE(i), 1 + j = j + 1 + end do + if (j .ne. 11) call abort + ! limit=HUGE(i), step > 1 + j = 0 + do i = HUGE(i) - 10, HUGE(i), 2 + j = j + 1 + end do + if (j .ne. 6) call abort + j = 0 + do i = HUGE(i) - 9, HUGE(i), 2 + j = j + 1 + end do + if (j .ne. 5) call abort + + ! Same again, but unknown loop step + if (test1(10, 1) .ne. 11) call abort + if (test1(10, 2) .ne. 6) call abort + if (test1(9, 2) .ne. 5) call abort + + ! Zero iterations + j = 0 + do i = 1, 0, 1 + j = j + 1 + end do + if (j .ne. 0) call abort + j = 0 + do i = 1, 0, 2 + j = j + 1 + end do + if (j .ne. 0) call abort + j = 0 + do i = 1, 2, -1 + j = j + 1 + end do + if (j .ne. 0) call abort + call test2 (0, 1) + call test2 (0, 2) + call test2 (2, -1) + call test2 (2, -2) + + ! Bound near smallest value + j = 0; + do i = -HUGE(i), -HUGE(i), 10 + j = j + 1 + end do + if (j .ne. 1) call abort +contains +! Returns the number of iterations performed. +function test1(r, step) + implicit none + integer test1, r, step + integer k, n + k = 0 + do n = HUGE(n) - r, HUGE(n), step + k = k + 1 + end do + test1 = k +end function + +subroutine test2 (lim, step) + implicit none + integer lim, step + integer k, n + k = 0 + do n = 1, lim, step + k = k + 1 + end do + if (k .ne. 0) call abort +end subroutine +end program diff --git a/gcc/testsuite/gfortran.dg/empty_format_1.f90 b/gcc/testsuite/gfortran.dg/empty_format_1.f90 new file mode 100644 index 00000000000..79a2d0c17d7 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/empty_format_1.f90 @@ -0,0 +1,21 @@ +! { dg-do run } +! PR 17709 +! We weren't resetting the internal EOR flag correctly, so the second read +! wasn't advancing to the next line. +program main + integer io_unit + character*20 str + io_unit = 10 + open (unit=io_unit,status='scratch',form='formatted') + write (io_unit, '(A)') "Line1" + write (io_unit, '(A)') "Line2" + write (io_unit, '(A)') "Line3" + rewind (io_unit) + read (io_unit,'(A)') str + if (str .ne. "Line1") call abort + read (io_unit,'()') + read (io_unit,'(A)') str + if (str .ne. "Line3") call abort + close(unit=io_unit) +end + diff --git a/gcc/testsuite/gfortran.dg/intrinsic_verify_1.f90 b/gcc/testsuite/gfortran.dg/intrinsic_verify_1.f90 new file mode 100644 index 00000000000..c894043de08 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/intrinsic_verify_1.f90 @@ -0,0 +1,12 @@ +! { dg-do run } +! Test the verify intrinsic. We were ignoring the last character. +program prog + character(len=1) :: c1 + character(len=4) :: c4 + c1 = "E" + if (verify(c1, "1") .ne. 1) call abort + c4 = "ABBA" + if (verify(c4, "A") .ne. 2) call abort + if (verify(c4, "A", back = .true.) .ne. 3) call abort + if (verify(c4, "AB") .ne. 0) call abort +end program diff --git a/gcc/testsuite/gfortran.dg/ishft.f90 b/gcc/testsuite/gfortran.dg/ishft.f90 new file mode 100644 index 00000000000..d8ca3a7de73 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/ishft.f90 @@ -0,0 +1,59 @@ +! { dg-do run } +! verifies basic functioning of the ishft and ishftc intrinsics +if (ishft (1_1, 0) /= 1) call abort +if (ishft (1_1, 1) /= 2) call abort +if (ishft (3_1, 1) /= 6) call abort +if (ishft (-1_1, 1) /= -2) call abort +if (ishft (-1_1, -1) /= 127) call abort +if (ishft (96_1, 2) /= -128) call abort + +if (ishft (1_2, 0) /= 1) call abort +if (ishft (1_2, 1) /= 2) call abort +if (ishft (3_2, 1) /= 6) call abort +if (ishft (-1_2, 1) /= -2) call abort +if (ishft (-1_2, -1) /= 32767) call abort +if (ishft (16384_2 + 8192_2, 2) /= -32768_4) call abort + +if (ishft (1_4, 0) /= 1) call abort +if (ishft (1_4, 1) /= 2) call abort +if (ishft (3_4, 1) /= 6) call abort +if (ishft (-1_4, 1) /= -2) call abort +if (ishft (-1_4, -1) /= 2147483647) call abort +if (ishft (1073741824_4 + 536870912_4, 2) /= -2147483648_8) call abort + +if (ishft (1_8, 0) /= 1) call abort +if (ishft (1_8, 1) /= 2) call abort +if (ishft (3_8, 1) /= 6) call abort +if (ishft (-1_8, 1) /= -2) call abort +if (ishft (-1_8, -60) /= z'F'_8) call abort ! { dg-warning "" "" } + +if (ishftc (1_1, 0) /= 1) call abort +if (ishftc (1_1, 1) /= 2) call abort +if (ishftc (3_1, 1) /= 6) call abort +if (ishftc (-1_1, 1) /= -1) call abort +if (ishftc (-1_1, -1) /= -1) call abort +if (ishftc (ishftc (96_1, 2), -2) /= 96) call abort + +if (ishftc (1_2, 0) /= 1) call abort +if (ishftc (1_2, 1) /= 2) call abort +if (ishftc (3_2, 1) /= 6) call abort +if (ishftc (-1_2, 1) /= -1) call abort +if (ishftc (-1_2, -1) /= -1) call abort +if (ishftc (ishftc (25000_2, 2), -2) /= 25000) call abort + +if (ishftc (1_4, 0) /= 1) call abort +if (ishftc (1_4, 1) /= 2) call abort +if (ishftc (3_4, 1) /= 6) call abort +if (ishftc (-1_4, 1) /= -1) call abort +if (ishftc (-1_4, -1) /= -1) call abort +if (ishftc (ishftc (1325876_4, 2), -2) /= 1325876) call abort + +if (ishftc (1_8, 0) /= 1) call abort +if (ishftc (1_8, 1) /= 2) call abort +if (ishftc (3_8, 1) /= 6) call abort +if (ishftc (-1_8, 1) /= -1) call abort +if (ishftc (-1_8, -1) /= -1) call abort +if (ishftc (ishftc (1325876_8, 2), -2) /= 1325876) call abort +end + + diff --git a/gcc/testsuite/gfortran.dg/use_allocated_1.f90 b/gcc/testsuite/gfortran.dg/use_allocated_1.f90 new file mode 100644 index 00000000000..fb51502edc2 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/use_allocated_1.f90 @@ -0,0 +1,18 @@ +! { dg-do run } +! PR17678 +! We were incorrectly setting use-associated variables to unallocated +! on procedure entry. +module foo + integer, dimension(:), allocatable :: bar +end module + +program main + use foo + allocate (bar(10)) + call init +end program main + +subroutine init + use foo + if (.not.allocated(bar)) call abort +end subroutine init diff --git a/gcc/testsuite/gfortran.fortran-torture/compile/nested.f90 b/gcc/testsuite/gfortran.fortran-torture/compile/nested.f90 new file mode 100644 index 00000000000..1059684ddd5 --- /dev/null +++ b/gcc/testsuite/gfortran.fortran-torture/compile/nested.f90 @@ -0,0 +1,23 @@ +! Program to test the nested functions +program intrinsic_pack + integer, parameter :: val(9) = (/0,0,0,0,9,0,0,0,7/) + integer, dimension(3, 3) :: a + integer, dimension(6) :: b + + a = reshape (val, (/3, 3/)) + b = 0 + b(1:6:3) = pack (a, a .ne. 0); + if (any (b(1:6:3) .ne. (/9, 7/))) call abort + b = pack (a(2:3, 2:3), a(2:3, 2:3) .ne. 0, (/1, 2, 3, 4, 5, 6/)); + if (any (b .ne. (/9, 7, 3, 4, 5, 6/))) call abort + +contains + subroutine tests_with_temp + ! A few tests which involve a temporary + if (any (pack(a, a.ne.0) .ne. (/9, 7/))) call abort + if (any (pack(a, .true.) .ne. val)) call abort + if (size(pack (a, .false.)) .ne. 0) call abort + if (any (pack(a, .false., (/1,2,3/)).ne. (/1,2,3/))) call abort + + end subroutine tests_with_temp +end program diff --git a/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_mvbits.f90 b/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_mvbits.f90 index 8aaaf09dd26..c9fbe782703 100644 --- a/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_mvbits.f90 +++ b/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_mvbits.f90 @@ -1,5 +1,6 @@ ! Test the MVBITS intrinsic subroutine INTEGER*4 :: from, to, result +integer*8 :: to8 DATA from / z'0003FFFC' / DATA to / z'77760000' / @@ -7,4 +8,8 @@ DATA result / z'7777FFFE' / CALL mvbits(from, 2, 16, to, 1) if (to /= result) CALL abort() + +to8 = 0 +call mvbits (b'1011'_8*2_8**32, 33, 3, to8, 2) ! { dg-warning "" "" } +if (to8 /= b'10100'_8) call abort ! { dg-warning "" "" } end diff --git a/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_pack.f90 b/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_pack.f90 index 427fe55ef14..28cd1cd8f03 100644 --- a/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_pack.f90 +++ b/gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_pack.f90 @@ -11,8 +11,7 @@ program intrinsic_pack b = pack (a(2:3, 2:3), a(2:3, 2:3) .ne. 0, (/1, 2, 3, 4, 5, 6/)); if (any (b .ne. (/9, 7, 3, 4, 5, 6/))) call abort -! this is waiting for PR 17756 to be fixed -! call tests_with_temp() + call tests_with_temp() contains subroutine tests_with_temp ! A few tests which involve a temporary diff --git a/gcc/testsuite/objc.dg/method-9.m b/gcc/testsuite/objc.dg/method-9.m index ba832840062..3921663ec8f 100644 --- a/gcc/testsuite/objc.dg/method-9.m +++ b/gcc/testsuite/objc.dg/method-9.m @@ -37,7 +37,7 @@ /* { dg-warning "also found .\\-\\(id\\)initWithData:\\(int\\)data." "" { target *-*-* } 13 } */ /* The following warning is a consequence of picking the "wrong" method signature. */ - /* { dg-warning "passing arg 1 of .initWithData:. from incompatible pointer type" "" { target *-*-* } 33 } */ + /* { dg-warning "passing argument 1 of .initWithData:. from incompatible pointer type" "" { target *-*-* } 33 } */ return result; } @end diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 119d51f3194..6bba74b0142 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -790,7 +790,7 @@ main_block_label (tree label) return label_for_bb[bb->index]; } -/* Cleanup redundant labels. This is a three-steo process: +/* Cleanup redundant labels. This is a three-step process: 1) Find the leading label for each block. 2) Redirect all references to labels to the leading labels. 3) Cleanup all useless labels. */ @@ -1843,69 +1843,6 @@ remove_bb (basic_block bb) remove_phi_nodes_and_edges_for_unreachable_block (bb); } - -/* Examine BB to determine if it is a forwarding block (a block which only - transfers control to a new destination). If BB is a forwarding block, - then return the edge leading to the ultimate destination. */ - -edge -tree_block_forwards_to (basic_block bb) -{ - block_stmt_iterator bsi; - bb_ann_t ann = bb_ann (bb); - tree stmt; - - /* If this block is not forwardable, then avoid useless work. */ - if (! ann->forwardable) - return NULL; - - /* Set this block to not be forwardable. This prevents infinite loops since - any block currently under examination is considered non-forwardable. */ - ann->forwardable = 0; - - /* No forwarding is possible if this block is a special block (ENTRY/EXIT), - this block has more than one successor, this block's single successor is - reached via an abnormal edge, this block has phi nodes, or this block's - single successor has phi nodes. */ - if (bb == EXIT_BLOCK_PTR - || bb == ENTRY_BLOCK_PTR - || EDGE_COUNT (bb->succs) != 1 - || EDGE_SUCC (bb, 0)->dest == EXIT_BLOCK_PTR - || (EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL) != 0 - || phi_nodes (bb) - || phi_nodes (EDGE_SUCC (bb, 0)->dest)) - return NULL; - - /* Walk past any labels at the start of this block. */ - for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi)) - { - stmt = bsi_stmt (bsi); - if (TREE_CODE (stmt) != LABEL_EXPR) - break; - } - - /* If we reached the end of this block we may be able to optimize this - case. */ - if (bsi_end_p (bsi)) - { - edge dest; - - /* Recursive call to pick up chains of forwarding blocks. */ - dest = tree_block_forwards_to (EDGE_SUCC (bb, 0)->dest); - - /* If none found, we forward to bb->succs[0] at minimum. */ - if (!dest) - dest = EDGE_SUCC (bb, 0); - - ann->forwardable = 1; - return dest; - } - - /* No forwarding possible. */ - return NULL; -} - - /* Try to remove superfluous control structures. */ static bool @@ -2713,6 +2650,24 @@ stmt_for_bsi (tree stmt) gcc_unreachable (); } +/* Mark statement T as modified, and update it. */ +static inline void +update_modified_stmts (tree t) +{ + if (TREE_CODE (t) == STATEMENT_LIST) + { + tree_stmt_iterator i; + tree stmt; + for (i = tsi_start (t); !tsi_end_p (i); tsi_next (&i)) + { + stmt = tsi_stmt (i); + update_stmt_if_modified (stmt); + } + } + else + update_stmt_if_modified (t); +} + /* Insert statement (or statement list) T before the statement pointed-to by iterator I. M specifies how to update iterator I after insertion (see enum bsi_iterator_update). */ @@ -2721,8 +2676,8 @@ void bsi_insert_before (block_stmt_iterator *i, tree t, enum bsi_iterator_update m) { set_bb_for_stmt (t, i->bb); + update_modified_stmts (t); tsi_link_before (&i->tsi, t, m); - modify_stmt (t); } @@ -2734,8 +2689,8 @@ void bsi_insert_after (block_stmt_iterator *i, tree t, enum bsi_iterator_update m) { set_bb_for_stmt (t, i->bb); + update_modified_stmts (t); tsi_link_after (&i->tsi, t, m); - modify_stmt (t); } @@ -2747,7 +2702,9 @@ bsi_remove (block_stmt_iterator *i) { tree t = bsi_stmt (*i); set_bb_for_stmt (t, NULL); + delink_stmt_imm_use (t); tsi_delink (&i->tsi); + mark_stmt_modified (t); } @@ -2811,7 +2768,7 @@ bsi_replace (const block_stmt_iterator *bsi, tree stmt, bool preserve_eh_info) } *bsi_stmt_ptr (*bsi) = stmt; - modify_stmt (stmt); + update_modified_stmts (stmt); } @@ -3757,7 +3714,10 @@ tree_make_forwarder_block (edge fallthru) /* Return true if basic block BB does nothing except pass control flow to another block and that we can safely insert a label at - the start of the successor block. */ + the start of the successor block. + + As a precondition, we require that BB be not equal to + ENTRY_BLOCK_PTR. */ static bool tree_forwarder_block_p (basic_block bb) @@ -3771,17 +3731,25 @@ tree_forwarder_block_p (basic_block bb) if (! bb_ann (bb)->forwardable) return false; - /* BB must have a single outgoing normal edge. Otherwise it can not be - a forwarder block. */ + /* BB must have a single outgoing edge. */ if (EDGE_COUNT (bb->succs) != 1 + /* BB can not have any PHI nodes. This could potentially be + relaxed early in compilation if we re-rewrote the variables + appearing in any PHI nodes in forwarder blocks. */ + || phi_nodes (bb) + /* BB may not be a predecessor of EXIT_BLOCK_PTR. */ || EDGE_SUCC (bb, 0)->dest == EXIT_BLOCK_PTR - || (EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL) - || bb == ENTRY_BLOCK_PTR) + /* BB may not have an abnormal outgoing edge. */ + || (EDGE_SUCC (bb, 0)->flags & EDGE_ABNORMAL)) { bb_ann (bb)->forwardable = 0; return false; } +#if ENABLE_CHECKING + gcc_assert (bb != ENTRY_BLOCK_PTR); +#endif + /* Successors of the entry block are not forwarders. */ FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs) if (e->dest == bb) @@ -3790,15 +3758,6 @@ tree_forwarder_block_p (basic_block bb) return false; } - /* BB can not have any PHI nodes. This could potentially be relaxed - early in compilation if we re-rewrote the variables appearing in - any PHI nodes in forwarder blocks. */ - if (phi_nodes (bb)) - { - bb_ann (bb)->forwardable = 0; - return false; - } - /* Now walk through the statements. We can ignore labels, anything else means this is not a forwarder block. */ for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi)) @@ -3884,12 +3843,7 @@ thread_jumps (void) tree_forwarder_block_p (dest); last = EDGE_SUCC (dest, 0), dest = EDGE_SUCC (dest, 0)->dest) - { - if (EDGE_SUCC (dest, 0)->dest == EXIT_BLOCK_PTR) - break; - - bb_ann (dest)->forwardable = 0; - } + bb_ann (dest)->forwardable = 0; /* Reset the forwardable marks to 1. */ for (tmp = e->dest; diff --git a/gcc/tree-complex.c b/gcc/tree-complex.c index 5a4fdf5a668..7eb59122d5a 100644 --- a/gcc/tree-complex.c +++ b/gcc/tree-complex.c @@ -83,7 +83,7 @@ update_complex_assignment (block_stmt_iterator *bsi, tree r, tree i) type = TREE_TYPE (TREE_OPERAND (stmt, 1)); TREE_OPERAND (stmt, 1) = build (COMPLEX_EXPR, type, r, i); - modify_stmt (stmt); + mark_stmt_modified (stmt); } /* Expand complex addition to scalars: @@ -352,7 +352,7 @@ expand_complex_comparison (block_stmt_iterator *bsi, tree ar, tree ai, gcc_unreachable (); } - modify_stmt (stmt); + mark_stmt_modified (stmt); } /* Process one statement. If we identify a complex operation, expand it. */ @@ -474,6 +474,7 @@ expand_complex_operations_1 (block_stmt_iterator *bsi) default: gcc_unreachable (); } + update_stmt_if_modified (stmt); } /* Build a constant of type TYPE, made of VALUE's bits replicated @@ -839,7 +840,7 @@ expand_vector_operations_1 (block_stmt_iterator *bsi) *p_rhs = expand_vector_addition (bsi, do_binop, do_plus_minus, type, TREE_OPERAND (rhs, 0), TREE_OPERAND (rhs, 1), code); - modify_stmt (bsi_stmt (*bsi)); + mark_stmt_modified (bsi_stmt (*bsi)); return; case NEGATE_EXPR: @@ -849,7 +850,7 @@ expand_vector_operations_1 (block_stmt_iterator *bsi) *p_rhs = expand_vector_addition (bsi, do_unop, do_negate, type, TREE_OPERAND (rhs, 0), NULL_TREE, code); - modify_stmt (bsi_stmt (*bsi)); + mark_stmt_modified (bsi_stmt (*bsi)); return; case BIT_AND_EXPR: @@ -858,14 +859,14 @@ expand_vector_operations_1 (block_stmt_iterator *bsi) *p_rhs = expand_vector_parallel (bsi, do_binop, type, TREE_OPERAND (rhs, 0), TREE_OPERAND (rhs, 1), code); - modify_stmt (bsi_stmt (*bsi)); + mark_stmt_modified (bsi_stmt (*bsi)); return; case BIT_NOT_EXPR: *p_rhs = expand_vector_parallel (bsi, do_unop, type, TREE_OPERAND (rhs, 0), NULL_TREE, code); - modify_stmt (bsi_stmt (*bsi)); + mark_stmt_modified (bsi_stmt (*bsi)); return; default: @@ -881,7 +882,7 @@ expand_vector_operations_1 (block_stmt_iterator *bsi) TREE_OPERAND (rhs, 0), TREE_OPERAND (rhs, 1), code); - modify_stmt (bsi_stmt (*bsi)); + mark_stmt_modified (bsi_stmt (*bsi)); } static void diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c index 29de6704041..bb95bf4269b 100644 --- a/gcc/tree-dfa.c +++ b/gcc/tree-dfa.c @@ -76,11 +76,8 @@ struct walk_state /* Local functions. */ static void collect_dfa_stats (struct dfa_stats_d *); static tree collect_dfa_stats_r (tree *, int *, void *); -static void add_immediate_use (tree, tree); static tree find_vars_r (tree *, int *, void *); static void add_referenced_var (tree, struct walk_state *); -static void compute_immediate_uses_for_phi (tree, bool (*)(tree)); -static void compute_immediate_uses_for_stmt (tree, int, bool (*)(tree)); /* Global declarations. */ @@ -141,255 +138,6 @@ struct tree_opt_pass pass_referenced_vars = }; -/* Compute immediate uses. - - CALC_FOR is an optional function pointer which indicates whether - immediate uses information should be calculated for a given SSA - variable. If NULL, then information is computed for all - variables. - - FLAGS is one of {TDFA_USE_OPS, TDFA_USE_VOPS}. It is used by - compute_immediate_uses_for_stmt to determine whether to look at - virtual and/or real operands while computing def-use chains. */ - -void -compute_immediate_uses (int flags, bool (*calc_for)(tree)) -{ - basic_block bb; - block_stmt_iterator si; - - FOR_EACH_BB (bb) - { - tree phi; - - for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi)) - { - if (is_gimple_reg (PHI_RESULT (phi))) - { - if (!(flags & TDFA_USE_OPS)) - continue; - } - else - { - if (!(flags & TDFA_USE_VOPS)) - continue; - } - - compute_immediate_uses_for_phi (phi, calc_for); - } - - for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si)) - { - tree stmt = bsi_stmt (si); - get_stmt_operands (stmt); - compute_immediate_uses_for_stmt (stmt, flags, calc_for); - } - } -} - - -/* Invalidates dataflow information for a statement STMT. */ - -void -free_df_for_stmt (tree stmt) -{ - dataflow_t *df; - - if (TREE_CODE (stmt) == PHI_NODE) - df = &PHI_DF (stmt); - else - { - stmt_ann_t ann = stmt_ann (stmt); - - if (!ann) - return; - - df = &ann->df; - } - - if (!*df) - return; - - /* If we have a varray of immediate uses, then go ahead and release - it for re-use. */ - if ((*df)->immediate_uses) - ggc_free ((*df)->immediate_uses); - - /* Similarly for the main dataflow structure. */ - ggc_free (*df); - *df = NULL; -} - - -/* Invalidate dataflow information for the whole function. - - Note this only invalidates dataflow information on statements and - PHI nodes which are reachable. - - A deleted statement may still have attached dataflow information - on it. */ - -void -free_df (void) -{ - basic_block bb; - block_stmt_iterator si; - - FOR_EACH_BB (bb) - { - tree phi; - - for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi)) - free_df_for_stmt (phi); - - for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si)) - { - tree stmt = bsi_stmt (si); - free_df_for_stmt (stmt); - } - } -} - - -/* Helper for compute_immediate_uses. Check all the USE and/or VUSE - operands in phi node PHI and add a def-use edge between their - defining statement and PHI. CALC_FOR is as in - compute_immediate_uses. - - PHI nodes are easy, we only need to look at their arguments. */ - -static void -compute_immediate_uses_for_phi (tree phi, bool (*calc_for)(tree)) -{ - int i; - - gcc_assert (TREE_CODE (phi) == PHI_NODE); - - for (i = 0; i < PHI_NUM_ARGS (phi); i++) - { - tree arg = PHI_ARG_DEF (phi, i); - - if (TREE_CODE (arg) == SSA_NAME && (!calc_for || calc_for (arg))) - { - tree imm_rdef_stmt = SSA_NAME_DEF_STMT (PHI_ARG_DEF (phi, i)); - if (!IS_EMPTY_STMT (imm_rdef_stmt)) - add_immediate_use (imm_rdef_stmt, phi); - } - } -} - - -/* Another helper for compute_immediate_uses. Depending on the value - of FLAGS, check all the USE and/or VUSE operands in STMT and add a - def-use edge between their defining statement and STMT. CALC_FOR - is as in compute_immediate_uses. */ - -static void -compute_immediate_uses_for_stmt (tree stmt, int flags, bool (*calc_for)(tree)) -{ - tree use; - ssa_op_iter iter; - - /* PHI nodes are handled elsewhere. */ - gcc_assert (TREE_CODE (stmt) != PHI_NODE); - - /* Look at USE_OPS or VUSE_OPS according to FLAGS. */ - if (flags & TDFA_USE_OPS) - { - FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE) - { - tree imm_stmt = SSA_NAME_DEF_STMT (use); - if (!IS_EMPTY_STMT (imm_stmt) && (!calc_for || calc_for (use))) - add_immediate_use (imm_stmt, stmt); - } - } - - if (flags & TDFA_USE_VOPS) - { - FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_VIRTUAL_USES) - { - tree imm_rdef_stmt = SSA_NAME_DEF_STMT (use); - if (!IS_EMPTY_STMT (imm_rdef_stmt) && (!calc_for || calc_for (use))) - add_immediate_use (imm_rdef_stmt, stmt); - } - } -} - - -/* Add statement USE_STMT to the list of statements that use definitions - made by STMT. */ - -static void -add_immediate_use (tree stmt, tree use_stmt) -{ - struct dataflow_d **df; - - if (TREE_CODE (stmt) == PHI_NODE) - df = &PHI_DF (stmt); - else - { - stmt_ann_t ann = get_stmt_ann (stmt); - df = &ann->df; - } - - if (*df == NULL) - { - *df = ggc_alloc (sizeof (struct dataflow_d)); - memset ((void *) *df, 0, sizeof (struct dataflow_d)); - (*df)->uses[0] = use_stmt; - return; - } - - if (!(*df)->uses[1]) - { - (*df)->uses[1] = use_stmt; - return; - } - - if ((*df)->immediate_uses == NULL) - VARRAY_TREE_INIT ((*df)->immediate_uses, 4, "immediate_uses"); - - VARRAY_PUSH_TREE ((*df)->immediate_uses, use_stmt); -} - - -/* If the immediate use of USE points to OLD, then redirect it to NEW. */ - -static void -redirect_immediate_use (tree use, tree old, tree new) -{ - tree imm_stmt = SSA_NAME_DEF_STMT (use); - struct dataflow_d *df = get_immediate_uses (imm_stmt); - unsigned int num_uses = num_immediate_uses (df); - unsigned int i; - - for (i = 0; i < num_uses; i++) - { - if (immediate_use (df, i) == old) - { - if (i == 0 || i == 1) - df->uses[i] = new; - else - VARRAY_TREE (df->immediate_uses, i - 2) = new; - } - } -} - - -/* Redirect all immediate uses for operands in OLD so that they point - to NEW. This routine should have no knowledge of how immediate - uses are stored. */ - -void -redirect_immediate_uses (tree old, tree new) -{ - ssa_op_iter iter; - tree val; - - FOR_EACH_SSA_TREE_OPERAND (val, old, iter, SSA_OP_ALL_USES) - redirect_immediate_use (val, old, new); -} - /*--------------------------------------------------------------------------- Manage annotations @@ -583,79 +331,6 @@ debug_variable (tree var) } -/* Dump def-use edges on FILE. */ - -void -dump_immediate_uses (FILE *file) -{ - basic_block bb; - block_stmt_iterator si; - const char *funcname - = lang_hooks.decl_printable_name (current_function_decl, 2); - - fprintf (file, "\nDef-use edges for function %s\n", funcname); - - FOR_EACH_BB (bb) - { - tree phi; - - for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi)) - dump_immediate_uses_for (file, phi); - - for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si)) - dump_immediate_uses_for (file, bsi_stmt (si)); - } - - fprintf (file, "\n"); -} - - -/* Dump def-use edges on stderr. */ - -void -debug_immediate_uses (void) -{ - dump_immediate_uses (stderr); -} - - -/* Dump all immediate uses for STMT on FILE. */ - -void -dump_immediate_uses_for (FILE *file, tree stmt) -{ - dataflow_t df = get_immediate_uses (stmt); - int num_imm_uses = num_immediate_uses (df); - - if (num_imm_uses > 0) - { - int i; - - fprintf (file, "-> "); - print_generic_stmt (file, stmt, TDF_SLIM); - fprintf (file, "\n"); - - for (i = 0; i < num_imm_uses; i++) - { - fprintf (file, "\t"); - print_generic_stmt (file, immediate_use (df, i), TDF_SLIM); - fprintf (file, "\n"); - } - - fprintf (file, "\n"); - } -} - - -/* Dump immediate uses for STMT on stderr. */ - -void -debug_immediate_uses_for (tree stmt) -{ - dump_immediate_uses_for (stderr, stmt); -} - - /* Dump various DFA statistics to FILE. */ void @@ -974,8 +649,7 @@ mark_new_vars_to_rename (tree stmt, bitmap vars_to_rename) /* Now force an operand re-scan on the statement and mark any newly exposed variables. */ - modify_stmt (stmt); - get_stmt_operands (stmt); + update_stmt (stmt); v_may_defs_after = NUM_V_MAY_DEFS (STMT_V_MAY_DEF_OPS (stmt)); v_must_defs_after = NUM_V_MUST_DEFS (STMT_V_MUST_DEF_OPS (stmt)); diff --git a/gcc/tree-dump.c b/gcc/tree-dump.c index fed3bfc4a09..09997b713a7 100644 --- a/gcc/tree-dump.c +++ b/gcc/tree-dump.c @@ -744,7 +744,8 @@ static const struct dump_option_value_info dump_options[] = {"vops", TDF_VOPS}, {"lineno", TDF_LINENO}, {"uid", TDF_UID}, - {"all", ~(TDF_RAW | TDF_SLIM | TDF_LINENO)}, + {"stmtaddr", TDF_STMTADDR}, + {"all", ~(TDF_RAW | TDF_SLIM | TDF_LINENO | TDF_STMTADDR)}, {NULL, 0} }; diff --git a/gcc/tree-flow-inline.h b/gcc/tree-flow-inline.h index 61ed11268f7..284af763161 100644 --- a/gcc/tree-flow-inline.h +++ b/gcc/tree-flow-inline.h @@ -133,22 +133,54 @@ get_filename (tree expr) /* Mark statement T as modified. */ static inline void -modify_stmt (tree t) +mark_stmt_modified (tree t) { - stmt_ann_t ann = stmt_ann (t); + stmt_ann_t ann; + if (TREE_CODE (t) == PHI_NODE) + return; + + ann = stmt_ann (t); if (ann == NULL) ann = create_stmt_ann (t); ann->modified = 1; } -/* Mark statement T as unmodified. */ +/* Mark statement T as modified, and update it. */ static inline void -unmodify_stmt (tree t) +update_stmt (tree t) { - stmt_ann_t ann = stmt_ann (t); - if (ann == NULL) - ann = create_stmt_ann (t); - ann->modified = 0; + if (TREE_CODE (t) == PHI_NODE) + return; + mark_stmt_modified (t); + update_stmt_operands (t); +} + +static inline void +update_stmt_if_modified (tree t) +{ + if (stmt_modified_p (t)) + update_stmt_operands (t); +} + +static inline void +get_stmt_operands (tree stmt ATTRIBUTE_UNUSED) +{ +#ifdef ENABLE_CHECKING + stmt_ann_t ann; + + /* The optimizers cannot handle statements that are nothing but a + _DECL. This indicates a bug in the gimplifier. */ + gcc_assert (!SSA_VAR_P (stmt)); + + /* Ignore error statements. */ + if (TREE_CODE (stmt) == ERROR_MARK) + return; + + ann = get_stmt_ann (stmt); + gcc_assert (!ann->modified); + + return; +#endif } /* Return true if T is marked as modified, false otherwise. */ @@ -158,11 +190,306 @@ stmt_modified_p (tree t) stmt_ann_t ann = stmt_ann (t); /* Note that if the statement doesn't yet have an annotation, we consider it - modified. This will force the next call to get_stmt_operands to scan the - statement. */ + modified. This will force the next call to update_stmt_operands to scan + the statement. */ return ann ? ann->modified : true; } +/* Delink an immediate_uses node from its chain. */ +static inline void +delink_imm_use (ssa_imm_use_t *linknode) +{ + /* Return if this node is not in a list. */ + if (linknode->prev == NULL) + return; + + linknode->prev->next = linknode->next; + linknode->next->prev = linknode->prev; + linknode->prev = NULL; + linknode->next = NULL; +} + +/* Link ssa_imm_use node LINKNODE into the chain for LIST. */ +static inline void +link_imm_use_to_list (ssa_imm_use_t *linknode, ssa_imm_use_t *list) +{ + /* Link the new node at the head of the list. If we are in the process of + traversing the list, we wont visit any new nodes added to it. */ + linknode->prev = list; + linknode->next = list->next; + list->next->prev = linknode; + list->next = linknode; +} + +/* Link ssa_imm_use node LINKNODE into the chain for DEF. */ +static inline void +link_imm_use (ssa_imm_use_t *linknode, tree def) +{ + ssa_imm_use_t *root; + + if (!def || TREE_CODE (def) != SSA_NAME) + linknode->prev = NULL; + else + { + root = &(SSA_NAME_IMM_USE_NODE (def)); +#ifdef ENABLE_CHECKING + if (linknode->use) + gcc_assert (*(linknode->use) == def); +#endif + link_imm_use_to_list (linknode, root); + } +} + +/* Set the value of a use pointed by USE to VAL. */ +static inline void +set_ssa_use_from_ptr (use_operand_p use, tree val) +{ + delink_imm_use (use); + *(use->use) = val; + link_imm_use (use, val); +} + + +/* Delink all immediate_use information for STMT. */ +static inline void +delink_stmt_imm_use (tree stmt) +{ + unsigned int x; + use_optype uses = STMT_USE_OPS (stmt); + vuse_optype vuses = STMT_VUSE_OPS (stmt); + v_may_def_optype v_may_defs = STMT_V_MAY_DEF_OPS (stmt); + + for (x = 0; x < NUM_USES (uses); x++) + delink_imm_use (&(uses->uses[x])); + + for (x = 0; x < NUM_VUSES (vuses); x++) + delink_imm_use (&(vuses->vuses[x].imm_use)); + + for (x = 0; x < NUM_V_MAY_DEFS (v_may_defs); x++) + delink_imm_use (&(v_may_defs->v_may_defs[x].imm_use)); +} + +/* Link ssa_imm_use node LINKNODE into the chain for DEF, with use occuring + in STMT. */ +static inline void +link_imm_use_stmt (ssa_imm_use_t *linknode, tree def, tree stmt) +{ + if (stmt) + link_imm_use (linknode, def); + else + link_imm_use (linknode, NULL); + linknode->stmt = stmt; +} + +/* Relink a new node in place of an old node in the list. */ +static inline void +relink_imm_use (ssa_imm_use_t *node, ssa_imm_use_t *old) +{ +#ifdef ENABLE_CHECKING + /* The node one had better be in the same list. */ + if (*(old->use) != *(node->use)) + abort (); +#endif + node->prev = old->prev; + node->next = old->next; + if (old->prev) + { + old->prev->next = node; + old->next->prev = node; + /* Remove the old node from the list. */ + old->prev = NULL; + } + +} + +/* Relink ssa_imm_use node LINKNODE into the chain for OLD, with use occuring + in STMT. */ +static inline void +relink_imm_use_stmt (ssa_imm_use_t *linknode, ssa_imm_use_t *old, tree stmt) +{ + if (stmt) + relink_imm_use (linknode, old); + else + link_imm_use (linknode, NULL); + linknode->stmt = stmt; +} + +/* Finished the traverse of an immediate use list IMM by removing it from + the list. */ +static inline void +end_safe_imm_use_traverse (imm_use_iterator *imm) +{ + delink_imm_use (&(imm->iter_node)); +} + +/* Return true if IMM is at the end of the list. */ +static inline bool +end_safe_imm_use_p (imm_use_iterator *imm) +{ + return (imm->imm_use == imm->end_p); +} + +/* Initialize iterator IMM to process the list for VAR. */ +static inline use_operand_p +first_safe_imm_use (imm_use_iterator *imm, tree var) +{ + /* Set up and link the iterator node into the linked list for VAR. */ + imm->iter_node.use = NULL; + imm->iter_node.stmt = NULL_TREE; + imm->end_p = &(SSA_NAME_IMM_USE_NODE (var)); + /* Check if there are 0 elements. */ + if (imm->end_p->next == imm->end_p) + { + imm->imm_use = imm->end_p; + return NULL_USE_OPERAND_P; + } + + link_imm_use (&(imm->iter_node), var); + imm->imm_use = imm->iter_node.next; + return imm->imm_use; +} + +/* Bump IMM to then next use in the list. */ +static inline use_operand_p +next_safe_imm_use (imm_use_iterator *imm) +{ + ssa_imm_use_t *ptr; + use_operand_p old; + + old = imm->imm_use; + /* If the next node following the iter_node is still the one refered to by + imm_use, then the list hasnt changed, go to the next node. */ + if (imm->iter_node.next == imm->imm_use) + { + ptr = &(imm->iter_node); + /* Remove iternode fromn the list. */ + delink_imm_use (ptr); + imm->imm_use = imm->imm_use->next; + if (! end_safe_imm_use_p (imm)) + { + /* This isnt the end, link iternode before the next use. */ + ptr->prev = imm->imm_use->prev; + ptr->next = imm->imm_use; + imm->imm_use->prev->next = ptr; + imm->imm_use->prev = ptr; + } + else + return old; + } + else + { + /* If the 'next' value after the iterator isn't the same as it was, then + a node has been deleted, so we sinply proceed to the node following + where the iterator is in the list. */ + imm->imm_use = imm->iter_node.next; + if (end_safe_imm_use_p (imm)) + { + end_safe_imm_use_traverse (imm); + return old; + } + } + + return imm->imm_use; +} + +/* Return true is IMM has reached the end of the immeidate use list. */ +static inline bool +end_readonly_imm_use_p (imm_use_iterator *imm) +{ + return (imm->imm_use == imm->end_p); +} + +/* Initialize iterator IMM to process the list for VAR. */ +static inline use_operand_p +first_readonly_imm_use (imm_use_iterator *imm, tree var) +{ + gcc_assert (TREE_CODE (var) == SSA_NAME); + + imm->end_p = &(SSA_NAME_IMM_USE_NODE (var)); + imm->imm_use = imm->end_p->next; +#ifdef ENABLE_CHECKING + imm->iter_node.next = imm->imm_use->next; +#endif + if (end_readonly_imm_use_p (imm)) + return NULL_USE_OPERAND_P; + return imm->imm_use; +} + +/* Bump IMM to then next use in the list. */ +static inline use_operand_p +next_readonly_imm_use (imm_use_iterator *imm) +{ + use_operand_p old = imm->imm_use; + +#ifdef ENABLE_CHECKING + /* If this assertion fails, it indicates the 'next' pointer has changed + since we the last bump. This indicates that the list is being modified + via stmt changes, or SET_USE, or somesuch thing, and you need to be + using the SAFE version of the iterator. */ + gcc_assert (imm->iter_node.next == old->next); + imm->iter_node.next = old->next->next; +#endif + + imm->imm_use = old->next; + if (end_readonly_imm_use_p (imm)) + return old; + return imm->imm_use; +} + +/* Return true if VAR has no uses. */ +static inline bool +has_zero_uses (tree var) +{ + ssa_imm_use_t *ptr; + ptr = &(SSA_NAME_IMM_USE_NODE (var)); + /* A single use means there is no items in the list. */ + return (ptr == ptr->next); +} + +/* Return true if VAR has a single use. */ +static inline bool +has_single_use (tree var) +{ + ssa_imm_use_t *ptr; + ptr = &(SSA_NAME_IMM_USE_NODE (var)); + /* A single use means there is one item in the list. */ + return (ptr != ptr->next && ptr == ptr->next->next); +} + +/* If VAR has only a single immediate use, return true, and set USE_P and STMT + to the use pointer and stmt of occurence. */ +static inline bool +single_imm_use (tree var, use_operand_p *use_p, tree *stmt) +{ + ssa_imm_use_t *ptr; + + ptr = &(SSA_NAME_IMM_USE_NODE (var)); + if (ptr != ptr->next && ptr == ptr->next->next) + { + *use_p = ptr->next; + *stmt = ptr->next->stmt; + return true; + } + *use_p = NULL_USE_OPERAND_P; + *stmt = NULL_TREE; + return false; +} + +/* Return the number of immediate uses of VAR. */ +static inline unsigned int +num_imm_uses (tree var) +{ + ssa_imm_use_t *ptr, *start; + unsigned int num; + + start = &(SSA_NAME_IMM_USE_NODE (var)); + num = 0; + for (ptr = start->next; ptr != start; ptr = ptr->next) + num++; + + return num; +} + /* Return the definitions present in ANN, a statement annotation. Return NULL if this annotation contains no definitions. */ static inline def_optype @@ -208,7 +535,7 @@ get_v_must_def_ops (stmt_ann_t ann) static inline tree get_use_from_ptr (use_operand_p use) { - return *(use.use); + return *(use->use); } /* Return the tree pointer to by DEF. */ @@ -223,7 +550,7 @@ static inline use_operand_p get_use_op_ptr (use_optype uses, unsigned int index) { gcc_assert (index < uses->num_uses); - return uses->uses[index]; + return &(uses->uses[index]); } /* Return a def_operand_p pointer for element INDEX of DEFS. */ @@ -234,7 +561,6 @@ get_def_op_ptr (def_optype defs, unsigned int index) return defs->defs[index]; } - /* Return the def_operand_p that is the V_MAY_DEF_RESULT for the V_MAY_DEF at INDEX in the V_MAY_DEFS array. */ static inline def_operand_p @@ -251,20 +577,16 @@ get_v_may_def_result_ptr(v_may_def_optype v_may_defs, unsigned int index) static inline use_operand_p get_v_may_def_op_ptr(v_may_def_optype v_may_defs, unsigned int index) { - use_operand_p op; gcc_assert (index < v_may_defs->num_v_may_defs); - op.use = &(v_may_defs->v_may_defs[index].use); - return op; + return &(v_may_defs->v_may_defs[index].imm_use); } /* Return a use_operand_p that is at INDEX in the VUSES array. */ static inline use_operand_p get_vuse_op_ptr(vuse_optype vuses, unsigned int index) { - use_operand_p op; gcc_assert (index < vuses->num_vuses); - op.use = &(vuses->vuses[index]); - return op; + return &(vuses->vuses[index].imm_use); } /* Return a def_operand_p that is the V_MUST_DEF_OP for the @@ -291,9 +613,16 @@ get_phi_result_ptr (tree phi) static inline use_operand_p get_phi_arg_def_ptr (tree phi, int i) { - use_operand_p op; - op.use = &(PHI_ARG_DEF_TREE (phi, i)); - return op; + return &(PHI_ARG_IMM_USE_NODE (phi,i)); +} + +/* Set the value of a use pointed by USE to VAL. */ +static inline void +set_ssa_use_from_ptr2 (use_operand_p use, tree val) +{ + delink_imm_use (use); + *(use->use) = val; + link_imm_use (use, val); } /* Return the bitmap of addresses taken by STMT, or NULL if it takes @@ -305,52 +634,6 @@ addresses_taken (tree stmt) return ann ? ann->addresses_taken : NULL; } -/* Return the immediate uses of STMT, or NULL if this information is - not computed. */ -static dataflow_t -get_immediate_uses (tree stmt) -{ - stmt_ann_t ann; - - if (TREE_CODE (stmt) == PHI_NODE) - return PHI_DF (stmt); - - ann = stmt_ann (stmt); - return ann ? ann->df : NULL; -} - -/* Return the number of immediate uses present in the dataflow - information at DF. */ -static inline int -num_immediate_uses (dataflow_t df) -{ - varray_type imm; - - if (!df) - return 0; - - imm = df->immediate_uses; - if (!imm) - return df->uses[1] ? 2 : 1; - - return VARRAY_ACTIVE_SIZE (imm) + 2; -} - -/* Return the tree that is at NUM in the immediate use DF array. */ -static inline tree -immediate_use (dataflow_t df, int num) -{ - if (!df) - return NULL_TREE; - -#ifdef ENABLE_CHECKING - gcc_assert (num < num_immediate_uses (df)); -#endif - if (num < 2) - return df->uses[num]; - return VARRAY_TREE (df->immediate_uses, num - 2); -} - /* Return the basic_block annotation for BB. */ static inline bb_ann_t bb_ann (basic_block bb) @@ -363,8 +646,6 @@ bb_ann (basic_block bb) static inline tree phi_nodes (basic_block bb) { - if (bb->index < 0) - return NULL; return bb_ann (bb)->phi_nodes; } @@ -395,6 +676,37 @@ phi_arg_from_edge (tree phi, edge e) return -1; } +/* Return the phi argument which contains the specified use. */ + +static inline int +phi_arg_index_from_use (use_operand_p use) +{ + struct phi_arg_d *element, *root; + int index; + tree phi; + + /* Since the use is the first thing in a PHI arguemnt element, we can + calculate its index based on casting it to an argument, and performing + pointer arithmetic. */ + + phi = USE_STMT (use); + gcc_assert (TREE_CODE (phi) == PHI_NODE); + + element = (struct phi_arg_d *)use; + root = &(PHI_ARG_ELT (phi, 0)); + index = element - root; + +#ifdef ENABLE_CHECKING + /* Make sure the calculation doesn't have any leftover bytes. If it does, + then imm_use is liekly not the first element in phi_arg_d. */ + gcc_assert ( + (((char *)element - (char *)root) % sizeof (struct phi_arg_d)) == 0); + gcc_assert (index >= 0 && index < PHI_ARG_CAPACITY (phi)); +#endif + + return index; +} + /* Mark VAR as used, so that it'll be preserved during rtl expansion. */ static inline void diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index 96a2e10f1cf..431a9d319db 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -208,43 +208,33 @@ struct var_ann_d GTY(()) }; -struct dataflow_d GTY(()) +typedef struct immediate_use_iterator_d { - /* Immediate uses. This is a list of all the statements and PHI nodes - that are immediately reached by the definitions made in this - statement. */ - varray_type immediate_uses; - - /* Use this array for very small numbers of uses instead of the varray. */ - tree uses[2]; - - /* Reached uses. This is a list of all the possible program statements - that may be reached directly or indirectly by definitions made in this - statement. Notice that this is a superset of IMMEDIATE_USES. - For instance, given the following piece of code: - - 1 a1 = 10; - 2 if (a1 > 3) - 3 a2 = a1 + 5; - 4 a3 = PHI (a1, a2) - 5 b1 = a3 - 2; - - IMMEDIATE_USES for statement #1 are all those statements that use a1 - directly (i.e., #2, #3 and #4). REACHED_USES for statement #1 also - includes statement #5 because 'a1' could reach 'a3' via the PHI node - at statement #4. The set of REACHED_USES is then the transitive - closure over all the PHI nodes in the IMMEDIATE_USES set. */ - - /* Reaching definitions. Similarly to REACHED_USES, the set - REACHING_DEFS is the set of all the statements that make definitions - that may reach this statement. Notice that we don't need to have a - similar entry for immediate definitions, as these are represented by - the SSA_NAME nodes themselves (each SSA_NAME node contains a pointer - to the statement that makes that definition). */ -}; + ssa_imm_use_t *imm_use; + ssa_imm_use_t *end_p; + ssa_imm_use_t iter_node; +} imm_use_iterator; + -typedef struct dataflow_d *dataflow_t; +/* Use this iterator when simply looking at stmts. Adding, deleteing or + modifying stmts will cause this iterator to malfunction. */ + +#define FOR_EACH_IMM_USE_FAST(DEST, ITER, SSAVAR) \ + for ((DEST) = first_readonly_imm_use (&(ITER), (SSAVAR)); \ + !end_readonly_imm_use_p (&(ITER)); \ + (DEST) = next_readonly_imm_use (&(ITER))) + +#define FOR_EACH_IMM_USE_SAFE(DEST, ITER, SSAVAR) \ + for ((DEST) = first_safe_imm_use (&(ITER), (SSAVAR)); \ + !end_safe_imm_use_p (&(ITER)); \ + (DEST) = next_safe_imm_use (&(ITER))) + +#define BREAK_FROM_SAFE_IMM_USE(ITER) \ + { \ + end_safe_imm_use_traverse (&(ITER)); \ + break; \ + } struct stmt_ann_d GTY(()) { @@ -270,11 +260,9 @@ struct stmt_ann_d GTY(()) /* Basic block that contains this statement. */ basic_block GTY ((skip (""))) bb; + /* Operand cache for stmt. */ struct stmt_operands_d operands; - /* Dataflow information. */ - dataflow_t df; - /* Set of variables that have had their address taken in the statement. */ bitmap addresses_taken; @@ -304,8 +292,7 @@ static inline stmt_ann_t get_stmt_ann (tree); static inline enum tree_ann_type ann_type (tree_ann_t); static inline basic_block bb_for_stmt (tree); extern void set_bb_for_stmt (tree, basic_block); -static inline void modify_stmt (tree); -static inline void unmodify_stmt (tree); +static inline void update_stmt (tree); static inline bool stmt_modified_p (tree); static inline varray_type may_aliases (tree); static inline int get_lineno (tree); @@ -317,9 +304,6 @@ static inline vuse_optype get_vuse_ops (stmt_ann_t); static inline use_optype get_use_ops (stmt_ann_t); static inline def_optype get_def_ops (stmt_ann_t); static inline bitmap addresses_taken (tree); -static inline int num_immediate_uses (dataflow_t); -static inline tree immediate_use (dataflow_t, int); -static inline dataflow_t get_immediate_uses (tree); static inline void set_default_def (tree, tree); static inline tree default_def (tree); @@ -403,7 +387,6 @@ extern bool aliases_computed_p; #define PERCENT(x,y) ((float)(x) * 100.0 / (float)(y)) - /*--------------------------------------------------------------------------- Block iterators ---------------------------------------------------------------------------*/ @@ -482,7 +465,6 @@ extern void cfg_remove_useless_stmts (void); extern edge thread_edge (edge, basic_block); extern basic_block label_to_block (tree); extern void tree_optimize_tail_calls (bool, enum tree_dump_index); -extern edge tree_block_forwards_to (basic_block bb); extern void bsi_insert_on_edge (edge, tree); extern basic_block bsi_insert_on_edge_immediate (edge, tree); extern void bsi_commit_edge_inserts (int *); @@ -527,13 +509,6 @@ extern void debug_referenced_vars (void); extern void dump_referenced_vars (FILE *); extern void dump_variable (FILE *, tree); extern void debug_variable (tree); -extern void dump_immediate_uses (FILE *); -extern void debug_immediate_uses (void); -extern void dump_immediate_uses_for (FILE *, tree); -extern void debug_immediate_uses_for (tree); -extern void compute_immediate_uses (int, bool (*)(tree)); -extern void free_df (void); -extern void free_df_for_stmt (tree); extern tree get_virtual_var (tree); extern void add_referenced_tmp_var (tree var); extern void mark_new_vars_to_rename (tree, bitmap); @@ -580,7 +555,7 @@ extern void ssa_remove_edge (edge); extern edge ssa_redirect_edge (edge, basic_block); extern bool tree_ssa_useless_type_conversion (tree); extern bool tree_ssa_useless_type_conversion_1 (tree, tree); -extern void verify_ssa (void); +extern void verify_ssa (bool); extern void delete_tree_ssa (void); extern void register_new_def (tree, varray_type *); extern void walk_use_def_chains (tree, walk_use_def_chains_fn, void *, bool); @@ -742,6 +717,8 @@ extern void build_ssa_operands (tree, stmt_ann_t, stmt_operands_p, /* In tree-loop-linear.c */ extern void linear_transform_loops (struct loops *); +/* In tree-ssa-loop-ivopts.c */ +extern bool expr_invariant_in_loop_p (struct loop *loop, tree expr); /* In gimplify.c */ tree force_gimple_operand (tree, tree *, bool, tree); diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index 88696465856..0d16fc81ac3 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -160,7 +160,6 @@ tree_if_conversion (struct loop *loop, bool for_vectorizer) ifc_bbs = NULL; } free_dominance_info (CDI_POST_DOMINATORS); - free_df (); return false; } @@ -205,7 +204,6 @@ tree_if_conversion (struct loop *loop, bool for_vectorizer) clean_predicate_lists (loop); free (ifc_bbs); ifc_bbs = NULL; - free_df (); return true; } @@ -346,13 +344,11 @@ if_convertable_phi_p (struct loop *loop, basic_block bb, tree phi) if (!is_gimple_reg (SSA_NAME_VAR (PHI_RESULT (phi)))) { - int j; - dataflow_t df = get_immediate_uses (phi); - int num_uses = num_immediate_uses (df); - for (j = 0; j < num_uses; j++) + imm_use_iterator imm_iter; + use_operand_p use_p; + FOR_EACH_IMM_USE_FAST (use_p, imm_iter, PHI_RESULT (phi)) { - tree use = immediate_use (df, j); - if (TREE_CODE (use) == PHI_NODE) + if (TREE_CODE (USE_STMT (use_p)) == PHI_NODE) { if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, "Difficult to handle this virtual phi.\n"); @@ -562,8 +558,6 @@ if_convertable_loop_p (struct loop *loop, bool for_vectorizer ATTRIBUTE_UNUSED) if ( e->flags & EDGE_LOOP_EXIT) return false; - compute_immediate_uses (TDFA_USE_OPS|TDFA_USE_VOPS, NULL); - calculate_dominance_info (CDI_DOMINATORS); calculate_dominance_info (CDI_POST_DOMINATORS); @@ -788,7 +782,7 @@ replace_phi_with_cond_modify_expr (tree phi, tree cond, basic_block true_bb, bsi_insert_after (bsi, new_stmt, BSI_SAME_STMT); bsi_next (bsi); - modify_stmt (new_stmt); + update_stmt (new_stmt); if (dump_file && (dump_flags & TDF_DETAILS)) { diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 38fa455aa10..0583eb42942 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -1475,7 +1475,8 @@ expand_call_inline (tree *tp, int *walk_subtrees, void *data) } else if (warn_inline && DECL_DECLARED_INLINE_P (fn) && !DECL_IN_SYSTEM_HEADER (fn) - && strlen (reason)) + && strlen (reason) + && !lookup_attribute ("noinline", DECL_ATTRIBUTES (fn))) { warning ("%Jinlining failed in call to '%F': %s", fn, fn, reason); warning ("called from here"); diff --git a/gcc/tree-into-ssa.c b/gcc/tree-into-ssa.c index 841938db1a9..84a6904cce2 100644 --- a/gcc/tree-into-ssa.c +++ b/gcc/tree-into-ssa.c @@ -374,7 +374,7 @@ mark_def_sites (struct dom_walk_data *walk_data, /* Mark all the blocks that have definitions for each variable in the VARS_TO_RENAME bitmap. */ stmt = bsi_stmt (bsi); - get_stmt_operands (stmt); + update_stmt_if_modified (stmt); /* If a variable is used before being set, then the variable is live across a block boundary, so mark it live-on-entry to BB. */ @@ -434,7 +434,7 @@ ssa_mark_def_sites (struct dom_walk_data *walk_data, /* Mark all the blocks that have definitions for each variable in the names_to_rename bitmap. */ stmt = bsi_stmt (bsi); - get_stmt_operands (stmt); + update_stmt_if_modified (stmt); /* If a variable is used before being set, then the variable is live across a block boundary, so mark it live-on-entry to BB. */ diff --git a/gcc/tree-loop-linear.c b/gcc/tree-loop-linear.c index de16a1ecf92..72c5b07cb6e 100644 --- a/gcc/tree-loop-linear.c +++ b/gcc/tree-loop-linear.c @@ -365,5 +365,4 @@ linear_transform_loops (struct loops *loops) free_data_refs (datarefs); } rewrite_into_loop_closed_ssa (); - free_df (); } diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c index d2608a837f0..3f500f6f138 100644 --- a/gcc/tree-nested.c +++ b/gcc/tree-nested.c @@ -518,6 +518,7 @@ struct walk_stmt_info tree_stmt_iterator tsi; struct nesting_info *info; bool val_only; + bool changed; }; /* A subroutine of walk_function. Iterate over all sub-statements of *TP. */ @@ -732,6 +733,7 @@ convert_nonlocal_reference (tree *tp, int *walk_subtrees, void *data) tree target_context = decl_function_context (t); struct nesting_info *i; tree x; + wi->changed = true; for (i = info->outer; i->context != target_context; i = i->outer) continue; @@ -770,17 +772,17 @@ convert_nonlocal_reference (tree *tp, int *walk_subtrees, void *data) case ADDR_EXPR: { bool save_val_only = wi->val_only; - tree save_sub = TREE_OPERAND (t, 0); + wi->changed = false; wi->val_only = false; walk_tree (&TREE_OPERAND (t, 0), convert_nonlocal_reference, wi, NULL); wi->val_only = true; - if (save_sub != TREE_OPERAND (t, 0)) + if (wi->changed) { /* If we changed anything, then TREE_INVARIANT is be wrong, since we're no longer directly referencing a decl. */ - TREE_INVARIANT (t) = 0; + recompute_tree_invarant_for_addr_expr (t); /* If the callback converted the address argument in a context where we only accept variables (and min_invariant, presumably), @@ -874,6 +876,7 @@ convert_local_reference (tree *tp, int *walk_subtrees, void *data) field = lookup_field_for_decl (info, t, NO_INSERT); if (!field) break; + wi->changed = true; x = get_frame_field (info, info->context, field, &wi->tsi); if (wi->val_only) @@ -885,17 +888,19 @@ convert_local_reference (tree *tp, int *walk_subtrees, void *data) case ADDR_EXPR: { bool save_val_only = wi->val_only; - tree save_sub = TREE_OPERAND (t, 0); + wi->changed = false; wi->val_only = false; walk_tree (&TREE_OPERAND (t, 0), convert_local_reference, wi, NULL); wi->val_only = save_val_only; /* If we converted anything ... */ - if (TREE_OPERAND (t, 0) != save_sub) + if (wi->changed) { /* Then the frame decl is now addressable. */ TREE_ADDRESSABLE (info->frame_decl) = 1; + + recompute_tree_invarant_for_addr_expr (t); /* If we are in a context where we only accept values, then compute the address into a temporary. */ diff --git a/gcc/tree-optimize.c b/gcc/tree-optimize.c index 1d145dcf73b..bbcbecb516d 100644 --- a/gcc/tree-optimize.c +++ b/gcc/tree-optimize.c @@ -316,7 +316,6 @@ next_pass_1 (struct tree_opt_pass **list, struct tree_opt_pass *pass) } -/* Construct the pass tree. */ void init_tree_optimization_passes (void) @@ -413,8 +412,10 @@ static void execute_pass_list (struct tree_opt_pass *); static unsigned int last_verified; static void -execute_todo (int properties, unsigned int flags) +execute_todo (struct tree_opt_pass *pass, unsigned int flags) { + int properties = pass->properties_required; + if (flags & TODO_rename_vars) { rewrite_into_ssa (false); @@ -437,11 +438,15 @@ execute_todo (int properties, unsigned int flags) } if (flags & TODO_ggc_collect) - ggc_collect (); + { + ggc_collect (); + } #ifdef ENABLE_CHECKING - if (flags & TODO_verify_ssa) - verify_ssa (); + if ((pass->properties_required & PROP_ssa) + && !(pass->properties_destroyed & PROP_ssa)) + verify_ssa (true); + if (flags & TODO_verify_flow) verify_flow_info (); if (flags & TODO_verify_stmts) @@ -465,7 +470,7 @@ execute_one_pass (struct tree_opt_pass *pass) /* Run pre-pass verification. */ todo = pass->todo_flags_start & ~last_verified; if (todo) - execute_todo (pass->properties_required, todo); + execute_todo (pass, todo); /* If a dump file name is present, open it if enabled. */ if (pass->static_pass_number != -1) @@ -511,7 +516,7 @@ execute_one_pass (struct tree_opt_pass *pass) todo = pass->todo_flags_finish; last_verified = todo & TODO_verify_all; if (todo) - execute_todo (pass->properties_provided, todo); + execute_todo (pass, todo); /* Close down timevar and dump file. */ if (pass->tv_id) diff --git a/gcc/tree-outof-ssa.c b/gcc/tree-outof-ssa.c index 827f91d1511..7da0e5920c0 100644 --- a/gcc/tree-outof-ssa.c +++ b/gcc/tree-outof-ssa.c @@ -1634,12 +1634,20 @@ find_replaceable_in_bb (temp_expr_table_p tab, basic_block bb) var_map map = tab->map; value_expr_p p; ssa_op_iter iter; + bitmap_iterator bi; for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi)) { stmt = bsi_stmt (bsi); ann = stmt_ann (stmt); + if (TREE_CODE (stmt) == ASM_EXPR && ASM_VOLATILE_P (stmt)) + { + /* Volatile ASM_EXPRs kill all current expressions. */ + EXECUTE_IF_SET_IN_BITMAP ((tab->partition_in_use), 0, partition, bi) + kill_expr (tab, partition, false); + continue; + } /* Determine if this stmt finishes an existing expression. */ FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_USE) { @@ -1912,8 +1920,6 @@ rewrite_trees (var_map map, tree *values) && (DEF_FROM_PTR (def_p) == USE_OP (uses, 0))) remove = 1; } - if (changed & !remove) - modify_stmt (stmt); } /* Remove any stmts marked for removal. */ @@ -2022,6 +2028,9 @@ remove_ssa_form (FILE *dump, var_map map, int flags) } } + /* we no longer maintain the SSA operand cache at this point. */ + fini_ssa_operands (); + dump_file = save; } diff --git a/gcc/tree-phinodes.c b/gcc/tree-phinodes.c index 6dc5c7692de..ceb12f0ae9e 100644 --- a/gcc/tree-phinodes.c +++ b/gcc/tree-phinodes.c @@ -165,7 +165,7 @@ tree make_phi_node (tree var, int len) { tree phi; - int size; + int size, i; int bucket = NUM_BUCKETS - 2; len = ideal_phi_node_len (len); @@ -208,6 +208,14 @@ make_phi_node (tree var, int len) else SET_PHI_RESULT (phi, make_ssa_name (var, phi)); + for (i = 0; i < len; i++) + { + ssa_imm_use_t * imm; + imm = &(PHI_ARG_IMM_USE_NODE (phi, i)); + imm->use = &(PHI_ARG_DEF_TREE (phi, i)); + imm->prev = NULL; + imm->stmt = phi; + } return phi; } @@ -218,6 +226,14 @@ release_phi_node (tree phi) { int bucket; int len = PHI_ARG_CAPACITY (phi); + int x; + + for (x = 0; x < PHI_NUM_ARGS (phi); x++) + { + ssa_imm_use_t * imm; + imm = &(PHI_ARG_IMM_USE_NODE (phi, x)); + delink_imm_use (imm); + } bucket = len > NUM_BUCKETS - 1 ? NUM_BUCKETS - 1 : len; bucket -= 2; @@ -270,12 +286,25 @@ resize_phi_node (tree *phi, int len) } memcpy (new_phi, *phi, old_size); - old_len = PHI_ARG_CAPACITY (new_phi); + for (i = 0 ; i < old_len; i++) + { + ssa_imm_use_t *imm, *old_imm; + imm = &(PHI_ARG_IMM_USE_NODE (new_phi, i)); + old_imm = &(PHI_ARG_IMM_USE_NODE (*phi, i)); + imm->use = &(PHI_ARG_DEF_TREE (new_phi, i)); + relink_imm_use_stmt (imm, old_imm, new_phi); + } + PHI_ARG_CAPACITY (new_phi) = len; for (i = old_len; i < len; i++) { + ssa_imm_use_t * imm; + imm = &(PHI_ARG_IMM_USE_NODE (new_phi, i)); + imm->use = &(PHI_ARG_DEF_TREE (new_phi, i)); + imm->prev = NULL; + imm->stmt = new_phi; SET_PHI_ARG_DEF (new_phi, i, NULL_TREE); PHI_ARG_EDGE (new_phi, i) = NULL; PHI_ARG_NONZERO (new_phi, i) = false; @@ -441,8 +470,8 @@ remove_phi_node (tree phi, tree prev, basic_block bb) /* If we are deleting the PHI node, then we should release the SSA_NAME node so that it can be reused. */ - release_ssa_name (PHI_RESULT (phi)); release_phi_node (phi); + release_ssa_name (PHI_RESULT (phi)); } else if (phi == phi_nodes (bb)) { @@ -451,8 +480,8 @@ remove_phi_node (tree phi, tree prev, basic_block bb) /* If we are deleting the PHI node, then we should release the SSA_NAME node so that it can be reused. */ - release_ssa_name (PHI_RESULT (phi)); release_phi_node (phi); + release_ssa_name (PHI_RESULT (phi)); } else { diff --git a/gcc/tree-pretty-print.c b/gcc/tree-pretty-print.c index 9337c3856fd..8e09939a698 100644 --- a/gcc/tree-pretty-print.c +++ b/gcc/tree-pretty-print.c @@ -242,6 +242,9 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, && stmt_ann (node)) dump_vops (buffer, node, spc, flags); + if (is_stmt && (flags & TDF_STMTADDR)) + pp_printf (buffer, "<&0x%x> ", (unsigned int)node); + if (dumping_stmts && (flags & TDF_LINENO) && EXPR_HAS_LOCATION (node)) @@ -285,8 +288,26 @@ dump_generic_node (pretty_printer *buffer, tree node, int spc, int flags, } break; - case TREE_VEC: + case TREE_BINFO: dump_generic_node (buffer, BINFO_TYPE (node), spc, flags, false); + + case TREE_VEC: + { + size_t i; + if (TREE_VEC_LENGTH (node) > 0) + { + size_t len = TREE_VEC_LENGTH (node); + for (i = 0; i < len - 1; i++) + { + dump_generic_node (buffer, TREE_VEC_ELT (node, i), spc, flags, + false); + pp_character (buffer, ','); + pp_space (buffer); + } + dump_generic_node (buffer, TREE_VEC_ELT (node, len - 1), spc, + flags, false); + } + } break; case BLOCK: diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index c6e1c4ed872..a73f0e47249 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -1401,7 +1401,7 @@ mark_all_v_defs (tree stmt) tree sym; ssa_op_iter iter; - get_stmt_operands (stmt); + update_stmt_if_modified (stmt); FOR_EACH_SSA_TREE_OPERAND (sym, stmt, iter, SSA_OP_VIRTUAL_DEFS) { @@ -1719,7 +1719,7 @@ scalarize_use (struct sra_elt *elt, tree *expr_p, block_stmt_iterator *bsi, if (is_output) mark_all_v_defs (stmt); *expr_p = elt->replacement; - modify_stmt (stmt); + update_stmt (stmt); } else { @@ -1767,7 +1767,7 @@ scalarize_copy (struct sra_elt *lhs_elt, struct sra_elt *rhs_elt, TREE_OPERAND (stmt, 0) = lhs_elt->replacement; TREE_OPERAND (stmt, 1) = rhs_elt->replacement; - modify_stmt (stmt); + update_stmt (stmt); } else if (lhs_elt->use_block_copy || rhs_elt->use_block_copy) { diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 9dab4c676ac..d6acbeb9f92 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -339,6 +339,19 @@ compute_may_aliases (void) /* Deallocate memory used by aliasing data structures. */ delete_alias_info (ai); + + { + block_stmt_iterator bsi; + basic_block bb; + FOR_EACH_BB (bb) + { + for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi)) + { + update_stmt_if_modified (bsi_stmt (bsi)); + } + } + } + } struct tree_opt_pass pass_may_alias = @@ -713,7 +726,7 @@ compute_points_to_and_addr_escape (struct alias_info *ai) need to re-scan most statements. FIXME: Try to minimize the number of statements re-scanned. It's not really necessary to re-scan *all* statements. */ - modify_stmt (stmt); + mark_stmt_modified (stmt); } } diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index 3e8fa7b5a1c..0d45f3f5668 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -330,16 +330,6 @@ likely_value (tree stmt) } -/* Function indicating whether we ought to include information for VAR - when calculating immediate uses. */ - -static bool -need_imm_uses_for (tree var) -{ - return get_value (var)->lattice_val != VARYING; -} - - /* Initialize local data structures for CCP. */ static void @@ -429,9 +419,6 @@ ccp_initialize (void) } sbitmap_free (is_may_def); - - /* Compute immediate uses for variables we care about. */ - compute_immediate_uses (TDFA_USE_OPS | TDFA_USE_VOPS, need_imm_uses_for); } @@ -588,7 +575,7 @@ substitute_and_fold (void) tree_purge_dead_eh_edges (bb); } else - modify_stmt (stmt); + update_stmt (stmt); } if (dump_file && (dump_flags & TDF_DETAILS)) @@ -2187,7 +2174,7 @@ execute_fold_all_builtins (void) if (result && !set_rhs (stmtp, result)) abort (); } - modify_stmt (*stmtp); + update_stmt (*stmtp); if (maybe_clean_eh_stmt (*stmtp) && tree_purge_dead_eh_edges (bb)) cfg_changed = true; diff --git a/gcc/tree-ssa-dce.c b/gcc/tree-ssa-dce.c index 341b7683040..ffdfcba2239 100644 --- a/gcc/tree-ssa-dce.c +++ b/gcc/tree-ssa-dce.c @@ -336,7 +336,7 @@ mark_stmt_if_obviously_necessary (tree stmt, bool aggressive) statement from being marked necessary, we replace the condition with a constant. The stmt is killed later on in cfg_cleanup. */ COND_EXPR_COND (stmt) = integer_zero_node; - modify_stmt (stmt); + update_stmt (stmt); return; } /* Fall through. */ diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 5d545bd2a26..4f95f9f4558 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -361,6 +361,17 @@ tree_ssa_dominator_optimize (void) bitmap_clear (vars_to_rename); } + { + block_stmt_iterator bsi; + basic_block bb; + FOR_EACH_BB (bb) + { + for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi)) + { + update_stmt_if_modified (bsi_stmt (bsi)); + } + } + } /* Thread jumps, creating duplicate blocks as needed. */ cfg_altered = thread_through_all_blocks (); @@ -424,6 +435,9 @@ tree_ssa_dominator_optimize (void) if (value && !is_gimple_min_invariant (value)) SSA_NAME_VALUE (name) = NULL; } + + + } static bool @@ -1917,7 +1931,7 @@ simplify_cond_and_lookup_avail_expr (tree stmt, /* If this is not a real stmt, ann will be NULL and we avoid processing the operands. */ if (ann) - modify_stmt (stmt); + mark_stmt_modified (stmt); /* Lookup the condition and return its known value if it exists. */ @@ -2161,7 +2175,7 @@ simplify_switch_and_lookup_avail_expr (tree stmt, int insert) if (!fail) { SWITCH_COND (stmt) = def; - modify_stmt (stmt); + mark_stmt_modified (stmt); return lookup_avail_expr (stmt, insert); } @@ -2367,7 +2381,7 @@ eliminate_redundant_computations (struct dom_walk_data *walk_data, retval = true; propagate_tree_value (expr_p, cached_lhs); - modify_stmt (stmt); + mark_stmt_modified (stmt); } return retval; } @@ -2596,7 +2610,7 @@ cprop_operand (tree stmt, use_operand_p op_p) /* And note that we modified this statement. This is now safe, even if we changed virtual operands since we will rescan the statement and rewrite its operands again. */ - modify_stmt (stmt); + mark_stmt_modified (stmt); } return may_have_exposed_new_symbols; } @@ -2658,7 +2672,7 @@ optimize_stmt (struct dom_walk_data *walk_data, basic_block bb, stmt = bsi_stmt (si); - get_stmt_operands (stmt); + update_stmt_if_modified (stmt); ann = stmt_ann (stmt); opt_stats.num_stmts++; may_have_exposed_new_symbols = false; @@ -2828,7 +2842,7 @@ update_rhs_and_lookup_avail_expr (tree stmt, tree new_rhs, bool insert) /* And make sure we record the fact that we modified this statement. */ - modify_stmt (stmt); + mark_stmt_modified (stmt); return cached_lhs; } diff --git a/gcc/tree-ssa-dse.c b/gcc/tree-ssa-dse.c index 93ceaeb0730..7676ae872c2 100644 --- a/gcc/tree-ssa-dse.c +++ b/gcc/tree-ssa-dse.c @@ -94,8 +94,6 @@ static void dse_optimize_stmt (struct dom_walk_data *, block_stmt_iterator); static void dse_record_phis (struct dom_walk_data *, basic_block); static void dse_finalize_block (struct dom_walk_data *, basic_block); -static void fix_phi_uses (tree, tree); -static void fix_stmt_v_may_defs (tree, tree); static void record_voperand_set (bitmap, bitmap *, unsigned int); static unsigned max_stmt_uid; /* Maximal uid of a statement. Uids to phi @@ -124,73 +122,6 @@ need_imm_uses_for (tree var) } -/* Replace uses in PHI which match V_MAY_DEF_RESULTs in STMT with the - corresponding V_MAY_DEF_OP in STMT. */ - -static void -fix_phi_uses (tree phi, tree stmt) -{ - stmt_ann_t ann = stmt_ann (stmt); - v_may_def_optype v_may_defs; - unsigned int i; - int j; - - get_stmt_operands (stmt); - v_may_defs = V_MAY_DEF_OPS (ann); - - /* Walk each V_MAY_DEF in STMT. */ - for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++) - { - tree v_may_def = V_MAY_DEF_RESULT (v_may_defs, i); - - /* Find any uses in the PHI which match V_MAY_DEF and replace - them with the appropriate V_MAY_DEF_OP. */ - for (j = 0; j < PHI_NUM_ARGS (phi); j++) - if (v_may_def == PHI_ARG_DEF (phi, j)) - SET_PHI_ARG_DEF (phi, j, V_MAY_DEF_OP (v_may_defs, i)); - } -} - -/* Replace the V_MAY_DEF_OPs in STMT1 which match V_MAY_DEF_RESULTs - in STMT2 with the appropriate V_MAY_DEF_OPs from STMT2. */ - -static void -fix_stmt_v_may_defs (tree stmt1, tree stmt2) -{ - stmt_ann_t ann1 = stmt_ann (stmt1); - stmt_ann_t ann2 = stmt_ann (stmt2); - v_may_def_optype v_may_defs1; - v_may_def_optype v_may_defs2; - unsigned int i, j; - - get_stmt_operands (stmt1); - get_stmt_operands (stmt2); - v_may_defs1 = V_MAY_DEF_OPS (ann1); - v_may_defs2 = V_MAY_DEF_OPS (ann2); - - /* Walk each V_MAY_DEF_OP in stmt1. */ - for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs1); i++) - { - tree v_may_def1 = V_MAY_DEF_OP (v_may_defs1, i); - - /* Find the appropriate V_MAY_DEF_RESULT in STMT2. */ - for (j = 0; j < NUM_V_MAY_DEFS (v_may_defs2); j++) - { - if (v_may_def1 == V_MAY_DEF_RESULT (v_may_defs2, j)) - { - /* Update. */ - SET_V_MAY_DEF_OP (v_may_defs1, i, V_MAY_DEF_OP (v_may_defs2, j)); - break; - } - } - - /* If we did not find a corresponding V_MAY_DEF_RESULT, then something - has gone terribly wrong. */ - gcc_assert (j != NUM_V_MAY_DEFS (v_may_defs2)); - } -} - - /* Set bit UID in bitmaps GLOBAL and *LOCAL, creating *LOCAL as needed. */ static void record_voperand_set (bitmap global, bitmap *local, unsigned int uid) @@ -261,58 +192,63 @@ dse_optimize_stmt (struct dom_walk_data *walk_data, return; if (TREE_CODE (stmt) == MODIFY_EXPR) { - dataflow_t df = get_immediate_uses (stmt); - unsigned int num_uses = num_immediate_uses (df); - tree use; - tree skipped_phi; - + unsigned int num_uses = 0, count = 0; + use_operand_p first_use_p = NULL_USE_OPERAND_P; + use_operand_p use_p; + tree use, use_stmt; + tree defvar = NULL_TREE, usevar = NULL_TREE; + use_operand_p var2; + def_operand_p var1; + ssa_op_iter op_iter; + + FOR_EACH_SSA_MAYDEF_OPERAND (var1, var2, stmt, op_iter) + { + defvar = DEF_FROM_PTR (var1); + usevar = USE_FROM_PTR (var2); + num_uses += num_imm_uses (defvar); + count++; + if (num_uses > 1 || count > 1) + break; + } - /* If there are no uses then there is nothing left to do. */ - if (num_uses == 0) + if (count == 1 && num_uses == 1) + { + single_imm_use (defvar, &use_p, &use_stmt); + gcc_assert (use_p != NULL_USE_OPERAND_P); + first_use_p = use_p; + use = USE_FROM_PTR (use_p); + } + else { record_voperand_set (dse_gd->stores, &bd->stores, ann->uid); return; } - use = immediate_use (df, 0); - skipped_phi = NULL; - /* Skip through any PHI nodes we have already seen if the PHI represents the only use of this store. Note this does not handle the case where the store has multiple V_MAY_DEFs which all reach a set of PHI nodes in the same block. */ - while (num_uses == 1 - && TREE_CODE (use) == PHI_NODE - && bitmap_bit_p (dse_gd->stores, get_stmt_uid (use))) + while (use_p != NULL_USE_OPERAND_P + && TREE_CODE (use_stmt) == PHI_NODE + && bitmap_bit_p (dse_gd->stores, get_stmt_uid (use_stmt))) { - /* Record the first PHI we skip so that we can fix its - uses if we find that STMT is a dead store. */ - if (!skipped_phi) - skipped_phi = use; - /* Skip past this PHI and loop again in case we had a PHI chain. */ - df = get_immediate_uses (use); - num_uses = num_immediate_uses (df); - use = immediate_use (df, 0); + if (single_imm_use (PHI_RESULT (use_stmt), &use_p, &use_stmt)) + use = USE_FROM_PTR (use_p); } /* If we have precisely one immediate use at this point, then we may have found redundant store. */ - if (num_uses == 1 - && bitmap_bit_p (dse_gd->stores, get_stmt_uid (use)) + if (use_p != NULL_USE_OPERAND_P + && bitmap_bit_p (dse_gd->stores, get_stmt_uid (use_stmt)) && operand_equal_p (TREE_OPERAND (stmt, 0), - TREE_OPERAND (use, 0), 0)) + TREE_OPERAND (use_stmt, 0), 0)) { - /* We need to fix the operands if either the first PHI we - skipped, or the store which we are not deleting if we did - not skip any PHIs. */ - if (skipped_phi) - fix_phi_uses (skipped_phi, stmt); - else - fix_stmt_v_may_defs (use, stmt); + /* We need to fix the operand of the consuming stmt. */ + SET_USE (first_use_p, usevar); if (dump_file && (dump_flags & TDF_DETAILS)) { @@ -321,21 +257,12 @@ dse_optimize_stmt (struct dom_walk_data *walk_data, fprintf (dump_file, "'\n"); } - /* Any immediate uses which reference STMT need to instead - reference the new consumer, either SKIPPED_PHI or USE. - This allows us to cascade dead stores. */ - redirect_immediate_uses (stmt, skipped_phi ? skipped_phi : use); - - /* Be sure to remove any dataflow information attached to - this statement. */ - free_df_for_stmt (stmt); + /* Remove the dead store. */ + bsi_remove (&bsi); /* And release any SSA_NAMEs set in this statement back to the SSA_NAME manager. */ release_defs (stmt); - - /* Finally remove the dead store. */ - bsi_remove (&bsi); } record_voperand_set (dse_gd->stores, &bd->stores, ann->uid); @@ -402,9 +329,6 @@ tree_ssa_dse (void) dominators. */ calculate_dominance_info (CDI_POST_DOMINATORS); - /* We also need immediate use information for virtual operands. */ - compute_immediate_uses (TDFA_USE_VOPS, need_imm_uses_for); - /* Dead store elimination is fundamentally a walk of the post-dominator tree and a backwards walk of statements within each block. */ walk_data.walk_stmts_backward = true; @@ -435,9 +359,6 @@ tree_ssa_dse (void) /* Release the main bitmap. */ BITMAP_XFREE (dse_gd.stores); - /* Free dataflow information. It's probably out of date now anyway. */ - free_df (); - /* For now, just wipe the post-dominator information. */ free_dominance_info (CDI_POST_DOMINATORS); } diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index cbf1fdec578..4ac8a9fba28 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -113,22 +113,12 @@ Boston, MA 02111-1307, USA. */ by record_single_argument_cond_exprs and tested in need_imm_uses_for. */ static bitmap vars; -static bool need_imm_uses_for (tree); static void tree_ssa_forward_propagate_single_use_vars (void); static void record_single_argument_cond_exprs (varray_type, varray_type *, bitmap); static void substitute_single_use_vars (varray_type *, varray_type); -/* Function indicating whether we ought to include information for 'var' - when calculating immediate uses. */ - -static bool -need_imm_uses_for (tree var) -{ - return bitmap_bit_p (vars, SSA_NAME_VERSION (var)); -} - /* Find all COND_EXPRs with a condition that is a naked SSA_NAME or an equality comparison against a constant. @@ -323,28 +313,33 @@ static void substitute_single_use_vars (varray_type *cond_worklist, varray_type vars_worklist) { + use_operand_p use_p; while (VARRAY_ACTIVE_SIZE (vars_worklist) > 0) { tree test_var = VARRAY_TOP_TREE (vars_worklist); - tree def = SSA_NAME_DEF_STMT (test_var); - dataflow_t df; - int j, num_uses, propagated_uses; + tree def_stmt = SSA_NAME_DEF_STMT (test_var); + tree def; + int num_uses, propagated_uses; block_stmt_iterator bsi; + imm_use_iterator imm_iter; VARRAY_POP (vars_worklist); - /* Now compute the immediate uses of TEST_VAR. */ - df = get_immediate_uses (def); - num_uses = num_immediate_uses (df); propagated_uses = 0; + num_uses = 0; + if (NUM_DEFS (STMT_DEF_OPS (def_stmt)) != 1) + continue; + + def = DEF_OP (STMT_DEF_OPS (def_stmt), 0); /* If TEST_VAR is used more than once and is not a boolean set via TRUTH_NOT_EXPR with another SSA_NAME as its argument, then we can not optimize. */ - if (num_uses == 1 + + if (has_single_use (def) || (TREE_CODE (TREE_TYPE (test_var)) == BOOLEAN_TYPE - && TREE_CODE (TREE_OPERAND (def, 1)) == TRUTH_NOT_EXPR - && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (def, 1), 0)) + && TREE_CODE (TREE_OPERAND (def_stmt, 1)) == TRUTH_NOT_EXPR + && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (def_stmt, 1), 0)) == SSA_NAME))) ; else @@ -352,7 +347,7 @@ substitute_single_use_vars (varray_type *cond_worklist, /* Walk over each use and try to forward propagate the RHS of DEF into the use. */ - for (j = 0; j < num_uses; j++) + FOR_EACH_IMM_USE_SAFE (use_p, imm_iter, def) { tree cond_stmt; tree cond; @@ -361,7 +356,8 @@ substitute_single_use_vars (varray_type *cond_worklist, enum tree_code def_rhs_code; tree new_cond; - cond_stmt = immediate_use (df, j); + cond_stmt = USE_STMT (use_p); + num_uses++; /* For now we can only propagate into COND_EXPRs. */ if (TREE_CODE (cond_stmt) != COND_EXPR) @@ -369,7 +365,7 @@ substitute_single_use_vars (varray_type *cond_worklist, cond = COND_EXPR_COND (cond_stmt); cond_code = TREE_CODE (cond); - def_rhs = TREE_OPERAND (def, 1); + def_rhs = TREE_OPERAND (def_stmt, 1); def_rhs_code = TREE_CODE (def_rhs); /* If the definition of the single use variable was from an @@ -457,7 +453,7 @@ substitute_single_use_vars (varray_type *cond_worklist, /* Replace the condition. */ COND_EXPR_COND (cond_stmt) = new_cond; - modify_stmt (cond_stmt); + update_stmt (cond_stmt); propagated_uses++; VARRAY_PUSH_TREE (*cond_worklist, cond_stmt); } @@ -466,11 +462,11 @@ substitute_single_use_vars (varray_type *cond_worklist, Unfortunately, we have to find the defining statement in whatever block it might be in. */ if (num_uses && num_uses == propagated_uses) - for (bsi = bsi_start (bb_for_stmt (def)); + for (bsi = bsi_start (bb_for_stmt (def_stmt)); !bsi_end_p (bsi); bsi_next (&bsi)) { - if (def == bsi_stmt (bsi)) + if (def_stmt == bsi_stmt (bsi)) { bsi_remove (&bsi); break; @@ -509,9 +505,6 @@ tree_ssa_forward_propagate_single_use_vars (void) if (VARRAY_ACTIVE_SIZE (vars_worklist) > 0) { - /* Now compute immediate uses for all the variables we care about. */ - compute_immediate_uses (TDFA_USE_OPS, need_imm_uses_for); - /* We've computed immediate uses, so we can/must clear the VARS bitmap for the next iteration. */ bitmap_clear (vars); @@ -519,12 +512,6 @@ tree_ssa_forward_propagate_single_use_vars (void) /* And optimize. This will drain VARS_WORKLIST and initialize COND_WORKLIST for the next iteration. */ substitute_single_use_vars (&cond_worklist, vars_worklist); - - /* We do not incrementally update the dataflow information - so we must free it here and recompute the necessary bits - on the next iteration. If this turns out to be expensive, - methods for incrementally updating the dataflow are known. */ - free_df (); } } diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c index 27bc1c01d95..068a7d6b0bf 100644 --- a/gcc/tree-ssa-loop-im.c +++ b/gcc/tree-ssa-loop-im.c @@ -929,12 +929,13 @@ single_reachable_address (struct loop *loop, tree stmt, tree *queue = xmalloc (sizeof (tree) * max_uid); sbitmap seen = sbitmap_alloc (max_uid); unsigned in_queue = 1; - dataflow_t df; - unsigned i, n; + unsigned i; struct sra_data sra_data; tree call; tree val; ssa_op_iter iter; + imm_use_iterator imm_iter; + use_operand_p use_p; sbitmap_zero (seen); @@ -992,22 +993,35 @@ single_reachable_address (struct loop *loop, tree stmt, } /* Find uses of virtual names. */ - df = get_immediate_uses (stmt); - n = num_immediate_uses (df); + if (TREE_CODE (stmt) == PHI_NODE) + FOR_EACH_IMM_USE_FAST (use_p, imm_iter, PHI_RESULT (stmt)) + { + tree imm_stmt = USE_STMT (use_p); + + if (!flow_bb_inside_loop_p (loop, bb_for_stmt (imm_stmt))) + continue; + + if (TEST_BIT (seen, get_stmt_uid (imm_stmt))) + continue; + SET_BIT (seen, get_stmt_uid (imm_stmt)); + + queue[in_queue++] = imm_stmt; + } + else + FOR_EACH_SSA_TREE_OPERAND (val, stmt, iter, SSA_OP_VIRTUAL_DEFS) + FOR_EACH_IMM_USE_FAST (use_p, imm_iter, val) + { + tree imm_stmt = USE_STMT (use_p); - for (i = 0; i < n; i++) - { - stmt = immediate_use (df, i); + if (!flow_bb_inside_loop_p (loop, bb_for_stmt (imm_stmt))) + continue; - if (!flow_bb_inside_loop_p (loop, bb_for_stmt (stmt))) - continue; + if (TEST_BIT (seen, get_stmt_uid (imm_stmt))) + continue; + SET_BIT (seen, get_stmt_uid (imm_stmt)); - if (TEST_BIT (seen, get_stmt_uid (stmt))) - continue; - SET_BIT (seen, get_stmt_uid (stmt)); - - queue[in_queue++] = stmt; - } + queue[in_queue++] = imm_stmt; + } } free (queue); @@ -1042,7 +1056,7 @@ rewrite_mem_refs (tree tmp_var, struct mem_ref *mem_refs) } *mem_refs->ref = tmp_var; - modify_stmt (mem_refs->stmt); + update_stmt (mem_refs->stmt); } } @@ -1266,8 +1280,6 @@ determine_lsm (struct loops *loops) stmt_ann (bsi_stmt (bsi))->uid = max_stmt_uid++; } - compute_immediate_uses (TDFA_USE_VOPS, NULL); - /* Pass the loops from the outermost. For each virtual operand loop phi node check whether all the references inside the loop correspond to a single address, and if so, move them. */ @@ -1287,7 +1299,6 @@ determine_lsm (struct loops *loops) loop = loop->outer; if (loop == loops->tree_root) { - free_df (); loop_commit_inserts (); return; } diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c index 4635a023962..73b040344e5 100644 --- a/gcc/tree-ssa-loop-ivcanon.c +++ b/gcc/tree-ssa-loop-ivcanon.c @@ -97,7 +97,7 @@ create_canonical_iv (struct loop *loop, edge exit, tree niter) COND_EXPR_COND (cond) = build2 (cmp, boolean_type_node, var, build_int_cst (type, 0)); - modify_stmt (cond); + update_stmt (cond); } /* Computes an estimated number of insns in LOOP. */ @@ -173,19 +173,20 @@ try_unroll_loop_completely (struct loops *loops ATTRIBUTE_UNUSED, old_cond = COND_EXPR_COND (cond); COND_EXPR_COND (cond) = dont_exit; - modify_stmt (cond); + update_stmt (cond); if (!tree_duplicate_loop_to_header_edge (loop, loop_preheader_edge (loop), loops, n_unroll, NULL, NULL, NULL, NULL, 0)) { COND_EXPR_COND (cond) = old_cond; + update_stmt (cond); return false; } } COND_EXPR_COND (cond) = do_exit; - modify_stmt (cond); + update_stmt (cond); if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, "Unrolled loop %d completely.\n", loop->num); diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 4dae6c9b938..a321412227f 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -1191,7 +1191,7 @@ find_interesting_uses_cond (struct ivopts_data *data, tree stmt, tree *cond_p) /* Returns true if expression EXPR is obviously invariant in LOOP, i.e. if all its operands are defined outside of the LOOP. */ -static bool +bool expr_invariant_in_loop_p (struct loop *loop, tree expr) { basic_block def_bb; @@ -4012,6 +4012,7 @@ rewrite_address_base (block_stmt_iterator *bsi, tree *op, tree with) new_name = make_ssa_name (new_var, copy); } TREE_OPERAND (copy, 0) = new_name; + update_stmt (copy); bsi_insert_before (bsi, copy, BSI_SAME_STMT); with = new_name; @@ -4074,7 +4075,7 @@ rewrite_use_compare (struct ivopts_data *data, *use->op_p = build2 (compare, boolean_type_node, var_at_stmt (data->current_loop, cand, use->stmt), op); - modify_stmt (use->stmt); + update_stmt (use->stmt); return; } @@ -4175,19 +4176,24 @@ compute_phi_arg_on_exit (edge exit, tree stmts, tree op) if (EDGE_COUNT (exit->dest->preds) > 1) split_loop_exit_edge (exit); + /* Ensure there is label in exit->dest, so that we can + insert after it. */ + tree_block_label (exit->dest); + bsi = bsi_after_labels (exit->dest); + if (TREE_CODE (stmts) == STATEMENT_LIST) { for (tsi = tsi_start (stmts); !tsi_end_p (tsi); tsi_next (&tsi)) - protect_loop_closed_ssa_form (exit, tsi_stmt (tsi)); + { + bsi_insert_after (&bsi, tsi_stmt (tsi), BSI_NEW_STMT); + protect_loop_closed_ssa_form (exit, bsi_stmt (bsi)); + } } else - protect_loop_closed_ssa_form (exit, stmts); - - /* Ensure there is label in exit->dest, so that we can - insert after it. */ - tree_block_label (exit->dest); - bsi = bsi_after_labels (exit->dest); - bsi_insert_after (&bsi, stmts, BSI_CONTINUE_LINKING); + { + bsi_insert_after (&bsi, stmts, BSI_NEW_STMT); + protect_loop_closed_ssa_form (exit, bsi_stmt (bsi)); + } if (!op) return; @@ -4306,7 +4312,7 @@ rewrite_use (struct ivopts_data *data, default: gcc_unreachable (); } - modify_stmt (use->stmt); + update_stmt (use->stmt); } /* Rewrite the uses using the selected induction variables. */ diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c index 25c366c1284..5be6d377962 100644 --- a/gcc/tree-ssa-loop-manip.c +++ b/gcc/tree-ssa-loop-manip.c @@ -379,7 +379,7 @@ verify_loop_closed_ssa (void) tree phi; unsigned i; - verify_ssa (); + verify_ssa (false); FOR_EACH_BB (bb) { diff --git a/gcc/tree-ssa-loop-unswitch.c b/gcc/tree-ssa-loop-unswitch.c index d4ab19263ae..8dc33d4bccf 100644 --- a/gcc/tree-ssa-loop-unswitch.c +++ b/gcc/tree-ssa-loop-unswitch.c @@ -252,7 +252,7 @@ tree_unswitch_single_loop (struct loops *loops, struct loop *loop, int num) else break; - modify_stmt (stmt); + update_stmt (stmt); i++; } diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c index ac5f6075f74..df968699833 100644 --- a/gcc/tree-ssa-operands.c +++ b/gcc/tree-ssa-operands.c @@ -124,7 +124,6 @@ tree check_build_stmt; #endif def_operand_p NULL_DEF_OPERAND_P = { NULL }; -use_operand_p NULL_USE_OPERAND_P = { NULL }; static void note_addressable (tree, stmt_ann_t); static void get_expr_operands (tree, tree *, int); @@ -160,7 +159,7 @@ allocate_use_optype (unsigned num) { use_optype use_ops; unsigned size; - size = sizeof (struct use_optype_d) + sizeof (tree *) * (num - 1); + size = sizeof (struct use_optype_d) + sizeof (use_operand_type_t) * (num - 1); use_ops = ggc_alloc (size); use_ops->num_uses = num; return use_ops; @@ -189,7 +188,8 @@ allocate_vuse_optype (unsigned num) { vuse_optype vuse_ops; unsigned size; - size = sizeof (struct vuse_optype_d) + sizeof (tree) * (num - 1); + size = sizeof (struct vuse_optype_d) + + sizeof (vuse_operand_type_t) * (num - 1); vuse_ops = ggc_alloc (size); vuse_ops->num_vuses = num; return vuse_ops; @@ -217,6 +217,10 @@ free_uses (use_optype *uses) { if (*uses) { + unsigned int x; + use_optype use = *uses; + for (x = 0; x < use->num_uses; x++) + delink_imm_use (&(use->uses[x])); ggc_free (*uses); *uses = NULL; } @@ -243,6 +247,10 @@ free_vuses (vuse_optype *vuses) { if (*vuses) { + unsigned int x; + vuse_optype vuse = *vuses; + for (x = 0; x < vuse->num_vuses; x++) + delink_imm_use (&(vuse->vuses[x].imm_use)); ggc_free (*vuses); *vuses = NULL; } @@ -256,6 +264,10 @@ free_v_may_defs (v_may_def_optype *v_may_defs) { if (*v_may_defs) { + unsigned int x; + v_may_def_optype v_may_def = *v_may_defs; + for (x = 0; x < v_may_def->num_v_may_defs; x++) + delink_imm_use (&(v_may_def->v_may_defs[x].imm_use)); ggc_free (*v_may_defs); *v_may_defs = NULL; } @@ -305,6 +317,43 @@ fini_ssa_operands (void) build_v_must_defs = NULL; } +/* Initialize V_USES index INDEX to VAL for STMT. If OLD is present, preserve + the position of the may-def in the immediate_use list. */ + +static inline void +initialize_vuse_operand (vuse_optype vuses, unsigned int index, tree val, + tree stmt, ssa_imm_use_t *old) +{ + vuse_operand_type_t *ptr; + ptr = &(vuses->vuses[index]); + ptr->use = val; + ptr->imm_use.use = &(ptr->use); + if (old) + relink_imm_use_stmt (&(ptr->imm_use), old, stmt); + else + link_imm_use_stmt (&(ptr->imm_use), ptr->use, stmt); +} + + +/* Initialize V_MAY_DEF_OPS index X to be DEF = MAY_DEF <USE> for STMT. If + OLD is present, preserve the position of the may-def in the immediate_use + list. */ + +static inline void +initialize_v_may_def_operand (v_may_def_optype v_may_def_ops, unsigned int x, + tree def, tree use, tree stmt, ssa_imm_use_t *old) +{ + v_may_def_operand_type_t *ptr; + ptr = &(v_may_def_ops->v_may_defs[x]); + ptr->def = def; + ptr->use = use; + ptr->imm_use.use = &(ptr->use); + if (old) + relink_imm_use_stmt (&(ptr->imm_use), old, stmt); + else + link_imm_use_stmt (&(ptr->imm_use), ptr->use, stmt); +} + /* All the finalize_ssa_* routines do the work required to turn the build_ VARRAY into an operand_vector of the appropriate type. The original vector, @@ -315,7 +364,7 @@ fini_ssa_operands (void) /* Return a new def operand vector for STMT, comparing to OLD_OPS_P. */ static def_optype -finalize_ssa_defs (def_optype *old_ops_p, tree stmt ATTRIBUTE_UNUSED) +finalize_ssa_defs (def_optype *old_ops_p, tree stmt) { unsigned num, x; def_optype def_ops, old_ops; @@ -326,13 +375,13 @@ finalize_ssa_defs (def_optype *old_ops_p, tree stmt ATTRIBUTE_UNUSED) return NULL; /* There should only be a single real definition per assignment. */ - gcc_assert (TREE_CODE (stmt) != MODIFY_EXPR || num <= 1); + gcc_assert ((stmt && TREE_CODE (stmt) != MODIFY_EXPR) || num <= 1); old_ops = *old_ops_p; /* Compare old vector and new array. */ build_diff = true; - if (old_ops && old_ops->num_defs == num) + if (stmt && old_ops && old_ops->num_defs == num) { build_diff = false; for (x = 0; x < num; x++) @@ -361,12 +410,41 @@ finalize_ssa_defs (def_optype *old_ops_p, tree stmt ATTRIBUTE_UNUSED) } +/* Make sure PTR is inn the correct immediate use list. Since uses are simply + pointers into the stmt TREE, there is no way of telling if anyone has + changed what this pointer points to via TREE_OPERANDS (exp, 0) = <...>. + THe contents are different, but the the pointer is still the same. This + routine will check to make sure PTR is in the correct list, and if it isn't + put it in the correct list. */ + +static inline void +correct_use_link (ssa_imm_use_t *ptr) +{ + ssa_imm_use_t *prev; + tree root; + + prev = ptr->prev; + if (prev) + { + /* find the root, which has a non-NULL stmt, and a NULL use. */ + while (prev->stmt == NULL || prev->use != NULL) + prev = prev->prev; + root = prev->stmt; + if (root == *(ptr->use)) + return; + } + /* Its in the wrong list if we reach here. */ + delink_imm_use (ptr); + link_imm_use (ptr, *(ptr->use)); +} + + /* Return a new use operand vector for STMT, comparing to OLD_OPS_P. */ static use_optype -finalize_ssa_uses (use_optype *old_ops_p, tree stmt ATTRIBUTE_UNUSED) +finalize_ssa_uses (use_optype *old_ops_p, tree stmt) { - unsigned num, x; + unsigned num, x, num_old, i; use_optype use_ops, old_ops; bool build_diff; @@ -386,30 +464,53 @@ finalize_ssa_uses (use_optype *old_ops_p, tree stmt ATTRIBUTE_UNUSED) } #endif old_ops = *old_ops_p; + num_old = ((stmt && old_ops) ? old_ops->num_uses : 0); /* Check if the old vector and the new array are the same. */ build_diff = true; - if (old_ops && old_ops->num_uses == num) + if (stmt && old_ops && num_old == num) { build_diff = false; for (x = 0; x < num; x++) - if (old_ops->uses[x].use != VARRAY_TREE_PTR (build_uses, x)) - { - build_diff = true; - break; - } + { + tree *var_p = VARRAY_TREE_PTR (build_uses, x); + tree *node = old_ops->uses[x].use; + /* Check the pointer values to see if they are the same. */ + if (node != var_p) + { + build_diff = true; + break; + } + } } if (!build_diff) { use_ops = old_ops; *old_ops_p = NULL; + for (i = 0; i < num_old; i++) + correct_use_link (&(use_ops->uses[i])); } else { use_ops = allocate_use_optype (num); for (x = 0; x < num ; x++) - use_ops->uses[x].use = VARRAY_TREE_PTR (build_uses, x); + { + tree *var = VARRAY_TREE_PTR (build_uses, x); + use_ops->uses[x].use = var; + for (i = 0; i < num_old; i++) + { + ssa_imm_use_t *ptr = &(old_ops->uses[i]); + if (ptr->use == var) + { + relink_imm_use_stmt (&(use_ops->uses[x]), ptr, stmt); + correct_use_link (&(use_ops->uses[x])); + break; + } + } + if (i == num_old) + link_imm_use_stmt (&(use_ops->uses[x]), *var, stmt); + } } VARRAY_POP_ALL (build_uses); @@ -420,7 +521,7 @@ finalize_ssa_uses (use_optype *old_ops_p, tree stmt ATTRIBUTE_UNUSED) /* Return a new v_may_def operand vector for STMT, comparing to OLD_OPS_P. */ static v_may_def_optype -finalize_ssa_v_may_defs (v_may_def_optype *old_ops_p) +finalize_ssa_v_may_defs (v_may_def_optype *old_ops_p, tree stmt) { unsigned num, x, i, old_num; v_may_def_optype v_may_def_ops, old_ops; @@ -435,7 +536,7 @@ finalize_ssa_v_may_defs (v_may_def_optype *old_ops_p) /* Check if the old vector and the new array are the same. */ build_diff = true; - if (old_ops && old_ops->num_v_may_defs == num) + if (stmt && old_ops && old_ops->num_v_may_defs == num) { old_num = num; build_diff = false; @@ -458,6 +559,8 @@ finalize_ssa_v_may_defs (v_may_def_optype *old_ops_p) { v_may_def_ops = old_ops; *old_ops_p = NULL; + for (x = 0; x < num; x++) + correct_use_link (&(v_may_def_ops->v_may_defs[x].imm_use)); } else { @@ -473,14 +576,18 @@ finalize_ssa_v_may_defs (v_may_def_optype *old_ops_p) result = SSA_NAME_VAR (result); if (result == var) { - v_may_def_ops->v_may_defs[x] = old_ops->v_may_defs[i]; + initialize_v_may_def_operand (v_may_def_ops, x, + old_ops->v_may_defs[i].def, + old_ops->v_may_defs[i].use, + stmt, + &(old_ops->v_may_defs[i].imm_use)); break; } } if (i == old_num) { - v_may_def_ops->v_may_defs[x].def = var; - v_may_def_ops->v_may_defs[x].use = var; + initialize_v_may_def_operand (v_may_def_ops, x, var, var, stmt, + NULL); } } } @@ -494,7 +601,7 @@ finalize_ssa_v_may_defs (v_may_def_optype *old_ops_p) /* Return a new vuse operand vector, comparing to OLD_OPS_P. */ static vuse_optype -finalize_ssa_vuses (vuse_optype *old_ops_p) +finalize_ssa_vuses (vuse_optype *old_ops_p, tree stmt) { unsigned num, x, i, num_v_may_defs, old_num; vuse_optype vuse_ops, old_ops; @@ -568,14 +675,14 @@ finalize_ssa_vuses (vuse_optype *old_ops_p) /* Determine whether vuses is the same as the old vector. */ build_diff = true; - if (old_ops && old_ops->num_vuses == num) + if (stmt && old_ops && old_ops->num_vuses == num) { old_num = num; build_diff = false; for (x = 0; x < num ; x++) { tree v; - v = old_ops->vuses[x]; + v = old_ops->vuses[x].use; if (TREE_CODE (v) == SSA_NAME) v = SSA_NAME_VAR (v); if (v != VARRAY_TREE (build_vuses, x)) @@ -592,6 +699,8 @@ finalize_ssa_vuses (vuse_optype *old_ops_p) { vuse_ops = old_ops; *old_ops_p = NULL; + for (x = 0; x < num; x++) + correct_use_link (&(vuse_ops->vuses[x].imm_use)); } else { @@ -602,17 +711,18 @@ finalize_ssa_vuses (vuse_optype *old_ops_p) /* Look for VAR in the old vector, and use that SSA_NAME. */ for (i = 0; i < old_num; i++) { - result = old_ops->vuses[i]; + result = old_ops->vuses[i].use; if (TREE_CODE (result) == SSA_NAME) result = SSA_NAME_VAR (result); if (result == var) { - vuse_ops->vuses[x] = old_ops->vuses[i]; + initialize_vuse_operand (vuse_ops, x, old_ops->vuses[i].use, + stmt, &(old_ops->vuses[i].imm_use)); break; } } if (i == old_num) - vuse_ops->vuses[x] = var; + initialize_vuse_operand (vuse_ops, x, var, stmt, NULL); } } @@ -627,8 +737,7 @@ finalize_ssa_vuses (vuse_optype *old_ops_p) /* Return a new v_must_def operand vector for STMT, comparing to OLD_OPS_P. */ static v_must_def_optype -finalize_ssa_v_must_defs (v_must_def_optype *old_ops_p, - tree stmt ATTRIBUTE_UNUSED) +finalize_ssa_v_must_defs (v_must_def_optype *old_ops_p, tree stmt) { unsigned num, x, i, old_num = 0; v_must_def_optype v_must_def_ops, old_ops; @@ -639,13 +748,13 @@ finalize_ssa_v_must_defs (v_must_def_optype *old_ops_p, return NULL; /* There should only be a single V_MUST_DEF per assignment. */ - gcc_assert (TREE_CODE (stmt) != MODIFY_EXPR || num <= 1); + gcc_assert ((stmt && TREE_CODE (stmt) != MODIFY_EXPR) || num <= 1); old_ops = *old_ops_p; /* Check if the old vector and the new array are the same. */ build_diff = true; - if (old_ops && old_ops->num_v_must_defs == num) + if (stmt && old_ops && old_ops->num_v_must_defs == num) { old_num = num; build_diff = false; @@ -707,8 +816,9 @@ finalize_ssa_stmt_operands (tree stmt, stmt_operands_p old_ops, new_ops->use_ops = finalize_ssa_uses (&(old_ops->use_ops), stmt); new_ops->v_must_def_ops = finalize_ssa_v_must_defs (&(old_ops->v_must_def_ops), stmt); - new_ops->v_may_def_ops = finalize_ssa_v_may_defs (&(old_ops->v_may_def_ops)); - new_ops->vuse_ops = finalize_ssa_vuses (&(old_ops->vuse_ops)); + new_ops->v_may_def_ops + = finalize_ssa_v_may_defs (&(old_ops->v_may_def_ops), stmt); + new_ops->vuse_ops = finalize_ssa_vuses (&(old_ops->vuse_ops), stmt); } @@ -790,46 +900,15 @@ append_v_must_def (tree var) VARRAY_PUSH_TREE (build_v_must_defs, var); } -/* Create an operands cache for STMT, returning it in NEW_OPS. OLD_OPS are the - original operands, and if ANN is non-null, appropriate stmt flags are set - in the stmt's annotation. Note that some fields in old_ops may - change to NULL, although none of the memory they originally pointed to - will be destroyed. It is appropriate to call free_stmt_operands() on - the value returned in old_ops. - - The rationale for this: Certain optimizations wish to examine the difference - between new_ops and old_ops after processing. If a set of operands don't - change, new_ops will simply assume the pointer in old_ops, and the old_ops - pointer will be set to NULL, indicating no memory needs to be cleared. - Usage might appear something like: - old_ops_copy = old_ops = stmt_ann(stmt)->operands; - build_ssa_operands (stmt, NULL, &old_ops, &new_ops); - <* compare old_ops_copy and new_ops *> - free_ssa_operands (old_ops); */ +/* Parse STMT looking for operands. OLD_OPS is the original stmt operand + cache for STMT, if it exested before. When fniished, the various build_* + operand vectors will have potential operands. in them. */ -void -build_ssa_operands (tree stmt, stmt_ann_t ann, stmt_operands_p old_ops, - stmt_operands_p new_ops) +static void +parse_ssa_operands (tree stmt) { enum tree_code code; - tree_ann_t saved_ann = stmt->common.ann; - - /* Replace stmt's annotation with the one passed in for the duration - of the operand building process. This allows "fake" stmts to be built - and not be included in other data structures which can be built here. */ - stmt->common.ann = (tree_ann_t) ann; - - /* Initially assume that the statement has no volatile operands, nor - makes aliased loads or stores. */ - if (ann) - { - ann->has_volatile_ops = false; - ann->makes_aliased_stores = false; - ann->makes_aliased_loads = false; - } - - start_ssa_stmt_operands (); code = TREE_CODE (stmt); switch (code) @@ -894,8 +973,58 @@ build_ssa_operands (tree stmt, stmt_ann_t ann, stmt_operands_p old_ops, get_expr_operands (stmt, &stmt, opf_none); break; } +} + +/* Create an operands cache for STMT, returning it in NEW_OPS. OLD_OPS are the + original operands, and if ANN is non-null, appropriate stmt flags are set + in the stmt's annotation. If ANN is NULL, this is not considered a "real" + stmt, and none of the operands will be entered into their respective + immediate uses tables. This is to allow stmts to be processed when they + are not actually in the CFG. + + Note that some fields in old_ops may change to NULL, although none of the + memory they originally pointed to will be destroyed. It is appropriate + to call free_stmt_operands() on the value returned in old_ops. + + The rationale for this: Certain optimizations wish to examine the difference + between new_ops and old_ops after processing. If a set of operands don't + change, new_ops will simply assume the pointer in old_ops, and the old_ops + pointer will be set to NULL, indicating no memory needs to be cleared. + Usage might appear something like: + + old_ops_copy = old_ops = stmt_ann(stmt)->operands; + build_ssa_operands (stmt, NULL, &old_ops, &new_ops); + <* compare old_ops_copy and new_ops *> + free_ssa_operands (old_ops); */ - finalize_ssa_stmt_operands (stmt, old_ops, new_ops); +void +build_ssa_operands (tree stmt, stmt_ann_t ann, stmt_operands_p old_ops, + stmt_operands_p new_ops) +{ + tree_ann_t saved_ann = stmt->common.ann; + + /* Replace stmt's annotation with the one passed in for the duration + of the operand building process. This allows "fake" stmts to be built + and not be included in other data structures which can be built here. */ + stmt->common.ann = (tree_ann_t) ann; + + /* Initially assume that the statement has no volatile operands, nor + makes aliased loads or stores. */ + if (ann) + { + ann->has_volatile_ops = false; + ann->makes_aliased_stores = false; + ann->makes_aliased_loads = false; + } + + start_ssa_stmt_operands (); + + parse_ssa_operands (stmt); + + if (ann) + finalize_ssa_stmt_operands (stmt, old_ops, new_ops); + else + finalize_ssa_stmt_operands (NULL, old_ops, new_ops); stmt->common.ann = saved_ann; } @@ -920,14 +1049,18 @@ free_ssa_operands (stmt_operands_p ops) /* Get the operands of statement STMT. Note that repeated calls to get_stmt_operands for the same statement will do nothing until the - statement is marked modified by a call to modify_stmt(). */ + statement is marked modified by a call to mark_stmt_modified(). */ void -get_stmt_operands (tree stmt) +update_stmt_operands (tree stmt) { stmt_ann_t ann; stmt_operands_t old_operands; + /* If get_stmt_operands is called before SSA is initialized, dont + do anything. */ + if (build_defs == NULL) + return; /* The optimizers cannot handle statements that are nothing but a _DECL. This indicates a bug in the gimplifier. */ gcc_assert (!SSA_VAR_P (stmt)); @@ -938,9 +1071,7 @@ get_stmt_operands (tree stmt) ann = get_stmt_ann (stmt); - /* If the statement has not been modified, the operands are still valid. */ - if (!ann->modified) - return; + gcc_assert (ann->modified); timevar_push (TV_TREE_OPS); @@ -952,7 +1083,7 @@ get_stmt_operands (tree stmt) /* Clear the modified bit for STMT. Subsequent calls to get_stmt_operands for this statement will do nothing until the - statement is marked modified by a call to modify_stmt(). */ + statement is marked modified by a call to mark_stmt_modified(). */ ann->modified = 0; timevar_pop (TV_TREE_OPS); @@ -1704,7 +1835,7 @@ copy_virtual_operands (tree dst, tree src) { *vuses_new = allocate_vuse_optype (NUM_VUSES (vuses)); for (i = 0; i < NUM_VUSES (vuses); i++) - SET_VUSE_OP (*vuses_new, i, VUSE_OP (vuses, i)); + initialize_vuse_operand (*vuses_new, i, VUSE_OP (vuses, i), dst, NULL); } if (v_may_defs) @@ -1712,15 +1843,17 @@ copy_virtual_operands (tree dst, tree src) *v_may_defs_new = allocate_v_may_def_optype (NUM_V_MAY_DEFS (v_may_defs)); for (i = 0; i < NUM_V_MAY_DEFS (v_may_defs); i++) { - SET_V_MAY_DEF_OP (*v_may_defs_new, i, V_MAY_DEF_OP (v_may_defs, i)); - SET_V_MAY_DEF_RESULT (*v_may_defs_new, i, - V_MAY_DEF_RESULT (v_may_defs, i)); + initialize_v_may_def_operand (*v_may_defs_new, i, + V_MAY_DEF_RESULT (v_may_defs, i), + V_MAY_DEF_OP (v_may_defs, i), dst, + NULL); } } if (v_must_defs) { - *v_must_defs_new = allocate_v_must_def_optype (NUM_V_MUST_DEFS (v_must_defs)); + *v_must_defs_new + = allocate_v_must_def_optype (NUM_V_MUST_DEFS (v_must_defs)); for (i = 0; i < NUM_V_MUST_DEFS (v_must_defs); i++) SET_V_MUST_DEF_OP (*v_must_defs_new, i, V_MUST_DEF_OP (v_must_defs, i)); } @@ -1768,7 +1901,173 @@ create_ssa_artficial_load_stmt (stmt_operands_p old_ops, tree new_stmt) } /* Now set the vuses for this new stmt. */ - ann->operands.vuse_ops = finalize_ssa_vuses (&(tmp.vuse_ops)); + ann->operands.vuse_ops = finalize_ssa_vuses (&(tmp.vuse_ops), NULL); +} + + + +/* Issue immediate use error for VAR to debug file F. */ +static void +verify_abort (FILE *f, ssa_imm_use_t *var) +{ + tree stmt; + stmt = var->stmt; + if (stmt) + { + if (stmt_modified_p(stmt)) + { + fprintf (f, " STMT MODIFIED. - <0x%x> ", (unsigned int)stmt); + print_generic_stmt (f, stmt, TDF_SLIM); + } + } + fprintf (f, " IMM ERROR : (use_p : tree: 0x%X:0x%x)", (unsigned int)var, + (unsigned int)var->use); + print_generic_expr (f, USE_FROM_PTR (var), TDF_SLIM); + fprintf(f, "\n"); +} + + +/* Scan the immediate_use list for VAR making sure its linked properly. + return RTUE iof there is a problem. */ + +bool +verify_imm_links (FILE *f, tree var) +{ + ssa_imm_use_t *ptr, *prev; + ssa_imm_use_t *list; + int count; + + gcc_assert (TREE_CODE (var) == SSA_NAME); + + list = &(SSA_NAME_IMM_USE_NODE (var)); + gcc_assert (list->use == NULL); + + if (list->prev == NULL) + { + gcc_assert (list->next == NULL); + return false; + } + + prev = list; + count = 0; + for (ptr = list->next; ptr != list; ) + { + if (prev != ptr->prev) + { + verify_abort (f, ptr); + return true; + } + + if (ptr->use == NULL) + { + verify_abort (f, ptr); /* 2 roots, or SAFE guard node. */ + return true; + } + else + if (*(ptr->use) != var) + { + verify_abort (f, ptr); + return true; + } + + prev = ptr; + ptr = ptr->next; + /* Avoid infinite loops. */ + if (count++ > 30000) + { + verify_abort (f, ptr); + return true; + } + } + + /* Verify list in the other direction. */ + prev = list; + for (ptr = list->prev; ptr != list; ) + { + if (prev != ptr->next) + { + verify_abort (f, ptr); + return true; + } + prev = ptr; + ptr = ptr->prev; + if (count-- < 0) + { + verify_abort (f, ptr); + return true; + } + } + + if (count != 0) + { + verify_abort (f, ptr); + return true; + } + + return false; +} + + +/* Dump all the immediate uses to FILE. */ + +void +dump_immediate_uses_for (FILE *file, tree var) +{ + imm_use_iterator iter; + use_operand_p use_p; + + gcc_assert (var && TREE_CODE (var) == SSA_NAME); + + print_generic_expr (file, var, TDF_SLIM); + fprintf (file, " : -->"); + if (has_zero_uses (var)) + fprintf (file, " no uses.\n"); + else + if (has_single_use (var)) + fprintf (file, " single use.\n"); + else + fprintf (file, "%d uses.\n", num_imm_uses (var)); + + FOR_EACH_IMM_USE_FAST (use_p, iter, var) + { + print_generic_stmt (file, USE_STMT (use_p), TDF_SLIM); + } + fprintf(file, "\n"); +} + +/* Dump all the immediate uses to FILE. */ + +void +dump_immediate_uses (FILE *file) +{ + tree var; + unsigned int x; + + fprintf (file, "Immediate_uses: \n\n"); + for (x = 1; x < num_ssa_names; x++) + { + var = ssa_name(x); + if (!var) + continue; + dump_immediate_uses_for (file, var); + } +} + + +/* Dump def-use edges on stderr. */ + +void +debug_immediate_uses (void) +{ + dump_immediate_uses (stderr); +} + +/* Dump def-use edges on stderr. */ + +void +debug_immediate_uses_for (tree var) +{ + dump_immediate_uses_for (stderr, var); } #include "gt-tree-ssa-operands.h" diff --git a/gcc/tree-ssa-operands.h b/gcc/tree-ssa-operands.h index ad0a916f9ba..939488dedb3 100644 --- a/gcc/tree-ssa-operands.h +++ b/gcc/tree-ssa-operands.h @@ -31,13 +31,10 @@ typedef struct def_operand_ptr GTY(()) } def_operand_p; /* This represents a pointer to a USE operand. */ -typedef struct use_operand_ptr GTY(()) -{ - tree * GTY((skip(""))) use; -} use_operand_p; +typedef ssa_imm_use_t *use_operand_p; +#define NULL_USE_OPERAND_P NULL extern def_operand_p NULL_DEF_OPERAND_P; -extern use_operand_p NULL_USE_OPERAND_P; /* This represents the DEF operands of a stmt. */ typedef struct def_optype_d GTY(()) @@ -48,20 +45,24 @@ typedef struct def_optype_d GTY(()) typedef def_optype_t *def_optype; +/* Operand type which uses a pointer to a tree ihn an immediate use. */ +typedef ssa_imm_use_t use_operand_type_t; + /* This represents the USE operands of a stmt. */ typedef struct use_optype_d GTY(()) { unsigned num_uses; - struct use_operand_ptr GTY((length("%h.num_uses"))) uses[1]; + struct ssa_imm_use_d GTY((length("%h.num_uses"))) uses[1]; } use_optype_t; typedef use_optype_t *use_optype; -/* Operand type which stores a def and a use tree. */ +/* Operand type which stores a def, a use, and an immediate use. */ typedef struct v_may_def_operand_type GTY(()) { tree def; tree use; + ssa_imm_use_t imm_use; } v_may_def_operand_type_t; /* This represents the MAY_DEFS for a stmt. */ @@ -74,11 +75,18 @@ typedef struct v_may_def_optype_d GTY(()) typedef v_may_def_optype_t *v_may_def_optype; +/* Operand type which stores a tree and an immeidate_use. */ +typedef struct vuse_operand_type GTY(()) +{ + tree use; + ssa_imm_use_t imm_use; +} vuse_operand_type_t; + /* This represents the VUSEs for a stmt. */ typedef struct vuse_optype_d GTY(()) { unsigned num_vuses; - tree GTY((length ("%h.num_vuses"))) vuses[1]; + struct vuse_operand_type GTY((length ("%h.num_vuses"))) vuses[1]; } vuse_optype_t; typedef vuse_optype_t *vuse_optype; @@ -109,9 +117,10 @@ typedef stmt_operands_t *stmt_operands_p; #define USE_FROM_PTR(OP) get_use_from_ptr (OP) #define DEF_FROM_PTR(OP) get_def_from_ptr (OP) -#define SET_USE(OP, V) ((*((OP).use)) = (V)) +#define SET_USE(OP, V) set_ssa_use_from_ptr (OP, V) #define SET_DEF(OP, V) ((*((OP).def)) = (V)) +#define USE_STMT(OP) (OP)->stmt #define USE_OPS(ANN) get_use_ops (ANN) #define STMT_USE_OPS(STMT) get_use_ops (stmt_ann (STMT)) @@ -179,13 +188,20 @@ typedef stmt_operands_t *stmt_operands_p; PHI_ARG_DEF_PTR ((PHI), \ phi_arg_from_edge ((PHI),(E))) +#define PHI_ARG_INDEX_FROM_USE(USE) phi_arg_index_from_use (USE) extern void init_ssa_operands (void); extern void fini_ssa_operands (void); -extern void get_stmt_operands (tree); +extern void update_stmt_operands (tree); +extern bool verify_imm_links (FILE *f, tree var); + extern void copy_virtual_operands (tree, tree); extern void create_ssa_artficial_load_stmt (stmt_operands_p, tree); +extern void dump_immediate_uses (FILE *file); +extern void dump_immediate_uses_for (FILE *file, tree var); +extern void debug_immediate_uses (void); +extern void debug_immediate_uses_for (tree var); /* This structure is used in the operand iterator loops. It contains the items required to determine which operand is retrieved next. During diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 3d505b5579b..cb0188ade69 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -1882,7 +1882,7 @@ eliminate (void) } pre_stats.eliminations++; propagate_tree_value (rhs_p, sprime); - modify_stmt (stmt); + update_stmt (stmt); /* If we removed EH side effects from the statement, clean its EH information. */ @@ -1941,7 +1941,7 @@ init_pre (void) unary_node_pool = create_alloc_pool ("Unary tree nodes", tree_code_size (NEGATE_EXPR), 30); reference_node_pool = create_alloc_pool ("Reference tree nodes", - tree_code_size (COMPONENT_REF), 30); + tree_code_size (ARRAY_REF), 30); FOR_ALL_BB (bb) { EXP_GEN (bb) = set_new (true); diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c index 6fab4f46242..b27d9d38b3e 100644 --- a/gcc/tree-ssa-propagate.c +++ b/gcc/tree-ssa-propagate.c @@ -234,14 +234,12 @@ cfg_blocks_get (void) static void add_ssa_edge (tree var, bool is_varying) { - tree stmt = SSA_NAME_DEF_STMT (var); - dataflow_t df = get_immediate_uses (stmt); - int num_uses = num_immediate_uses (df); - int i; + imm_use_iterator iter; + use_operand_p use_p; - for (i = 0; i < num_uses; i++) + FOR_EACH_IMM_USE_FAST (use_p, iter, var) { - tree use_stmt = immediate_use (df, i); + tree use_stmt = USE_STMT (use_p); if (!DONT_SIMULATE_AGAIN (use_stmt) && !STMT_IN_SSA_EDGE_WORKLIST (use_stmt)) @@ -514,7 +512,6 @@ ssa_prop_fini (void) cfg_blocks = NULL; sbitmap_free (bb_in_list); sbitmap_free (executable_blocks); - free_df (); } diff --git a/gcc/tree-ssa-threadupdate.c b/gcc/tree-ssa-threadupdate.c index 2a39c2cace7..6269b858291 100644 --- a/gcc/tree-ssa-threadupdate.c +++ b/gcc/tree-ssa-threadupdate.c @@ -122,7 +122,7 @@ copy_phis_to_block (basic_block new_bb, basic_block bb, edge e) /* Extract the argument corresponding to E from the current PHI node in BB. */ - arg = PHI_ARG_DEF_TREE (phi, phi_arg_from_edge (phi, e)); + arg = PHI_ARG_DEF (phi, phi_arg_from_edge (phi, e)); /* Now add that same argument to the new PHI node in block NEW_BB. */ add_phi_arg (&new_phi, arg, e); @@ -317,7 +317,7 @@ thread_block (basic_block bb) for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi)) { int indx = phi_arg_from_edge (phi, rd->outgoing_edge); - add_phi_arg (&phi, PHI_ARG_DEF_TREE (phi, indx), e); + add_phi_arg (&phi, PHI_ARG_DEF (phi, indx), e); } } diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index 4b79989d502..44c0e88ab74 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -109,6 +109,11 @@ ssa_redirect_edge (edge e, basic_block dest) static bool verify_ssa_name (tree ssa_name, bool is_virtual) { + + if (!TREE_VISITED (ssa_name)) + if (verify_imm_links (stderr, ssa_name)) + return true; + TREE_VISITED (ssa_name) = 1; if (TREE_CODE (ssa_name) != SSA_NAME) @@ -213,11 +218,12 @@ err: that are defined before STMT in basic block BB. */ static bool -verify_use (basic_block bb, basic_block def_bb, tree ssa_name, +verify_use (basic_block bb, basic_block def_bb, use_operand_p use_p, tree stmt, bool check_abnormal, bool is_virtual, bitmap names_defined_in_bb) { bool err = false; + tree ssa_name = USE_FROM_PTR (use_p); err = verify_ssa_name (ssa_name, is_virtual); @@ -251,6 +257,27 @@ verify_use (basic_block bb, basic_block def_bb, tree ssa_name, err = true; } + /* Make sure the use is in an appropriate list by checking the previous + element to make sure its the same. */ + if (use_p->prev == NULL) + { + error ("No immediate_use list"); + err = true; + } + else + { + tree listvar ; + if (use_p->prev->use == NULL) + listvar = use_p->prev->stmt; + else + listvar = USE_FROM_PTR (use_p->prev); + if (listvar != ssa_name) + { + error ("Wrong immediate use list"); + err = true; + } + } + if (err) { fprintf (stderr, "for SSA_NAME: "); @@ -286,12 +313,13 @@ verify_phi_args (tree phi, basic_block bb, basic_block *definition_block) for (i = 0; i < phi_num_args; i++) { - tree op = PHI_ARG_DEF (phi, i); + use_operand_p op_p = PHI_ARG_DEF_PTR (phi, i); + tree op = USE_FROM_PTR (op_p); e = PHI_ARG_EDGE (phi, i); if (TREE_CODE (op) == SSA_NAME) - err = verify_use (e->src, definition_block[SSA_NAME_VERSION (op)], op, + err = verify_use (e->src, definition_block[SSA_NAME_VERSION (op)], op_p, phi, e->flags & EDGE_ABNORMAL, !is_gimple_reg (PHI_RESULT (phi)), NULL); @@ -514,7 +542,7 @@ verify_alias_info (void) TODO: verify the variable annotations. */ void -verify_ssa (void) +verify_ssa (bool check_modified_stmt) { size_t i; basic_block bb; @@ -563,7 +591,13 @@ verify_ssa (void) tree stmt; stmt = bsi_stmt (bsi); - get_stmt_operands (stmt); + if (check_modified_stmt && stmt_modified_p (stmt)) + { + error ("Stmt (0x%x) marked modified after optimization pass : ", + (unsigned long)stmt); + print_generic_stmt (stderr, stmt, TDF_VOPS); + goto err; + } if (stmt_ann (stmt)->makes_aliased_stores && NUM_V_MAY_DEFS (STMT_V_MAY_DEF_OPS (stmt)) == 0) @@ -621,19 +655,21 @@ verify_ssa (void) for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi)) { tree stmt = bsi_stmt (bsi); - - FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_VIRTUAL_USES) + use_operand_p use_p; + FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_VIRTUAL_USES) { + op = USE_FROM_PTR (use_p); if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)], - op, stmt, false, true, + use_p, stmt, false, true, names_defined_in_bb)) goto err; } - FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_USE) + FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE) { + op = USE_FROM_PTR (use_p); if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)], - op, stmt, false, false, + use_p, stmt, false, false, names_defined_in_bb)) goto err; } @@ -651,12 +687,13 @@ verify_ssa (void) for (phi = phi_nodes (e->dest); phi; phi = PHI_CHAIN (phi)) { bool virtual = !is_gimple_reg (PHI_RESULT (phi)); - op = PHI_ARG_DEF_FROM_EDGE (phi, e); + use_operand_p use_p = PHI_ARG_DEF_PTR_FROM_EDGE (phi, e); + op = USE_FROM_PTR (use_p); if (TREE_CODE (op) != SSA_NAME) continue; if (verify_use (bb, definition_block[SSA_NAME_VERSION (op)], - op, phi, false, virtual, + use_p, phi, false, virtual, names_defined_in_bb)) goto err; } @@ -733,7 +770,10 @@ delete_tree_ssa (void) fini_ssanames (); fini_phinodes (); - fini_ssa_operands (); + /* ssa operands are freed by the out of ssa pass if optimizing. */ + if (optimize < 1) + fini_ssa_operands (); + global_var = NULL_TREE; BITMAP_XFREE (call_clobbered_vars); @@ -936,8 +976,8 @@ walk_use_def_chains (tree var, walk_use_def_chains_fn fn, void *data, /* Replaces VAR with REPL in memory reference expression *X in statement STMT. */ -static void -propagate_into_addr (tree stmt, tree var, tree *x, tree repl) +static bool +propagate_into_addr (tree stmt, use_operand_p use_p, tree *x, tree repl) { tree new_var, ass_stmt, addr_var; basic_block bb; @@ -945,7 +985,7 @@ propagate_into_addr (tree stmt, tree var, tree *x, tree repl) /* There is nothing special to handle in the other cases. */ if (TREE_CODE (repl) != ADDR_EXPR) - return; + return false; addr_var = TREE_OPERAND (repl, 0); while (handled_component_p (*x) @@ -953,22 +993,24 @@ propagate_into_addr (tree stmt, tree var, tree *x, tree repl) || TREE_CODE (*x) == IMAGPART_EXPR) x = &TREE_OPERAND (*x, 0); + /* Heres a hack but since KRPhinodes is going away soon, Im not going to + sweat it. */ if (TREE_CODE (*x) != INDIRECT_REF - || TREE_OPERAND (*x, 0) != var) - return; + || &(TREE_OPERAND (*x, 0)) != use_p->use) /* HACK ALERT. */ + return false; if (TREE_TYPE (*x) == TREE_TYPE (addr_var)) { *x = addr_var; mark_new_vars_to_rename (stmt, vars_to_rename); - return; + return true; } /* Frontends sometimes produce expressions like *&a instead of a[0]. Create a temporary variable to handle this case. */ ass_stmt = build2 (MODIFY_EXPR, void_type_node, NULL_TREE, repl); - new_var = duplicate_ssa_name (var, ass_stmt); + new_var = duplicate_ssa_name (USE_FROM_PTR (use_p), ass_stmt); TREE_OPERAND (*x, 0) = new_var; TREE_OPERAND (ass_stmt, 0) = new_var; @@ -978,6 +1020,7 @@ propagate_into_addr (tree stmt, tree var, tree *x, tree repl) bsi_insert_after (&bsi, ass_stmt, BSI_NEW_STMT); mark_new_vars_to_rename (stmt, vars_to_rename); + return true; } /* Replaces immediate uses of VAR by REPL. */ @@ -985,57 +1028,55 @@ propagate_into_addr (tree stmt, tree var, tree *x, tree repl) static void replace_immediate_uses (tree var, tree repl) { - int i, j, n; - dataflow_t df; tree stmt; bool mark_new_vars; - ssa_op_iter iter; - use_operand_p use_p; - - df = get_immediate_uses (SSA_NAME_DEF_STMT (var)); - n = num_immediate_uses (df); + use_operand_p imm_use; + imm_use_iterator imm_iter; - for (i = 0; i < n; i++) + FOR_EACH_IMM_USE_SAFE (imm_use, imm_iter, var) { - stmt = immediate_use (df, i); + stmt = USE_STMT (imm_use); if (TREE_CODE (stmt) == PHI_NODE) { - for (j = 0; j < PHI_NUM_ARGS (stmt); j++) - if (PHI_ARG_DEF (stmt, j) == var) - { - SET_PHI_ARG_DEF (stmt, j, repl); - if (TREE_CODE (repl) == SSA_NAME - && PHI_ARG_EDGE (stmt, j)->flags & EDGE_ABNORMAL) - SSA_NAME_OCCURS_IN_ABNORMAL_PHI (repl) = 1; - } + int index = PHI_ARG_INDEX_FROM_USE (imm_use); +#ifdef ENABLE_CHECKING + gcc_assert (&(PHI_ARG_IMM_USE_NODE (stmt, index)) == imm_use); +#endif + SET_USE (imm_use, repl); + if (TREE_CODE (repl) == SSA_NAME + && PHI_ARG_EDGE (stmt, index)->flags & EDGE_ABNORMAL) + SSA_NAME_OCCURS_IN_ABNORMAL_PHI (repl) = 1; continue; } - get_stmt_operands (stmt); + gcc_assert (!stmt_modified_p (stmt)); + mark_new_vars = false; if (is_gimple_reg (SSA_NAME_VAR (var))) { + bool propagated = false; if (TREE_CODE (stmt) == MODIFY_EXPR) { - propagate_into_addr (stmt, var, &TREE_OPERAND (stmt, 0), repl); - propagate_into_addr (stmt, var, &TREE_OPERAND (stmt, 1), repl); + if (TREE_CODE (repl) == ADDR_EXPR) + { + propagated = + propagate_into_addr (stmt, imm_use, &TREE_OPERAND (stmt, 0), + repl); + if (!propagated) + propagated = + propagate_into_addr (stmt, imm_use, + &TREE_OPERAND (stmt, 1), repl); + } } - FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE) - if (USE_FROM_PTR (use_p) == var) - { - propagate_value (use_p, repl); - mark_new_vars = POINTER_TYPE_P (TREE_TYPE (repl)); - } + if (!propagated) + propagate_value (imm_use, repl); + mark_new_vars = POINTER_TYPE_P (TREE_TYPE (repl)); } else - { - FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_VIRTUAL_USES) - if (USE_FROM_PTR (use_p) == var) - propagate_value (use_p, repl); - } + propagate_value (imm_use, repl); /* FIXME. If REPL is a constant, we need to fold STMT. However, fold_stmt wants a pointer to the statement, because @@ -1064,8 +1105,9 @@ replace_immediate_uses (tree var, tree repl) if (mark_new_vars) mark_new_vars_to_rename (stmt, vars_to_rename); else - modify_stmt (stmt); + update_stmt (stmt); } + } /* Gets the value VAR is equivalent to according to EQ_TO. */ @@ -1105,8 +1147,9 @@ static void check_phi_redundancy (tree phi, tree *eq_to) { tree val = NULL_TREE, def, res = PHI_RESULT (phi), stmt; - unsigned i, ver = SSA_NAME_VERSION (res), n; - dataflow_t df; + unsigned i, ver = SSA_NAME_VERSION (res); + imm_use_iterator imm_iter; + use_operand_p use_p; /* It is unlikely that such large phi node would be redundant. */ if (PHI_NUM_ARGS (phi) > 16) @@ -1142,13 +1185,9 @@ check_phi_redundancy (tree phi, tree *eq_to) eq_to[ver] = val; - df = get_immediate_uses (SSA_NAME_DEF_STMT (res)); - n = num_immediate_uses (df); - - for (i = 0; i < n; i++) + FOR_EACH_IMM_USE_FAST (use_p, imm_iter, res) { - stmt = immediate_use (df, i); - + stmt = USE_STMT (use_p); if (TREE_CODE (stmt) == PHI_NODE) check_phi_redundancy (stmt, eq_to); } @@ -1188,12 +1227,6 @@ kill_redundant_phi_nodes (void) it safe). */ eq_to = xcalloc (num_ssa_names, sizeof (tree)); - /* We have had cases where computing immediate uses takes a - significant amount of compile time. If we run into such - problems here, we may want to only compute immediate uses for - a subset of all the SSA_NAMEs instead of computing it for - all of the SSA_NAMEs. */ - compute_immediate_uses (TDFA_USE_OPS | TDFA_USE_VOPS, NULL); old_num_ssa_names = num_ssa_names; FOR_EACH_BB (bb) @@ -1230,7 +1263,6 @@ kill_redundant_phi_nodes (void) } } - free_df (); free (eq_to); } diff --git a/gcc/tree-ssanames.c b/gcc/tree-ssanames.c index 0d8ccf81b16..848fa4f3cd1 100644 --- a/gcc/tree-ssanames.c +++ b/gcc/tree-ssanames.c @@ -180,6 +180,7 @@ tree make_ssa_name (tree var, tree stmt) { tree t; + ssa_imm_use_t *imm; gcc_assert (DECL_P (var) || TREE_CODE (var) == INDIRECT_REF); @@ -215,6 +216,11 @@ make_ssa_name (tree var, tree stmt) SSA_NAME_DEF_STMT (t) = stmt; SSA_NAME_PTR_INFO (t) = NULL; SSA_NAME_IN_FREE_LIST (t) = 0; + imm = &(SSA_NAME_IMM_USE_NODE (t)); + imm->use = NULL; + imm->prev = imm; + imm->next = imm; + imm->stmt = t; return t; } @@ -256,10 +262,26 @@ release_ssa_name (tree var) { tree saved_ssa_name_var = SSA_NAME_VAR (var); int saved_ssa_name_version = SSA_NAME_VERSION (var); + ssa_imm_use_t *imm = &(SSA_NAME_IMM_USE_NODE (var)); + +#ifdef ENABLE_CHECKING + verify_imm_links (stderr, var); +#endif + while (imm->next != imm) + { + delink_imm_use (imm->next); + } +#ifdef ENABLE_CHECKING + if (imm->next != imm) + abort(); +#endif VARRAY_TREE (ssa_names, SSA_NAME_VERSION (var)) = NULL; memset (var, 0, tree_size (var)); + imm->prev = imm; + imm->next = imm; + imm->stmt = var; /* First put back the right tree node so that the tree checking macros do not complain. */ TREE_SET_CODE (var, SSA_NAME); diff --git a/gcc/tree-tailcall.c b/gcc/tree-tailcall.c index a6c44933f79..8d4b2bcf904 100644 --- a/gcc/tree-tailcall.c +++ b/gcc/tree-tailcall.c @@ -431,15 +431,27 @@ find_tail_calls (basic_block bb, struct tailcall **ret) param = TREE_CHAIN (param), args = TREE_CHAIN (args)) { tree arg = TREE_VALUE (args); - if (param != arg - /* Make sure there are no problems with copying. Note we must + if (param != arg) + { + /* Make sure there are no problems with copying. The parameter have a copyable type and the two arguments must have reasonably equivalent types. The latter requirement could be relaxed if we emitted a suitable type conversion statement. */ - && (!is_gimple_reg_type (TREE_TYPE (param)) + if (!is_gimple_reg_type (TREE_TYPE (param)) || !lang_hooks.types_compatible_p (TREE_TYPE (param), - TREE_TYPE (arg)))) - break; + TREE_TYPE (arg))) + break; + + /* The parameter should be a real operand, so that phi node + created for it at the start of the function has the meaning + of copying the value. This test implies is_gimple_reg_type + from the previous condition, however this one could be + relaxed by being more careful with copying the new value + of the parameter (emitting appropriate MODIFY_EXPR and + updating the virtual operands). */ + if (!is_gimple_reg (param)) + break; + } } if (!args && !param) tail_recursion = true; @@ -645,7 +657,7 @@ adjust_return_value (basic_block bb, tree m, tree a) } TREE_OPERAND (ret_stmt, 0) = var; - modify_stmt (ret_stmt); + update_stmt (ret_stmt); } /* Eliminates tail call described by T. TMP_VARS is a list of @@ -884,7 +896,11 @@ tree_optimize_tail_calls_1 (bool opt_tailcalls) add_referenced_tmp_var (tmp); phi = create_phi_node (tmp, first); - add_phi_arg (&phi, build_int_cst (ret_type, 0), EDGE_PRED (first, 0)); + add_phi_arg (&phi, + /* RET_TYPE can be a float when -ffast-maths is + enabled. */ + fold_convert (ret_type, integer_zero_node), + EDGE_PRED (first, 0)); a_acc = PHI_RESULT (phi); } @@ -896,7 +912,11 @@ tree_optimize_tail_calls_1 (bool opt_tailcalls) add_referenced_tmp_var (tmp); phi = create_phi_node (tmp, first); - add_phi_arg (&phi, build_int_cst (ret_type, 1), EDGE_PRED (first, 0)); + add_phi_arg (&phi, + /* RET_TYPE can be a float when -ffast-maths is + enabled. */ + fold_convert (ret_type, integer_one_node), + EDGE_PRED (first, 0)); m_acc = PHI_RESULT (phi); } } diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c index e4de78637d3..b70f434b89c 100644 --- a/gcc/tree-vectorizer.c +++ b/gcc/tree-vectorizer.c @@ -3652,9 +3652,10 @@ vect_stmt_relevant_p (tree stmt, loop_vec_info loop_vinfo) v_may_def_optype v_may_defs; v_must_def_optype v_must_defs; struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo); - int i; - dataflow_t df; - int num_uses; + ssa_op_iter op_iter; + imm_use_iterator imm_iter; + use_operand_p use_p; + tree var; /* cond stmt other than loop exit cond. */ if (is_ctrl_stmt (stmt) && (stmt != LOOP_VINFO_EXIT_COND (loop_vinfo))) @@ -3671,17 +3672,17 @@ vect_stmt_relevant_p (tree stmt, loop_vec_info loop_vinfo) } /* uses outside the loop. */ - df = get_immediate_uses (stmt); - num_uses = num_immediate_uses (df); - for (i = 0; i < num_uses; i++) + FOR_EACH_SSA_TREE_OPERAND (var, stmt, op_iter, SSA_OP_DEF) { - tree use = immediate_use (df, i); - basic_block bb = bb_for_stmt (use); - if (!flow_bb_inside_loop_p (loop, bb)) + FOR_EACH_IMM_USE_FAST (use_p, imm_iter, var) { - if (vect_debug_details (NULL)) - fprintf (dump_file, "vec_stmt_relevant_p: used out of loop."); - return true; + basic_block bb = bb_for_stmt (USE_STMT (use_p)); + if (!flow_bb_inside_loop_p (loop, bb)) + { + if (vect_debug_details (NULL)) + fprintf (dump_file, "vec_stmt_relevant_p: used out of loop."); + return true; + } } } @@ -4073,19 +4074,6 @@ vect_analyze_loop (struct loop *loop) } -/* Function need_imm_uses_for. - - Return whether we ought to include information for 'var' - when calculating immediate uses. For this pass we only want use - information for non-virtual variables. */ - -static bool -need_imm_uses_for (tree var) -{ - return is_gimple_reg (var); -} - - /* Function vectorize_loops. Entry Point to loop vectorization phase. */ @@ -4105,8 +4093,6 @@ vectorize_loops (struct loops *loops) return; } - compute_immediate_uses (TDFA_USE_OPS, need_imm_uses_for); - /* ----------- Analyze loops. ----------- */ /* If some loop was duplicated, it gets bigger number @@ -4137,7 +4123,6 @@ vectorize_loops (struct loops *loops) /* ----------- Finalize. ----------- */ - free_df (); for (i = 1; i < loops_num; i++) { struct loop *loop = loops->parray[i]; diff --git a/gcc/tree.h b/gcc/tree.h index 637fab7e1f7..4a7aa88a231 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -1334,6 +1334,21 @@ struct tree_exp GTY(()) struct ptr_info_def; #endif + + +/* Immediate use linking structure. THis structure is used for maintaining + a doubly linked list of uses of an SSA_NAME. */ +typedef struct ssa_imm_use_d GTY(()) +{ + struct ssa_imm_use_d* GTY((skip(""))) prev; + struct ssa_imm_use_d* GTY((skip(""))) next; + tree GTY((skip(""))) stmt; + tree *GTY((skip(""))) use; +} ssa_imm_use_t; + +/* Return the immediate_use information for an SSA_NAME. */ +#define SSA_NAME_IMM_USE_NODE(NODE) SSA_NAME_CHECK (NODE)->ssa_name.imm_uses + struct tree_ssa_name GTY(()) { struct tree_common common; @@ -1358,9 +1373,19 @@ struct tree_ssa_name GTY(()) /* Auxiliary information stored with the ssa name. */ PTR GTY((skip)) aux; + + /* Immediate uses list for this SSA_NAME. */ + struct ssa_imm_use_d imm_uses; }; /* In a PHI_NODE node. */ + +/* These 2 macros should be considered off limits for use by developers. If + you wish to access the use or def fields of a PHI_NODE in the SSA + optimizers, use the accessor macros found in tree-ssa-operands.h. + These two macros are to be used only by those accessor macros, and other + select places where we *absolutly* must take the address of the tree. */ + #define PHI_RESULT_TREE(NODE) PHI_NODE_CHECK (NODE)->phi.result #define PHI_ARG_DEF_TREE(NODE, I) PHI_NODE_ELT_CHECK (NODE, I).def @@ -1378,12 +1403,13 @@ struct tree_ssa_name GTY(()) #define PHI_ARG_EDGE(NODE, I) PHI_NODE_ELT_CHECK (NODE, I).e #define PHI_ARG_NONZERO(NODE, I) PHI_NODE_ELT_CHECK (NODE, I).nonzero #define PHI_BB(NODE) PHI_NODE_CHECK (NODE)->phi.bb -#define PHI_DF(NODE) PHI_NODE_CHECK (NODE)->phi.df +#define PHI_ARG_IMM_USE_NODE(NODE, I) PHI_NODE_ELT_CHECK (NODE, I).imm_use struct edge_def; struct phi_arg_d GTY(()) { + struct ssa_imm_use_d imm_use; /* imm_use MUST be first element in struct. */ tree def; struct edge_def * GTY((skip (""))) e; bool nonzero; @@ -1403,9 +1429,6 @@ struct tree_phi_node GTY(()) /* Basic block to that the phi node belongs. */ struct basic_block_def *bb; - /* Dataflow information. */ - struct dataflow_d *df; - struct phi_arg_d GTY ((length ("((tree)&%h)->phi.capacity"))) a[1]; }; @@ -3876,6 +3899,7 @@ enum tree_dump_index #define TDF_TREE (1 << 9) /* is a tree dump */ #define TDF_RTL (1 << 10) /* is a RTL dump */ #define TDF_IPA (1 << 11) /* is an IPA dump */ +#define TDF_STMTADDR (1 << 12) /* Address of stmt. */ typedef struct dump_info *dump_info_p; diff --git a/gcc/version.c b/gcc/version.c index 7db05f0e513..1acc0c7f8a2 100644 --- a/gcc/version.c +++ b/gcc/version.c @@ -5,7 +5,7 @@ please modify this string to indicate that, e.g. by putting your organization's name in parentheses at the end of the string. */ -const char version_string[] = "4.0.0 20041006 (experimental)"; +const char version_string[] = "4.0.0 20041008 (experimental)"; /* This is the location of the online document giving instructions for reporting bugs. If you distribute a modified version of GCC, diff --git a/include/ChangeLog b/include/ChangeLog index f0610f4e5a7..2f256aec763 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,9 @@ +2004-10-07 Bob Wilson <bob.wilson@acm.org> + + * xtensa-config.h (XSHAL_USE_ABSOLUTE_LITERALS, + XCHAL_HAVE_PREDICTED_BRANCHES, XCHAL_INST_FETCH_WIDTH): New. + (XCHAL_EXTRA_SA_SIZE, XCHAL_EXTRA_SA_ALIGN): Delete. + 2004-09-13 Aaron W. LaFramboise <aaronavay62@aaronwl.com> * libiberty.h (basename): Prototype for __MINGW32__. diff --git a/include/xtensa-config.h b/include/xtensa-config.h index 4191c368575..4ef5d64270f 100644 --- a/include/xtensa-config.h +++ b/include/xtensa-config.h @@ -1,5 +1,5 @@ /* Xtensa configuration settings. - Copyright (C) 2001,2002,2003 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by Bob Wilson (bwilson@tensilica.com) at Tensilica. This program is free software; you can redistribute it and/or modify @@ -42,6 +42,9 @@ #undef XCHAL_HAVE_L32R #define XCHAL_HAVE_L32R 1 +#undef XSHAL_USE_ABSOLUTE_LITERALS +#define XSHAL_USE_ABSOLUTE_LITERALS 0 + #undef XCHAL_HAVE_MAC16 #define XCHAL_HAVE_MAC16 0 @@ -87,6 +90,9 @@ #undef XCHAL_HAVE_WINDOWED #define XCHAL_HAVE_WINDOWED 1 +#undef XCHAL_HAVE_PREDICTED_BRANCHES +#define XCHAL_HAVE_PREDICTED_BRANCHES 0 + #undef XCHAL_ICACHE_SIZE #define XCHAL_ICACHE_SIZE 8192 @@ -130,10 +136,7 @@ #define XCHAL_DEBUGLEVEL 4 -#undef XCHAL_EXTRA_SA_SIZE -#define XCHAL_EXTRA_SA_SIZE 0 - -#undef XCHAL_EXTRA_SA_ALIGN -#define XCHAL_EXTRA_SA_ALIGN 1 +#undef XCHAL_INST_FETCH_WIDTH +#define XCHAL_INST_FETCH_WIDTH 4 #endif /* !XTENSA_CONFIG_H */ diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 86222aa942c..0024ef9499b 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,9 @@ +2004-10-08 Andrew Pinski <pinskia@physics.uc.edu> + + * pch.c (cpp_write_pch_state): Remove variable z as it is not + used. + (cpp_read_state): Remove unused variables, m, d and mac_count. + 2004-09-29 Per Bothner <per@bothner.com> * directives.c (cpp_handle_deferred_pragma): Save, clear and restore diff --git a/libcpp/pch.c b/libcpp/pch.c index a343cd857f0..292132139d2 100644 --- a/libcpp/pch.c +++ b/libcpp/pch.c @@ -345,8 +345,6 @@ cpp_write_pch_deps (cpp_reader *r, FILE *f) int cpp_write_pch_state (cpp_reader *r, FILE *f) { - struct macrodef_struct z; - if (!r->deps) r->deps = deps_init (); @@ -630,9 +628,7 @@ int cpp_read_state (cpp_reader *r, const char *name, FILE *f, struct save_macro_data *data) { - struct macrodef_struct m; - struct save_macro_item *d; - size_t i, mac_count; + size_t i; struct lexer_state old_state; /* Restore spec_nodes, which will be full of references to the old diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 2560d698fb5..aafa660ccf5 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,18 @@ +2004-10-07 Paul Brook <paul@codesourcery.com> + + * io/transfer.c (finalize_transfer): Free internal streams. + * io/unix.c (mem_close): Free stream object. + +2004-10-07 Paul Brook <paul@codesourcery.com> + + * intrinsics/string_intrinsics.c (string_verify): Fix off by one + error. + +2004-10-06 Paul Brook <paul@codesourcery.com> + + PR libfortran/17709 + * io/transfer.c (data_transfer_init): Reset sf_seen_eor. + 2004-10-04 Andrew Pinski <pinskia@physics.uc.edu> * intrinsics/mvbits.c: Commit the file. diff --git a/libgfortran/intrinsics/string_intrinsics.c b/libgfortran/intrinsics/string_intrinsics.c index 5d231268ab6..ac70a9bb873 100644 --- a/libgfortran/intrinsics/string_intrinsics.c +++ b/libgfortran/intrinsics/string_intrinsics.c @@ -346,17 +346,16 @@ string_verify (GFC_INTEGER_4 slen, const char * str, GFC_INTEGER_4 setlen, if (back) { - last = 0; + last = -1; start = slen - 1; delta = -1; } else { - last = slen - 1; + last = slen; start = 0; delta = 1; } - i = 0; for (; start != last; start += delta) { for (i = 0; i < setlen; i++) diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c index ca920724b0d..ceff76fc35c 100644 --- a/libgfortran/io/transfer.c +++ b/libgfortran/io/transfer.c @@ -1074,6 +1074,7 @@ data_transfer_init (int read_flag) g.seen_dollar = 0; g.first_item = 1; g.item_count = 0; + sf_seen_eor = 0; pre_position (); @@ -1348,7 +1349,8 @@ next_record (int done) /* Finalize the current data transfer. For a nonadvancing transfer, - this means advancing to the next record. */ + this means advancing to the next record. For internal units close the + steam associated with the unit. */ static void finalize_transfer (void) @@ -1391,6 +1393,9 @@ finalize_transfer (void) } sfree (current_unit->s); + + if (is_internal_unit ()) + sclose (current_unit->s); } diff --git a/libgfortran/io/unix.c b/libgfortran/io/unix.c index e55966b2f2a..c8b18fc96fc 100644 --- a/libgfortran/io/unix.c +++ b/libgfortran/io/unix.c @@ -811,6 +811,7 @@ mem_truncate (unix_stream * s) static try mem_close (unix_stream * s) { + free_mem (s); return SUCCESS; } diff --git a/libobjc/ChangeLog b/libobjc/ChangeLog index 3c8017a4767..8f06ee8a758 100644 --- a/libobjc/ChangeLog +++ b/libobjc/ChangeLog @@ -1,3 +1,8 @@ +2004-10-08 Andrew Pinski <pinskia@physics.uc.edu> + + * archive.c: Fix all the warnings about passing unsigned char* + to char* and the other way too. + 2004-09-16 Andrew Pinski <pinskia@physics.uc.edu> PR libobjc/16448 diff --git a/libobjc/archive.c b/libobjc/archive.c index b6a1ec35932..096ca6931dc 100644 --- a/libobjc/archive.c +++ b/libobjc/archive.c @@ -84,7 +84,7 @@ objc_write_unsigned_char (struct objc_typed_stream *stream, { unsigned char buf[sizeof (unsigned char) + 1]; int len = __objc_code_unsigned_char (buf, value); - return (*stream->write) (stream->physical, buf, len); + return (*stream->write) (stream->physical, (char*)buf, len); } static inline int @@ -105,7 +105,7 @@ objc_write_char (struct objc_typed_stream *stream, signed char value) { unsigned char buf[sizeof (char) + 1]; int len = __objc_code_char (buf, value); - return (*stream->write) (stream->physical, buf, len); + return (*stream->write) (stream->physical, (char*)buf, len); } static inline int @@ -143,7 +143,7 @@ objc_write_unsigned_short (struct objc_typed_stream *stream, { unsigned char buf[sizeof (unsigned short) + 1]; int len = __objc_code_unsigned_short (buf, value); - return (*stream->write) (stream->physical, buf, len); + return (*stream->write) (stream->physical, (char*)buf, len); } static inline int @@ -161,7 +161,7 @@ objc_write_short (struct objc_typed_stream *stream, short value) { unsigned char buf[sizeof (short) + 1]; int len = __objc_code_short (buf, value); - return (*stream->write) (stream->physical, buf, len); + return (*stream->write) (stream->physical, (char*)buf, len); } @@ -199,7 +199,7 @@ objc_write_unsigned_int (struct objc_typed_stream *stream, unsigned int value) { unsigned char buf[sizeof (unsigned int) + 1]; int len = __objc_code_unsigned_int (buf, value); - return (*stream->write) (stream->physical, buf, len); + return (*stream->write) (stream->physical, (char*)buf, len); } static inline int @@ -217,7 +217,7 @@ objc_write_int (struct objc_typed_stream *stream, int value) { unsigned char buf[sizeof (int) + 1]; int len = __objc_code_int (buf, value); - return (*stream->write) (stream->physical, buf, len); + return (*stream->write) (stream->physical, (char*)buf, len); } static inline int @@ -255,7 +255,7 @@ objc_write_unsigned_long (struct objc_typed_stream *stream, { unsigned char buf[sizeof (unsigned long) + 1]; int len = __objc_code_unsigned_long (buf, value); - return (*stream->write) (stream->physical, buf, len); + return (*stream->write) (stream->physical, (char*)buf, len); } static inline int @@ -273,7 +273,7 @@ objc_write_long (struct objc_typed_stream *stream, long value) { unsigned char buf[sizeof (long) + 1]; int len = __objc_code_long (buf, value); - return (*stream->write) (stream->physical, buf, len); + return (*stream->write) (stream->physical, (char*)buf, len); } @@ -290,8 +290,8 @@ objc_write_string (struct objc_typed_stream *stream, else /* _B_NINT */ buf[0] = (buf[0]&_B_VALUE)|_B_NSTR; - if ((*stream->write) (stream->physical, buf, len) != 0) - return (*stream->write) (stream->physical, string, nbytes); + if ((*stream->write) (stream->physical, (char*)buf, len) != 0) + return (*stream->write) (stream->physical, (char*)string, nbytes); else return 0; } @@ -323,12 +323,12 @@ objc_write_register_common (struct objc_typed_stream *stream, { buf[0] = _B_RCOMM|0x01; buf[1] &= _B_VALUE; - return (*stream->write) (stream->physical, buf, len + 1); + return (*stream->write) (stream->physical, (char*)buf, len + 1); } else { buf[1] = (buf[1]&_B_VALUE)|_B_RCOMM; - return (*stream->write) (stream->physical, buf + 1, len); + return (*stream->write) (stream->physical, (char*)buf + 1, len); } } @@ -341,12 +341,12 @@ objc_write_use_common (struct objc_typed_stream *stream, unsigned long key) { buf[0] = _B_UCOMM|0x01; buf[1] &= _B_VALUE; - return (*stream->write) (stream->physical, buf, 2); + return (*stream->write) (stream->physical, (char*)buf, 2); } else { buf[1] = (buf[1]&_B_VALUE)|_B_UCOMM; - return (*stream->write) (stream->physical, buf + 1, len); + return (*stream->write) (stream->physical, (char*)buf + 1, len); } } @@ -356,7 +356,7 @@ __objc_write_extension (struct objc_typed_stream *stream, unsigned char code) if (code <= _B_VALUE) { unsigned char buf = code|_B_EXT; - return (*stream->write) (stream->physical, &buf, 1); + return (*stream->write) (stream->physical, (char*)&buf, 1); } else { @@ -376,7 +376,7 @@ __objc_write_object (struct objc_typed_stream *stream, id object) __objc_write_extension (stream, _BX_OBJECT); objc_write_class (stream, object->class_pointer); (*objc_msg_lookup (object, write_sel)) (object, write_sel, stream); - return (*stream->write) (stream->physical, &buf, 1); + return (*stream->write) (stream->physical, (char*)&buf, 1); } else return objc_write_use_common (stream, 0); @@ -435,7 +435,7 @@ inline int __objc_write_class (struct objc_typed_stream *stream, struct objc_class *class) { __objc_write_extension (stream, _BX_CLASS); - objc_write_string_atomic (stream, (char *) class->name, + objc_write_string_atomic (stream, (unsigned char *) class->name, strlen ((char *) class->name)); return objc_write_unsigned_long (stream, class->version); } @@ -466,9 +466,9 @@ __objc_write_selector (struct objc_typed_stream *stream, SEL selector) __objc_write_extension (stream, _BX_SEL); /* to handle NULL selectors */ if ((SEL)0 == selector) - return objc_write_string (stream, "", 0); + return objc_write_string (stream, (unsigned char*)"", 0); sel_name = sel_get_name (selector); - return objc_write_string (stream, sel_name, strlen ((char*)sel_name)); + return objc_write_string (stream, (unsigned char*)sel_name, strlen ((char*)sel_name)); } int @@ -506,7 +506,7 @@ objc_read_char (struct objc_typed_stream *stream, char *val) { unsigned char buf; int len; - len = (*stream->read) (stream->physical, &buf, 1); + len = (*stream->read) (stream->physical, (char*)&buf, 1); if (len != 0) { if ((buf & _B_CODE) == _B_SINT) @@ -533,13 +533,13 @@ objc_read_unsigned_char (struct objc_typed_stream *stream, unsigned char *val) { unsigned char buf; int len; - if ((len = (*stream->read) (stream->physical, &buf, 1))) + if ((len = (*stream->read) (stream->physical, (char*)&buf, 1))) { if ((buf & _B_CODE) == _B_SINT) (*val) = (buf & _B_VALUE); else if ((buf & _B_NUMBER) == 1) - len = (*stream->read) (stream->physical, val, 1); + len = (*stream->read) (stream->physical, (char*)val, 1); else objc_error (nil, OBJC_ERR_BAD_DATA, @@ -554,7 +554,7 @@ objc_read_short (struct objc_typed_stream *stream, short *value) { unsigned char buf[sizeof (short) + 1]; int len; - if ((len = (*stream->read) (stream->physical, buf, 1))) + if ((len = (*stream->read) (stream->physical, (char*)buf, 1))) { if ((buf[0] & _B_CODE) == _B_SINT) (*value) = (buf[0] & _B_VALUE); @@ -566,7 +566,7 @@ objc_read_short (struct objc_typed_stream *stream, short *value) if (nbytes > (int) sizeof (short)) objc_error (nil, OBJC_ERR_BAD_DATA, "expected short, got bigger (%dbits)", nbytes*8); - len = (*stream->read) (stream->physical, buf + 1, nbytes); + len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes); (*value) = 0; while (pos <= nbytes) (*value) = ((*value)*0x100) + buf[pos++]; @@ -583,7 +583,7 @@ objc_read_unsigned_short (struct objc_typed_stream *stream, { unsigned char buf[sizeof (unsigned short) + 1]; int len; - if ((len = (*stream->read) (stream->physical, buf, 1))) + if ((len = (*stream->read) (stream->physical, (char*)buf, 1))) { if ((buf[0] & _B_CODE) == _B_SINT) (*value) = (buf[0] & _B_VALUE); @@ -595,7 +595,7 @@ objc_read_unsigned_short (struct objc_typed_stream *stream, if (nbytes > (int) sizeof (short)) objc_error (nil, OBJC_ERR_BAD_DATA, "expected short, got int or bigger"); - len = (*stream->read) (stream->physical, buf + 1, nbytes); + len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes); (*value) = 0; while (pos <= nbytes) (*value) = ((*value)*0x100) + buf[pos++]; @@ -610,7 +610,7 @@ objc_read_int (struct objc_typed_stream *stream, int *value) { unsigned char buf[sizeof (int) + 1]; int len; - if ((len = (*stream->read) (stream->physical, buf, 1))) + if ((len = (*stream->read) (stream->physical, (char*)buf, 1))) { if ((buf[0] & _B_CODE) == _B_SINT) (*value) = (buf[0] & _B_VALUE); @@ -621,7 +621,7 @@ objc_read_int (struct objc_typed_stream *stream, int *value) int nbytes = buf[0] & _B_NUMBER; if (nbytes > (int) sizeof (int)) objc_error (nil, OBJC_ERR_BAD_DATA, "expected int, got bigger"); - len = (*stream->read) (stream->physical, buf + 1, nbytes); + len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes); (*value) = 0; while (pos <= nbytes) (*value) = ((*value)*0x100) + buf[pos++]; @@ -637,7 +637,7 @@ objc_read_long (struct objc_typed_stream *stream, long *value) { unsigned char buf[sizeof (long) + 1]; int len; - if ((len = (*stream->read) (stream->physical, buf, 1))) + if ((len = (*stream->read) (stream->physical, (char*)buf, 1))) { if ((buf[0] & _B_CODE) == _B_SINT) (*value) = (buf[0] & _B_VALUE); @@ -648,7 +648,7 @@ objc_read_long (struct objc_typed_stream *stream, long *value) int nbytes = buf[0] & _B_NUMBER; if (nbytes > (int) sizeof (long)) objc_error (nil, OBJC_ERR_BAD_DATA, "expected long, got bigger"); - len = (*stream->read) (stream->physical, buf + 1, nbytes); + len = (*stream->read) (stream->physical, (char*)buf + 1, nbytes); (*value) = 0; while (pos <= nbytes) (*value) = ((*value)*0x100) + buf[pos++]; @@ -670,7 +670,7 @@ __objc_read_nbyte_uint (struct objc_typed_stream *stream, if (nbytes > sizeof (int)) objc_error (nil, OBJC_ERR_BAD_DATA, "expected int, got bigger"); - len = (*stream->read) (stream->physical, buf, nbytes); + len = (*stream->read) (stream->physical, (char*)buf, nbytes); (*val) = 0; while (pos < nbytes) (*val) = ((*val)*0x100) + buf[pos++]; @@ -684,7 +684,7 @@ objc_read_unsigned_int (struct objc_typed_stream *stream, { unsigned char buf[sizeof (unsigned int) + 1]; int len; - if ((len = (*stream->read) (stream->physical, buf, 1))) + if ((len = (*stream->read) (stream->physical, (char*)buf, 1))) { if ((buf[0] & _B_CODE) == _B_SINT) (*value) = (buf[0] & _B_VALUE); @@ -707,7 +707,7 @@ __objc_read_nbyte_ulong (struct objc_typed_stream *stream, if (nbytes > sizeof (long)) objc_error (nil, OBJC_ERR_BAD_DATA, "expected long, got bigger"); - len = (*stream->read) (stream->physical, buf, nbytes); + len = (*stream->read) (stream->physical, (char*)buf, nbytes); (*val) = 0; while (pos < nbytes) (*val) = ((*val)*0x100) + buf[pos++]; @@ -721,7 +721,7 @@ objc_read_unsigned_long (struct objc_typed_stream *stream, { unsigned char buf[sizeof (unsigned long) + 1]; int len; - if ((len = (*stream->read) (stream->physical, buf, 1))) + if ((len = (*stream->read) (stream->physical, (char*)buf, 1))) { if ((buf[0] & _B_CODE) == _B_SINT) (*value) = (buf[0] & _B_VALUE); @@ -739,14 +739,14 @@ objc_read_string (struct objc_typed_stream *stream, { unsigned char buf[sizeof (unsigned int) + 1]; int len; - if ((len = (*stream->read) (stream->physical, buf, 1))) + if ((len = (*stream->read) (stream->physical, (char*)buf, 1))) { unsigned long key = 0; if ((buf[0]&_B_CODE) == _B_RCOMM) /* register following */ { len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key); - len = (*stream->read) (stream->physical, buf, 1); + len = (*stream->read) (stream->physical, (char*)buf, 1); } switch (buf[0]&_B_CODE) { @@ -800,7 +800,7 @@ objc_read_object (struct objc_typed_stream *stream, id *object) { unsigned char buf[sizeof (unsigned int)]; int len; - if ((len = (*stream->read) (stream->physical, buf, 1))) + if ((len = (*stream->read) (stream->physical, (char*)buf, 1))) { SEL read_sel = sel_get_any_uid ("read:"); unsigned long key = 0; @@ -808,7 +808,7 @@ objc_read_object (struct objc_typed_stream *stream, id *object) if ((buf[0]&_B_CODE) == _B_RCOMM) /* register common */ { len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key); - len = (*stream->read) (stream->physical, buf, 1); + len = (*stream->read) (stream->physical, (char*)buf, 1); } if (buf[0] == (_B_EXT | _BX_OBJECT)) @@ -830,7 +830,7 @@ objc_read_object (struct objc_typed_stream *stream, id *object) (*get_imp (class, read_sel)) (*object, read_sel, stream); /* check null-byte */ - len = (*stream->read) (stream->physical, buf, 1); + len = (*stream->read) (stream->physical, (char*)buf, 1); if (buf[0] != '\0') objc_error (nil, OBJC_ERR_BAD_DATA, "expected null-byte, got opcode %c", buf[0]); @@ -875,19 +875,20 @@ objc_read_class (struct objc_typed_stream *stream, Class *class) { unsigned char buf[sizeof (unsigned int)]; int len; - if ((len = (*stream->read) (stream->physical, buf, 1))) + if ((len = (*stream->read) (stream->physical, (char*)buf, 1))) { unsigned long key = 0; if ((buf[0]&_B_CODE) == _B_RCOMM) /* register following */ { len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key); - len = (*stream->read) (stream->physical, buf, 1); + len = (*stream->read) (stream->physical, (char*)buf, 1); } if (buf[0] == (_B_EXT | _BX_CLASS)) { - char *class_name = ""; + char temp[1] = ""; + char *class_name = temp; unsigned long version; /* get class */ @@ -926,19 +927,20 @@ objc_read_selector (struct objc_typed_stream *stream, SEL* selector) { unsigned char buf[sizeof (unsigned int)]; int len; - if ((len = (*stream->read) (stream->physical, buf, 1))) + if ((len = (*stream->read) (stream->physical, (char*)buf, 1))) { unsigned long key = 0; if ((buf[0]&_B_CODE) == _B_RCOMM) /* register following */ { len = __objc_read_nbyte_ulong (stream, (buf[0] & _B_VALUE), &key); - len = (*stream->read) (stream->physical, buf, 1); + len = (*stream->read) (stream->physical, (char*)buf, 1); } if (buf[0] == (_B_EXT|_BX_SEL)) /* selector! */ { - char *selector_name = ""; + char temp[1] = ""; + char *selector_name = temp; /* get selector */ len = objc_read_string (stream, &selector_name); @@ -1032,11 +1034,11 @@ objc_write_type (TypedStream *stream, const char *type, const void *data) case _C_CHARPTR: return objc_write_string (stream, - *(char **) data, strlen (*(char **) data)); + *(unsigned char **) data, strlen (*(char **) data)); break; case _C_ATOM: - return objc_write_string_atomic (stream, *(char **) data, + return objc_write_string_atomic (stream, *(unsigned char **) data, strlen (*(char **) data)); break; @@ -1241,15 +1243,15 @@ objc_write_types (TypedStream *stream, const char *type, ...) case _C_CHARPTR: { - char **str = va_arg (args, char **); - res = objc_write_string (stream, *str, strlen (*str)); + unsigned char **str = va_arg (args, unsigned char **); + res = objc_write_string (stream, *str, strlen ((char*)*str)); } break; case _C_ATOM: { - char **str = va_arg (args, char **); - res = objc_write_string_atomic (stream, *str, strlen (*str)); + unsigned char **str = va_arg (args, unsigned char **); + res = objc_write_string_atomic (stream, *str, strlen ((char*)*str)); } break; diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 9509eba9237..f434a830483 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,75 @@ +2004-10-07 Phil Edwards <phil@codesourcery.com> + + * testsuite/lib/libstdc++.exp: Update list of undefined functions. + +2004-10-07 Paolo Carlini <pcarlini@suse.de> + + * include/bits/list.tcc (operator=): Avoid iterator postincrement. + * include/bits/stl_tree.h (erase(iterator, iterator)): Likewise. + +2004-10-07 Benjamin Kosnik <bkoz@redhat.com> + + * include/tr1: New. + * include/tr1/array: New. + * include/Makefile.am (tr1_headers): New. + (stamp-tr1): New. + (install-headers): New. + (allstamped): Add stamp-tr1. + + * include/ext/array_allocator.h: New. + * include/Makefile.am: Add. + * include/Makefile.in: Regenerate. + * testsuite/ext/array_allocator/1.cc: New. + * testsuite/ext/array_allocator/2.cc: New. + +2004-10-07 Richard Earnshaw <rearnsha@arm.com> + + * testsuite/lib/libstdc++.exp (libstdc++_exit): New proc. + +2004-10-07 Roger Sayle <roger@eyesopen.com> + + PR libstdc++/17850 + * configure.ac: Newlib does not provide strtold. + * configure: Regenerate. + +2004-10-06 Benjamin Kosnik <bkoz@redhat.com> + + * acinclude.m4 (GLIBCXX_ENABLE_THREADS): Set enable_thread. + (GLIBCXX_CONFIGURE_TESTSUITE): Use it. + * configure: Regenerated. + * testsuite/Makefile.am (CLEANFILES): Add TEST for + check-performance executables. + (stamp_thread): New. + (all-local): Use it. + * testsuite/Makefile.in: Regenerate. + * scripts/create_testsuite_files: Filter thread tests. + + * testsuite/thread/pthread1.cc: Remove macro conditionals: this + file will only be run by thread enabled configurations. + * testsuite/thread/pthread7-rope.cc: Same, add rope_type typedef. + * testsuite/thread/pthread6.cc: Same. + * testsuite/thread/pthread5.cc: Same. + * testsuite/thread/pthread4.cc: Same. + * testsuite/thread/pthread3.cc: Same. + * testsuite/thread/pthread2.cc: Same. + + * testsuite/ext/mt_allocator/instantiate.cc: Add in __GTHREADS guard. + * testsuite/ext/mt_allocator/deallocate_global-1.cc: Move to... + * testsuite/ext/mt_allocator/deallocate_global_thread-1.cc: ...here. + * testsuite/ext/mt_allocator/deallocate_global-3.cc: Move to... + * testsuite/ext/mt_allocator/deallocate_global_thread-3.cc: ...here. + * testsuite/ext/mt_allocator/deallocate_local-1.cc: Move to... + * testsuite/ext/mt_allocator/deallocate_local_thread-1.cc: ...here. + * testsuite/ext/mt_allocator/deallocate_local-3.cc: Move to... + * testsuite/ext/mt_allocator/deallocate_local_thread-3.cc: ...here. + +2004-10-06 Benjamin Kosnik <bkoz@redhat.com> + Paolo Carlini <pcarlini@suse.de> + + PR libstdc++/17780 + * src/mt_allocator.cc (__pool<true>::_M_reserve_block): Revert + to old locking order. + 2004-10-06 Paolo Carlini <pcarlini@suse.de> * include/std/std_sstream.h (_M_sync): When the caller is diff --git a/libstdc++-v3/Makefile.in b/libstdc++-v3/Makefile.in index a25d5597c09..06d8eafadd2 100644 --- a/libstdc++-v3/Makefile.in +++ b/libstdc++-v3/Makefile.in @@ -150,6 +150,8 @@ GLIBCXX_HOSTED_TRUE = @GLIBCXX_HOSTED_TRUE@ GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@ GLIBCXX_TEST_ABI_FALSE = @GLIBCXX_TEST_ABI_FALSE@ GLIBCXX_TEST_ABI_TRUE = @GLIBCXX_TEST_ABI_TRUE@ +GLIBCXX_TEST_THREAD_FALSE = @GLIBCXX_TEST_THREAD_FALSE@ +GLIBCXX_TEST_THREAD_TRUE = @GLIBCXX_TEST_THREAD_TRUE@ GLIBCXX_TEST_WCHAR_T_FALSE = @GLIBCXX_TEST_WCHAR_T_FALSE@ GLIBCXX_TEST_WCHAR_T_TRUE = @GLIBCXX_TEST_WCHAR_T_TRUE@ INSTALL_DATA = @INSTALL_DATA@ diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index 6c9f13aa185..0bd4aa645d9 100644 --- a/libstdc++-v3/acinclude.m4 +++ b/libstdc++-v3/acinclude.m4 @@ -620,6 +620,8 @@ dnl GLIBCXX_ENABLE_SYMVERS and GLIBCXX_IS_NATIVE must be done before this. dnl dnl Sets: dnl enable_abi_check / GLIBCXX_TEST_ABI +dnl GLIBCXX_TEST_WCHAR_T +dnl GLIBCXX_TEST_THREAD dnl Substs: dnl baseline_dir dnl @@ -652,6 +654,7 @@ AC_DEFUN([GLIBCXX_CONFIGURE_TESTSUITE], [ AC_SUBST(baseline_dir) GLIBCXX_CONDITIONAL(GLIBCXX_TEST_WCHAR_T, test $enable_wchar_t = yes) + GLIBCXX_CONDITIONAL(GLIBCXX_TEST_THREAD, test $enable_thread = yes) GLIBCXX_CONDITIONAL(GLIBCXX_TEST_ABI, test $enable_abi_check = yes) ]) @@ -1708,8 +1711,10 @@ AC_DEFUN([GLIBCXX_ENABLE_THREADS], [ target_thread_file=`$CXX -v 2>&1 | sed -n 's/^Thread model: //p'` AC_MSG_RESULT([$target_thread_file]) + enable_thread=no if test $target_thread_file != single; then AC_DEFINE(HAVE_GTHR_DEFAULT) + enable_thread=yes fi glibcxx_thread_h=gthr-$target_thread_file.h diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure index 0a8f404a607..b2ca698a0d7 100755 --- a/libstdc++-v3/configure +++ b/libstdc++-v3/configure @@ -309,7 +309,7 @@ ac_includes_default="\ # include <unistd.h> #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS libtool_VERSION multi_basedir build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar glibcxx_builddir glibcxx_srcdir toplevel_srcdir CC ac_ct_CC EXEEXT OBJEXT CXX ac_ct_CXX CFLAGS CXXFLAGS LN_S AS ac_ct_AS AR ac_ct_AR RANLIB ac_ct_RANLIB MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LIBTOOL CXXCPP CPPFLAGS enable_shared enable_static GLIBCXX_HOSTED_TRUE GLIBCXX_HOSTED_FALSE GLIBCXX_BUILD_PCH_TRUE GLIBCXX_BUILD_PCH_FALSE glibcxx_PCHFLAGS CSTDIO_H BASIC_FILE_H BASIC_FILE_CC CPP EGREP check_msgfmt glibcxx_MOFILES glibcxx_POFILES glibcxx_localedir USE_NLS CLOCALE_H CCODECVT_H CMESSAGES_H CCODECVT_CC CCOLLATE_CC CCTYPE_CC CMESSAGES_CC CMONEY_CC CNUMERIC_CC CTIME_H CTIME_CC CLOCALE_CC CLOCALE_INTERNAL_H ALLOCATOR_H ALLOCATOR_NAME C_INCLUDE_DIR GLIBCXX_C_HEADERS_C_TRUE GLIBCXX_C_HEADERS_C_FALSE GLIBCXX_C_HEADERS_C_STD_TRUE GLIBCXX_C_HEADERS_C_STD_FALSE GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE glibcxx_thread_h DEBUG_FLAGS GLIBCXX_BUILD_DEBUG_TRUE GLIBCXX_BUILD_DEBUG_FALSE EXTRA_CXX_FLAGS WERROR SECTION_FLAGS SECTION_LDFLAGS OPT_LDFLAGS LIBMATHOBJS LIBICONV SYMVER_MAP port_specific_symbol_files GLIBCXX_BUILD_VERSIONED_SHLIB_TRUE GLIBCXX_BUILD_VERSIONED_SHLIB_FALSE baseline_dir GLIBCXX_TEST_WCHAR_T_TRUE GLIBCXX_TEST_WCHAR_T_FALSE GLIBCXX_TEST_ABI_TRUE GLIBCXX_TEST_ABI_FALSE ATOMICITY_SRCDIR ATOMIC_WORD_SRCDIR ABI_TWEAKS_SRCDIR OS_INC_SRCDIR glibcxx_prefixdir gxx_include_dir glibcxx_toolexecdir glibcxx_toolexeclibdir GLIBCXX_INCLUDES TOPLEVEL_INCLUDES OPTIMIZE_CXXFLAGS WARN_FLAGS LIBSUPCXX_PICFLAGS LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS libtool_VERSION multi_basedir build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar glibcxx_builddir glibcxx_srcdir toplevel_srcdir CC ac_ct_CC EXEEXT OBJEXT CXX ac_ct_CXX CFLAGS CXXFLAGS LN_S AS ac_ct_AS AR ac_ct_AR RANLIB ac_ct_RANLIB MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LIBTOOL CXXCPP CPPFLAGS enable_shared enable_static GLIBCXX_HOSTED_TRUE GLIBCXX_HOSTED_FALSE GLIBCXX_BUILD_PCH_TRUE GLIBCXX_BUILD_PCH_FALSE glibcxx_PCHFLAGS CSTDIO_H BASIC_FILE_H BASIC_FILE_CC CPP EGREP check_msgfmt glibcxx_MOFILES glibcxx_POFILES glibcxx_localedir USE_NLS CLOCALE_H CCODECVT_H CMESSAGES_H CCODECVT_CC CCOLLATE_CC CCTYPE_CC CMESSAGES_CC CMONEY_CC CNUMERIC_CC CTIME_H CTIME_CC CLOCALE_CC CLOCALE_INTERNAL_H ALLOCATOR_H ALLOCATOR_NAME C_INCLUDE_DIR GLIBCXX_C_HEADERS_C_TRUE GLIBCXX_C_HEADERS_C_FALSE GLIBCXX_C_HEADERS_C_STD_TRUE GLIBCXX_C_HEADERS_C_STD_FALSE GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE glibcxx_thread_h DEBUG_FLAGS GLIBCXX_BUILD_DEBUG_TRUE GLIBCXX_BUILD_DEBUG_FALSE EXTRA_CXX_FLAGS WERROR SECTION_FLAGS SECTION_LDFLAGS OPT_LDFLAGS LIBMATHOBJS LIBICONV SYMVER_MAP port_specific_symbol_files GLIBCXX_BUILD_VERSIONED_SHLIB_TRUE GLIBCXX_BUILD_VERSIONED_SHLIB_FALSE baseline_dir GLIBCXX_TEST_WCHAR_T_TRUE GLIBCXX_TEST_WCHAR_T_FALSE GLIBCXX_TEST_THREAD_TRUE GLIBCXX_TEST_THREAD_FALSE GLIBCXX_TEST_ABI_TRUE GLIBCXX_TEST_ABI_FALSE ATOMICITY_SRCDIR ATOMIC_WORD_SRCDIR ABI_TWEAKS_SRCDIR OS_INC_SRCDIR glibcxx_prefixdir gxx_include_dir glibcxx_toolexecdir glibcxx_toolexeclibdir GLIBCXX_INCLUDES TOPLEVEL_INCLUDES OPTIMIZE_CXXFLAGS WARN_FLAGS LIBSUPCXX_PICFLAGS LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -7728,11 +7728,13 @@ echo $ECHO_N "checking for thread model used by GCC... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $target_thread_file" >&5 echo "${ECHO_T}$target_thread_file" >&6 + enable_thread=no if test $target_thread_file != single; then cat >>confdefs.h <<\_ACEOF #define HAVE_GTHR_DEFAULT 1 _ACEOF + enable_thread=yes fi glibcxx_thread_h=gthr-$target_thread_file.h @@ -30989,10 +30991,6 @@ _ACEOF #define HAVE_STRTOF 1 _ACEOF - cat >>confdefs.h <<\_ACEOF -#define HAVE_STRTOLD 1 -_ACEOF - # AC_FUNC_MMAP cat >>confdefs.h <<\_ACEOF #define HAVE_MMAP 1 @@ -97355,6 +97353,7 @@ done + # Propagate the target-specific source directories through the build chain. ATOMICITY_SRCDIR=config/${atomicity_dir} ATOMIC_WORD_SRCDIR=config/${atomic_word_dir} @@ -97460,6 +97459,17 @@ fi +if test $enable_thread = yes; then + GLIBCXX_TEST_THREAD_TRUE= + GLIBCXX_TEST_THREAD_FALSE='#' +else + GLIBCXX_TEST_THREAD_TRUE='#' + GLIBCXX_TEST_THREAD_FALSE= +fi + + + + if test $enable_abi_check = yes; then GLIBCXX_TEST_ABI_TRUE= GLIBCXX_TEST_ABI_FALSE='#' @@ -97828,6 +97838,13 @@ echo "$as_me: error: conditional \"GLIBCXX_TEST_WCHAR_T\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi +if test -z "${GLIBCXX_TEST_THREAD_TRUE}" && test -z "${GLIBCXX_TEST_THREAD_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"GLIBCXX_TEST_THREAD\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"GLIBCXX_TEST_THREAD\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi if test -z "${GLIBCXX_TEST_ABI_TRUE}" && test -z "${GLIBCXX_TEST_ABI_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"GLIBCXX_TEST_ABI\" was never defined. Usually this means the macro was only invoked conditionally." >&5 @@ -98508,6 +98525,8 @@ s,@GLIBCXX_BUILD_VERSIONED_SHLIB_FALSE@,$GLIBCXX_BUILD_VERSIONED_SHLIB_FALSE,;t s,@baseline_dir@,$baseline_dir,;t t s,@GLIBCXX_TEST_WCHAR_T_TRUE@,$GLIBCXX_TEST_WCHAR_T_TRUE,;t t s,@GLIBCXX_TEST_WCHAR_T_FALSE@,$GLIBCXX_TEST_WCHAR_T_FALSE,;t t +s,@GLIBCXX_TEST_THREAD_TRUE@,$GLIBCXX_TEST_THREAD_TRUE,;t t +s,@GLIBCXX_TEST_THREAD_FALSE@,$GLIBCXX_TEST_THREAD_FALSE,;t t s,@GLIBCXX_TEST_ABI_TRUE@,$GLIBCXX_TEST_ABI_TRUE,;t t s,@GLIBCXX_TEST_ABI_FALSE@,$GLIBCXX_TEST_ABI_FALSE,;t t s,@ATOMICITY_SRCDIR@,$ATOMICITY_SRCDIR,;t t diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac index 2a838f1ebdc..a11f034120b 100644 --- a/libstdc++-v3/configure.ac +++ b/libstdc++-v3/configure.ac @@ -194,7 +194,6 @@ else # GLIBCXX_CHECK_STDLIB_SUPPORT AC_DEFINE(HAVE_STRTOF) - AC_DEFINE(HAVE_STRTOLD) # AC_FUNC_MMAP AC_DEFINE(HAVE_MMAP) diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am index 2ab53ee59d3..ffa16d5aaf8 100644 --- a/libstdc++-v3/include/Makefile.am +++ b/libstdc++-v3/include/Makefile.am @@ -201,6 +201,7 @@ ext_srcdir = ${glibcxx_srcdir}/include/ext ext_builddir = ./ext ext_headers = \ ${ext_srcdir}/algorithm \ + ${ext_srcdir}/array_allocator.h \ ${ext_srcdir}/bitmap_allocator.h \ ${ext_srcdir}/debug_allocator.h \ ${ext_srcdir}/enc_filebuf.h \ @@ -224,6 +225,11 @@ ext_headers = \ ${ext_srcdir}/hash_fun.h \ ${ext_srcdir}/hashtable.h +tr1_srcdir = ${glibcxx_srcdir}/include/tr1 +tr1_builddir = ./tr1 +tr1_headers = \ + ${tr1_srcdir}/array + # This is the common subset of files that all three "C" header models use. c_base_srcdir = $(C_INCLUDE_DIR) c_base_builddir = . @@ -380,7 +386,7 @@ endif # CLEANFILES and all-local are kept up-to-date. allstamped = \ stamp-std stamp-bits stamp-c_base stamp-c_compatibility \ - stamp-backward stamp-ext stamp-debug stamp-host + stamp-backward stamp-ext stamp-tr1 stamp-debug stamp-host # List of all files that are created by explicit building, editing, or # catenation. @@ -459,6 +465,16 @@ stamp-ext: ${ext_headers} fi ;\ $(STAMP) stamp-ext + +stamp-tr1: ${tr1_headers} + @if [ ! -d "${tr1_builddir}" ]; then \ + mkdir -p ${tr1_builddir} ;\ + fi ;\ + if [ ! -f stamp-tr1 ]; then \ + (cd ${tr1_builddir} && $(LN_S) $? . || true) ;\ + fi ;\ + $(STAMP) stamp-tr1 + stamp-debug: ${debug_headers} @if [ ! -d "${debug_builddir}" ]; then \ mkdir -p ${debug_builddir} ;\ @@ -596,6 +612,9 @@ install-headers: $(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${ext_builddir} for file in ${ext_headers}; do \ $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${ext_builddir}; done + $(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${tr1_builddir} + for file in ${tr1_headers}; do \ + $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${tr1_builddir}; done $(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${c_base_builddir} for file in ${c_base_headers_rename}; do \ $(INSTALL_DATA) ${c_base_builddir}/$${file} $(DESTDIR)${gxx_include_dir}/${c_base_builddir}; done diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in index b6f4be72c69..4a2ec864dd8 100644 --- a/libstdc++-v3/include/Makefile.in +++ b/libstdc++-v3/include/Makefile.in @@ -117,6 +117,8 @@ GLIBCXX_HOSTED_TRUE = @GLIBCXX_HOSTED_TRUE@ GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@ GLIBCXX_TEST_ABI_FALSE = @GLIBCXX_TEST_ABI_FALSE@ GLIBCXX_TEST_ABI_TRUE = @GLIBCXX_TEST_ABI_TRUE@ +GLIBCXX_TEST_THREAD_FALSE = @GLIBCXX_TEST_THREAD_FALSE@ +GLIBCXX_TEST_THREAD_TRUE = @GLIBCXX_TEST_THREAD_TRUE@ GLIBCXX_TEST_WCHAR_T_FALSE = @GLIBCXX_TEST_WCHAR_T_FALSE@ GLIBCXX_TEST_WCHAR_T_TRUE = @GLIBCXX_TEST_WCHAR_T_TRUE@ INSTALL_DATA = @INSTALL_DATA@ @@ -416,6 +418,7 @@ ext_srcdir = ${glibcxx_srcdir}/include/ext ext_builddir = ./ext ext_headers = \ ${ext_srcdir}/algorithm \ + ${ext_srcdir}/array_allocator.h \ ${ext_srcdir}/bitmap_allocator.h \ ${ext_srcdir}/debug_allocator.h \ ${ext_srcdir}/enc_filebuf.h \ @@ -439,6 +442,11 @@ ext_headers = \ ${ext_srcdir}/hash_fun.h \ ${ext_srcdir}/hashtable.h +tr1_srcdir = ${glibcxx_srcdir}/include/tr1 +tr1_builddir = ./tr1 +tr1_headers = \ + ${tr1_srcdir}/array + # This is the common subset of files that all three "C" header models use. c_base_srcdir = $(C_INCLUDE_DIR) @@ -591,7 +599,7 @@ PCHFLAGS = -Winvalid-pch -Wno-deprecated -x c++-header $(CXXFLAGS) # CLEANFILES and all-local are kept up-to-date. allstamped = \ stamp-std stamp-bits stamp-c_base stamp-c_compatibility \ - stamp-backward stamp-ext stamp-debug stamp-host + stamp-backward stamp-ext stamp-tr1 stamp-debug stamp-host # List of all files that are created by explicit building, editing, or @@ -839,6 +847,15 @@ stamp-ext: ${ext_headers} fi ;\ $(STAMP) stamp-ext +stamp-tr1: ${tr1_headers} + @if [ ! -d "${tr1_builddir}" ]; then \ + mkdir -p ${tr1_builddir} ;\ + fi ;\ + if [ ! -f stamp-tr1 ]; then \ + (cd ${tr1_builddir} && $(LN_S) $? . || true) ;\ + fi ;\ + $(STAMP) stamp-tr1 + stamp-debug: ${debug_headers} @if [ ! -d "${debug_builddir}" ]; then \ mkdir -p ${debug_builddir} ;\ @@ -970,6 +987,9 @@ install-headers: $(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${ext_builddir} for file in ${ext_headers}; do \ $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${ext_builddir}; done + $(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${tr1_builddir} + for file in ${tr1_headers}; do \ + $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${tr1_builddir}; done $(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${c_base_builddir} for file in ${c_base_headers_rename}; do \ $(INSTALL_DATA) ${c_base_builddir}/$${file} $(DESTDIR)${gxx_include_dir}/${c_base_builddir}; done diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config index 7142416120f..0a0950d110b 100644 --- a/libstdc++-v3/include/bits/c++config +++ b/libstdc++-v3/include/bits/c++config @@ -35,7 +35,7 @@ #include <bits/os_defines.h> // The current version of the C++ library in compressed ISO date format. -#define __GLIBCXX__ 20041006 +#define __GLIBCXX__ 20041008 // Allow use of "export template." This is currently not a feature // that g++ supports. diff --git a/libstdc++-v3/include/bits/list.tcc b/libstdc++-v3/include/bits/list.tcc index 851c4ad70cc..59f9d1ad703 100644 --- a/libstdc++-v3/include/bits/list.tcc +++ b/libstdc++-v3/include/bits/list.tcc @@ -125,8 +125,9 @@ namespace _GLIBCXX_STD iterator __last1 = end(); const_iterator __first2 = __x.begin(); const_iterator __last2 = __x.end(); - while (__first1 != __last1 && __first2 != __last2) - *__first1++ = *__first2++; + for (; __first1 != __last1 && __first2 != __last2; + ++__first1, ++__first2) + *__first1 = *__first2; if (__first2 == __last2) erase(__first1, __last1); else diff --git a/libstdc++-v3/include/bits/stl_tree.h b/libstdc++-v3/include/bits/stl_tree.h index 5e21ccdbb42..0b47dd2de73 100644 --- a/libstdc++-v3/include/bits/stl_tree.h +++ b/libstdc++-v3/include/bits/stl_tree.h @@ -1087,7 +1087,8 @@ namespace std if (__first == begin() && __last == end()) clear(); else - while (__first != __last) erase(__first++); + for (; __first != __last; ++__first) + erase(__first); } template<typename _Key, typename _Val, typename _KeyOfValue, diff --git a/libstdc++-v3/include/ext/array_allocator.h b/libstdc++-v3/include/ext/array_allocator.h new file mode 100644 index 00000000000..22564c821d9 --- /dev/null +++ b/libstdc++-v3/include/ext/array_allocator.h @@ -0,0 +1,141 @@ +// array allocator -*- C++ -*- + +// Copyright (C) 2004 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// As a special exception, you may use this file as part of a free software +// library without restriction. Specifically, if other files instantiate +// templates or use macros or inline functions from this file, or you compile +// this file and link it with other files to produce an executable, this +// file does not by itself cause the resulting executable to be covered by +// the GNU General Public License. This exception does not however +// invalidate any other reasons why the executable file might be covered by +// the GNU General Public License. + +#ifndef _ARRAY_ALLOCATOR_H +#define _ARRAY_ALLOCATOR_H 1 + +#include <cstddef> +#include <new> +#include <tr1/array> + +namespace __gnu_cxx +{ + template<typename _Tp> + class array_allocator_base + { + public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + + pointer + address(reference __x) const { return &__x; } + + const_pointer + address(const_reference __x) const { return &__x; } + + void + deallocate(pointer __p, size_type) + { + // Does nothing. + } + + size_type + max_size() const throw() + { return size_t(-1) / sizeof(_Tp); } + + // _GLIBCXX_RESOLVE_LIB_DEFECTS + // 402. wrong new expression in [some_] allocator::construct + void + construct(pointer __p, const _Tp& __val) + { ::new(__p) value_type(__val); } + + void + destroy(pointer __p) { __p->~_Tp(); } + }; + + /** + * @brief An allocator that uses previously allocated memory. + * This memory can be externally, globally, or otherwise allocated. + * + * (See @link Allocators allocators info @endlink for more.) + */ + template<typename _Tp, typename _Array = std::tr1::array<_Tp> > + class array_allocator : public array_allocator_base<_Tp> + { + public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef _Tp* pointer; + typedef const _Tp* const_pointer; + typedef _Tp& reference; + typedef const _Tp& const_reference; + typedef _Tp value_type; + + typedef _Array array_type; + + array_type* _M_array; + + template<typename _Tp1, typename _Array1 = _Array> + struct rebind + { typedef array_allocator<_Tp1, _Array1> other; }; + + array_allocator(array_type* __array = NULL) throw() + : _M_array(__array) + { } + + array_allocator(const array_allocator& __o) throw() + : _M_array(__o._M_array) { } + + template<typename _Tp1, typename _Array1> + array_allocator(const array_allocator<_Tp1, _Array1>&) throw() + : _M_array(NULL) { } + + ~array_allocator() throw() { } + + pointer + allocate(size_type __n, const void* = 0) + { + static size_type used; + if (__builtin_expect(used > array_type::_S_index, false)) + throw std::bad_alloc(); + pointer __ret = _M_array->begin() + used; + used += __n; + return __ret; + } + }; + + template<typename _Tp, typename _Array> + inline bool + operator==(const array_allocator<_Tp, _Array>&, + const array_allocator<_Tp, _Array>&) + { return true; } + + template<typename _Tp, typename _Array> + inline bool + operator!=(const array_allocator<_Tp, _Array>&, + const array_allocator<_Tp, _Array>&) + { return false; } +} // namespace __gnu_cxx + +#endif diff --git a/libstdc++-v3/include/tr1/array b/libstdc++-v3/include/tr1/array new file mode 100644 index 00000000000..e41fced7f3b --- /dev/null +++ b/libstdc++-v3/include/tr1/array @@ -0,0 +1,200 @@ +// class template array -*- C++ -*- + +// Copyright (C) 2004 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// As a special exception, you may use this file as part of a free software +// library without restriction. Specifically, if other files instantiate +// templates or use macros or inline functions from this file, or you compile +// this file and link it with other files to produce an executable, this +// file does not by itself cause the resulting executable to be covered by +// the GNU General Public License. This exception does not however +// invalidate any other reasons why the executable file might be covered by +// the GNU General Public License. + +#ifndef _ARRAY +#define _ARRAY 1 + +#include <new> +#include <iterator> + +//namespace std::tr1 +namespace std +{ +namespace tr1 +{ + // [6.2.2] Class template array template + // Requires complete type _Tp. + // Use of char array allows _Tp to skirt default constructable requirement. + template<typename _Tp, size_t _Nm = 1> + struct array + { + enum { _S_index = _Nm }; + + typedef _Tp value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef value_type* iterator; + typedef const value_type* const_iterator; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef std::reverse_iterator<iterator> reverse_iterator; + typedef std::reverse_iterator<const_iterator> const_reverse_iterator; + typedef char layout_type[sizeof(_Tp)] __attribute__ ((aligned(__alignof__(_Tp)))); + + layout_type _M_instance[_Nm]; + + // No explicit construct/copy/destroy for aggregate type. + + void + assign(const value_type& u); + + void + swap(array&); + + // Iterators. + iterator + begin() + { return reinterpret_cast<iterator>(&_M_instance[0]); } + + const_iterator + begin() const + { return reinterpret_cast<const_iterator>(&_M_instance[0]); } + + iterator + end() + { return reinterpret_cast<iterator>(&_M_instance[_S_index - 1]); } + + const_iterator + end() const + { return reinterpret_cast<iterator>(&_M_instance[_S_index - 1]); } + + reverse_iterator + rbegin() + { return reverse_iterator(this->end()); } + + const_reverse_iterator + rbegin() const + { return const_reverse_iterator(this->end()); } + + reverse_iterator + rend() + { return reverse_iterator(this->begin()); } + + const_reverse_iterator + rend() const + { return const_reverse_iterator(this->begin()); } + + // Capacity. + size_type + size() const { return _S_index; } + + size_type + max_size() const + { + // XXX Not specified. Unnecessary, this is fixed-size. + return _S_index; + } + + bool + empty() const; + + // Element access. + reference + operator[](size_type __n) + { return reinterpret_cast<reference>(_M_instance[__n]); } + + const_reference + operator[](size_type __n) const + { return reinterpret_cast<const_reference>(_M_instance[__n]); } + + const_reference + at(size_type __n) const + { + if (__builtin_expect(__n > _S_index, false)) + throw std::bad_alloc(); + return reinterpret_cast<const_reference>(_M_instance[__n]); + } + + reference + at(size_type __n) + { + if (__builtin_expect(__n > _S_index, false)) + throw std::bad_alloc(); + return reinterpret_cast<reference>(_M_instance[__n]); + } + + reference + front(); + + const_reference + front() const; + + reference + back(); + + const_reference + back() const; + + _Tp* + data(); + + const _Tp* + data() const; + }; + + // Array comparisons. + template<typename _Tp, size_t _Nm> + bool + operator==(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) + { return false; } + + template<typename _Tp, size_t _Nm> + bool + operator!=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) + { return !(__one == __two); } + + template<typename _Tp, size_t _Nm> + bool + operator<(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) + { return false; } + + template<typename _Tp, size_t _Nm> + bool + operator>(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) + { return false; } + + template<typename _Tp, size_t _Nm> + bool + operator<=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) + { return false; } + + template<typename _Tp, size_t _Nm> + bool + operator>=(const array<_Tp, _Nm>& __one, const array<_Tp, _Nm>& __two) + { return false; } + + // [6.2.2.2] Specialized algorithms. + template<typename _Tp, size_t _Nm> + void + swap(array<_Tp, _Nm>& __one, array<_Tp, _Nm>& __two) + { swap_ranges(__one.begin(), __one.end(), __two.begin()); } +} // namespace std::tr1 +} + +#endif diff --git a/libstdc++-v3/libmath/Makefile.in b/libstdc++-v3/libmath/Makefile.in index 87b0dae8530..03b598be469 100644 --- a/libstdc++-v3/libmath/Makefile.in +++ b/libstdc++-v3/libmath/Makefile.in @@ -134,6 +134,8 @@ GLIBCXX_HOSTED_TRUE = @GLIBCXX_HOSTED_TRUE@ GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@ GLIBCXX_TEST_ABI_FALSE = @GLIBCXX_TEST_ABI_FALSE@ GLIBCXX_TEST_ABI_TRUE = @GLIBCXX_TEST_ABI_TRUE@ +GLIBCXX_TEST_THREAD_FALSE = @GLIBCXX_TEST_THREAD_FALSE@ +GLIBCXX_TEST_THREAD_TRUE = @GLIBCXX_TEST_THREAD_TRUE@ GLIBCXX_TEST_WCHAR_T_FALSE = @GLIBCXX_TEST_WCHAR_T_FALSE@ GLIBCXX_TEST_WCHAR_T_TRUE = @GLIBCXX_TEST_WCHAR_T_TRUE@ INSTALL_DATA = @INSTALL_DATA@ diff --git a/libstdc++-v3/libsupc++/Makefile.in b/libstdc++-v3/libsupc++/Makefile.in index 765d4c9b354..9c622e04451 100644 --- a/libstdc++-v3/libsupc++/Makefile.in +++ b/libstdc++-v3/libsupc++/Makefile.in @@ -173,6 +173,8 @@ GLIBCXX_HOSTED_TRUE = @GLIBCXX_HOSTED_TRUE@ GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@ GLIBCXX_TEST_ABI_FALSE = @GLIBCXX_TEST_ABI_FALSE@ GLIBCXX_TEST_ABI_TRUE = @GLIBCXX_TEST_ABI_TRUE@ +GLIBCXX_TEST_THREAD_FALSE = @GLIBCXX_TEST_THREAD_FALSE@ +GLIBCXX_TEST_THREAD_TRUE = @GLIBCXX_TEST_THREAD_TRUE@ GLIBCXX_TEST_WCHAR_T_FALSE = @GLIBCXX_TEST_WCHAR_T_FALSE@ GLIBCXX_TEST_WCHAR_T_TRUE = @GLIBCXX_TEST_WCHAR_T_TRUE@ INSTALL_DATA = @INSTALL_DATA@ diff --git a/libstdc++-v3/po/Makefile.in b/libstdc++-v3/po/Makefile.in index 3694b33749f..edd8f270b3b 100644 --- a/libstdc++-v3/po/Makefile.in +++ b/libstdc++-v3/po/Makefile.in @@ -117,6 +117,8 @@ GLIBCXX_HOSTED_TRUE = @GLIBCXX_HOSTED_TRUE@ GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@ GLIBCXX_TEST_ABI_FALSE = @GLIBCXX_TEST_ABI_FALSE@ GLIBCXX_TEST_ABI_TRUE = @GLIBCXX_TEST_ABI_TRUE@ +GLIBCXX_TEST_THREAD_FALSE = @GLIBCXX_TEST_THREAD_FALSE@ +GLIBCXX_TEST_THREAD_TRUE = @GLIBCXX_TEST_THREAD_TRUE@ GLIBCXX_TEST_WCHAR_T_FALSE = @GLIBCXX_TEST_WCHAR_T_FALSE@ GLIBCXX_TEST_WCHAR_T_TRUE = @GLIBCXX_TEST_WCHAR_T_TRUE@ INSTALL_DATA = @INSTALL_DATA@ diff --git a/libstdc++-v3/scripts/create_testsuite_files b/libstdc++-v3/scripts/create_testsuite_files index 50f2e13f856..582f8f5b0ac 100755 --- a/libstdc++-v3/scripts/create_testsuite_files +++ b/libstdc++-v3/scripts/create_testsuite_files @@ -47,15 +47,22 @@ else grep -v wchar_t $tmp.1 > $tmp.2 fi +# If the library is not configured to support threads, don't run those tests. +if test -f "$outdir/testsuite_thread"; then + mv $tmp.2 $tmp.3 +else + grep -v thread $tmp.2 > $tmp.3 +fi + # Now filter out classes of tests. These classes are run using special rules. -grep _xin $tmp.2 > $tests_file_inter -grep -v _xin $tmp.2 > $tmp.3 +grep _xin $tmp.3 > $tests_file_inter +grep -v _xin $tmp.3 > $tmp.4 -grep performance $tmp.3 > $tests_file_perf -grep -v performance $tmp.3 > $tmp.4 +grep performance $tmp.4 > $tests_file_perf +grep -v performance $tmp.4 > $tmp.5 # ...more filters go here. -cp $tmp.4 $tests_file_normal +cp $tmp.5 $tests_file_normal rm $tmp* exit 0 diff --git a/libstdc++-v3/src/Makefile.in b/libstdc++-v3/src/Makefile.in index 91644529c25..ba9df3c4999 100644 --- a/libstdc++-v3/src/Makefile.in +++ b/libstdc++-v3/src/Makefile.in @@ -152,6 +152,8 @@ GLIBCXX_HOSTED_TRUE = @GLIBCXX_HOSTED_TRUE@ GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@ GLIBCXX_TEST_ABI_FALSE = @GLIBCXX_TEST_ABI_FALSE@ GLIBCXX_TEST_ABI_TRUE = @GLIBCXX_TEST_ABI_TRUE@ +GLIBCXX_TEST_THREAD_FALSE = @GLIBCXX_TEST_THREAD_FALSE@ +GLIBCXX_TEST_THREAD_TRUE = @GLIBCXX_TEST_THREAD_TRUE@ GLIBCXX_TEST_WCHAR_T_FALSE = @GLIBCXX_TEST_WCHAR_T_FALSE@ GLIBCXX_TEST_WCHAR_T_TRUE = @GLIBCXX_TEST_WCHAR_T_TRUE@ INSTALL_DATA = @INSTALL_DATA@ diff --git a/libstdc++-v3/src/mt_allocator.cc b/libstdc++-v3/src/mt_allocator.cc index 066726b0367..1e45f4cfb1b 100644 --- a/libstdc++-v3/src/mt_allocator.cc +++ b/libstdc++-v3/src/mt_allocator.cc @@ -298,10 +298,13 @@ namespace __gnu_cxx _Block_record* __block = NULL; if (__gthread_active_p()) { + __gthread_mutex_lock(__bin._M_mutex); if (__bin._M_first[0] == NULL) { // No need to hold the lock when we are adding a whole // chunk to our own list. + __gthread_mutex_unlock(__bin._M_mutex); + void* __v = ::operator new(__options._M_chunk_size); __bin._M_first[__thread_id] = static_cast<_Block_record*>(__v); __bin._M_free[__thread_id] = __block_count; @@ -327,7 +330,6 @@ namespace __gnu_cxx // Is the number of required blocks greater than or equal // to the number that can be provided by the global free // list? - __gthread_mutex_lock(__bin._M_mutex); __bin._M_first[__thread_id] = __bin._M_first[0]; if (__block_count >= __bin._M_free[0]) { diff --git a/libstdc++-v3/testsuite/Makefile.am b/libstdc++-v3/testsuite/Makefile.am index 9e11ac30ae9..a003497ecaf 100644 --- a/libstdc++-v3/testsuite/Makefile.am +++ b/libstdc++-v3/testsuite/Makefile.am @@ -57,7 +57,7 @@ endif abi_check_SOURCES = abi_check.cc abi_check_DEPENDENCIES = libv3test.a -all-local: stamp_wchar testsuite_files +all-local: stamp_wchar stamp_thread testsuite_files # Enable wchar_t tests if capable. if GLIBCXX_TEST_WCHAR_T @@ -67,6 +67,14 @@ else stamp_wchar: endif +# Enable thread tests if capable. +if GLIBCXX_TEST_THREAD +stamp_thread: + touch testsuite_thread +else +stamp_thread: +endif + # Generated lists of files to run. All of these names are valid make # targets, if you wish to generate a list manually. lists_of_files = \ @@ -183,4 +191,4 @@ check-script check-script-install check-performance # By adding these files here, automake will remove them for 'make clean' CLEANFILES = *.txt *.tst *.exe core* filebuf_* tmp* ostream_* *.log *.sum \ - testsuite_* site.exp abi_check baseline_symbols + testsuite_* site.exp abi_check baseline_symbols *TEST* diff --git a/libstdc++-v3/testsuite/Makefile.in b/libstdc++-v3/testsuite/Makefile.in index 3a79b7ec10b..1005b34e58d 100644 --- a/libstdc++-v3/testsuite/Makefile.in +++ b/libstdc++-v3/testsuite/Makefile.in @@ -146,6 +146,8 @@ GLIBCXX_HOSTED_TRUE = @GLIBCXX_HOSTED_TRUE@ GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@ GLIBCXX_TEST_ABI_FALSE = @GLIBCXX_TEST_ABI_FALSE@ GLIBCXX_TEST_ABI_TRUE = @GLIBCXX_TEST_ABI_TRUE@ +GLIBCXX_TEST_THREAD_FALSE = @GLIBCXX_TEST_THREAD_FALSE@ +GLIBCXX_TEST_THREAD_TRUE = @GLIBCXX_TEST_THREAD_TRUE@ GLIBCXX_TEST_WCHAR_T_FALSE = @GLIBCXX_TEST_WCHAR_T_FALSE@ GLIBCXX_TEST_WCHAR_T_TRUE = @GLIBCXX_TEST_WCHAR_T_TRUE@ INSTALL_DATA = @INSTALL_DATA@ @@ -311,7 +313,7 @@ performance_script = ${glibcxx_srcdir}/scripts/check_performance # By adding these files here, automake will remove them for 'make clean' CLEANFILES = *.txt *.tst *.exe core* filebuf_* tmp* ostream_* *.log *.sum \ - testsuite_* site.exp abi_check baseline_symbols + testsuite_* site.exp abi_check baseline_symbols *TEST* all: all-am @@ -575,13 +577,18 @@ uninstall-am: uninstall-info-am tags uninstall uninstall-am uninstall-info-am -all-local: stamp_wchar testsuite_files +all-local: stamp_wchar stamp_thread testsuite_files # Enable wchar_t tests if capable. @GLIBCXX_TEST_WCHAR_T_TRUE@stamp_wchar: @GLIBCXX_TEST_WCHAR_T_TRUE@ touch testsuite_wchar_t @GLIBCXX_TEST_WCHAR_T_FALSE@stamp_wchar: +# Enable thread tests if capable. +@GLIBCXX_TEST_THREAD_TRUE@stamp_thread: +@GLIBCXX_TEST_THREAD_TRUE@ touch testsuite_thread +@GLIBCXX_TEST_THREAD_FALSE@stamp_thread: + # We need more things in site.exp, but automake completely controls the # creation of that file; there's no way to append to it without messing up # the dependancy chains. So we overrule automake. This rule is exactly diff --git a/libstdc++-v3/testsuite/ext/array_allocator/1.cc b/libstdc++-v3/testsuite/ext/array_allocator/1.cc new file mode 100644 index 00000000000..68cbc73f3f7 --- /dev/null +++ b/libstdc++-v3/testsuite/ext/array_allocator/1.cc @@ -0,0 +1,65 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// As a special exception, you may use this file as part of a free software +// library without restriction. Specifically, if other files instantiate +// templates or use macros or inline functions from this file, or you compile +// this file and link it with other files to produce an executable, this +// file does not by itself cause the resulting executable to be covered by +// the GNU General Public License. This exception does not however +// invalidate any other reasons why the executable file might be covered by +// the GNU General Public License. + +#include <cassert> +#include <string> +#include <ext/array_allocator.h> + +typedef char char_type; +typedef std::char_traits<char_type> traits_type; +typedef std::tr1::array<char_type, 4> array_type; + +array_type extern_array; + +void test01() +{ + using std::basic_string; + typedef __gnu_cxx::array_allocator<char_type, array_type> allocator_type; + typedef basic_string<char_type, traits_type, allocator_type> string_type; + + allocator_type a(&extern_array); + string_type s(a); + + try + { + s.reserve(4); // Actually need 4 + 1 + sizeof(std::string::_Rep). + } + catch(std::bad_alloc& obj) + { + assert(true); + } + catch(...) + { + assert(false); + } +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/ext/array_allocator/2.cc b/libstdc++-v3/testsuite/ext/array_allocator/2.cc new file mode 100644 index 00000000000..2d757b533aa --- /dev/null +++ b/libstdc++-v3/testsuite/ext/array_allocator/2.cc @@ -0,0 +1,72 @@ +// Copyright (C) 2004 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 2, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING. If not, write to the Free +// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, +// USA. + +// As a special exception, you may use this file as part of a free software +// library without restriction. Specifically, if other files instantiate +// templates or use macros or inline functions from this file, or you compile +// this file and link it with other files to produce an executable, this +// file does not by itself cause the resulting executable to be covered by +// the GNU General Public License. This exception does not however +// invalidate any other reasons why the executable file might be covered by +// the GNU General Public License. + +#include <cassert> +#include <string> +#include <iostream> +#include <ext/array_allocator.h> + +typedef char char_type; +typedef std::char_traits<char_type> traits_type; +typedef std::tr1::array<char_type, 17> array_type; + +array_type extern_array; + +void test01() +{ + using std::basic_string; + typedef __gnu_cxx::array_allocator<char_type, array_type> allocator_type; + typedef basic_string<char_type, traits_type, allocator_type> string_type; + + size_t index = array_type::_S_index; + allocator_type a(&extern_array); + string_type s(a); + + try + { + s.reserve(4); // Actually need 4 + 1 + sizeof(std::string::_Rep). + } + catch(std::bad_alloc& obj) + { + assert(false); + } + catch(...) + { + assert(false); + } + + s.append(1, 'c'); + s.append(2, 'b'); + + std::cout << s.c_str() << std::endl; +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/ext/mt_allocator/deallocate_global-1.cc b/libstdc++-v3/testsuite/ext/mt_allocator/deallocate_global_thread-1.cc index 1f0ac281af7..1f0ac281af7 100644 --- a/libstdc++-v3/testsuite/ext/mt_allocator/deallocate_global-1.cc +++ b/libstdc++-v3/testsuite/ext/mt_allocator/deallocate_global_thread-1.cc diff --git a/libstdc++-v3/testsuite/ext/mt_allocator/deallocate_global-3.cc b/libstdc++-v3/testsuite/ext/mt_allocator/deallocate_global_thread-3.cc index 10efea66ec6..10efea66ec6 100644 --- a/libstdc++-v3/testsuite/ext/mt_allocator/deallocate_global-3.cc +++ b/libstdc++-v3/testsuite/ext/mt_allocator/deallocate_global_thread-3.cc diff --git a/libstdc++-v3/testsuite/ext/mt_allocator/deallocate_local-1.cc b/libstdc++-v3/testsuite/ext/mt_allocator/deallocate_local_thread-1.cc index 5664d3caff8..5664d3caff8 100644 --- a/libstdc++-v3/testsuite/ext/mt_allocator/deallocate_local-1.cc +++ b/libstdc++-v3/testsuite/ext/mt_allocator/deallocate_local_thread-1.cc diff --git a/libstdc++-v3/testsuite/ext/mt_allocator/deallocate_local-3.cc b/libstdc++-v3/testsuite/ext/mt_allocator/deallocate_local_thread-3.cc index 973f758d98d..973f758d98d 100644 --- a/libstdc++-v3/testsuite/ext/mt_allocator/deallocate_local-3.cc +++ b/libstdc++-v3/testsuite/ext/mt_allocator/deallocate_local_thread-3.cc diff --git a/libstdc++-v3/testsuite/ext/mt_allocator/instantiate.cc b/libstdc++-v3/testsuite/ext/mt_allocator/instantiate.cc index 579b8bcf18d..4fa49aa09cc 100644 --- a/libstdc++-v3/testsuite/ext/mt_allocator/instantiate.cc +++ b/libstdc++-v3/testsuite/ext/mt_allocator/instantiate.cc @@ -27,7 +27,9 @@ using namespace __gnu_cxx; template class __mt_alloc<int>; -template class __mt_alloc<short, __common_pool_policy<true> >; template class __mt_alloc<short, __common_pool_policy<false> >; -template class __mt_alloc<short, __per_type_pool_policy<short, true> >; template class __mt_alloc<short, __per_type_pool_policy<short, false> >; +#ifdef __GTHREADS +template class __mt_alloc<short, __common_pool_policy<true> >; +template class __mt_alloc<short, __per_type_pool_policy<short, true> >; +#endif diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp index 2e8db1f4f5a..29ae62ed00c 100644 --- a/libstdc++-v3/testsuite/lib/libstdc++.exp +++ b/libstdc++-v3/testsuite/lib/libstdc++.exp @@ -29,7 +29,6 @@ # libstdc++_* callbacks we don't define, but could: # ..._option_help prints additional --help output # ..._option_proc (--foo) process our own options -# ..._exit cleanup routines (do we need any?) # ..._init (normal.exp) called once per test file # ..._finish bracketing function for libstdc++_init # ...-dg-prune removing output text, see top of system dg.exp @@ -212,6 +211,16 @@ proc libstdc++_init { testfile } { libstdc++_maybe_build_wrapper "${objdir}/testglue.o" } +# Callback for cleanup routines. +proc libstdc++_exit { } { + global gluefile; + + if [info exists gluefile] { + file_on_build delete $gluefile; + unset gluefile; + } +} + # Callback from system dg-test. proc libstdc++-dg-test { prog do_what extra_tool_flags } { # Set up the compiler flags, based on what we're going to do. diff --git a/libstdc++-v3/testsuite/thread/pthread1.cc b/libstdc++-v3/testsuite/thread/pthread1.cc index 1b225f202c6..26d198a755e 100644 --- a/libstdc++-v3/testsuite/thread/pthread1.cc +++ b/libstdc++-v3/testsuite/thread/pthread1.cc @@ -34,7 +34,6 @@ // Do not include <pthread.h> explicitly; if threads are properly // configured for the port, then it is picked up free from STL headers. -#if __GTHREADS using namespace std; const int thread_cycles = 10; @@ -135,6 +134,3 @@ main () return 0; } -#else -int main (void) {} -#endif diff --git a/libstdc++-v3/testsuite/thread/pthread2.cc b/libstdc++-v3/testsuite/thread/pthread2.cc index 7fbdfc03aeb..7a0efd067a2 100644 --- a/libstdc++-v3/testsuite/thread/pthread2.cc +++ b/libstdc++-v3/testsuite/thread/pthread2.cc @@ -28,8 +28,6 @@ // Do not include <pthread.h> explicitly; if threads are properly // configured for the port, then it is picked up free from STL headers. -#if __GTHREADS - const int max_thread_count = 2; const int max_loop_count = 1000000; @@ -62,6 +60,3 @@ main() return 0; } -#else -int main (void) {} -#endif diff --git a/libstdc++-v3/testsuite/thread/pthread3.cc b/libstdc++-v3/testsuite/thread/pthread3.cc index ca8f77147e7..4696fb76cdc 100644 --- a/libstdc++-v3/testsuite/thread/pthread3.cc +++ b/libstdc++-v3/testsuite/thread/pthread3.cc @@ -28,8 +28,6 @@ // Do not include <pthread.h> explicitly; if threads are properly // configured for the port, then it is picked up free from STL headers. -#if __GTHREADS - const int max_thread_count = 2; const int max_loop_count = 1000000; @@ -59,6 +57,3 @@ main() return 0; } -#else -int main (void) {} -#endif diff --git a/libstdc++-v3/testsuite/thread/pthread4.cc b/libstdc++-v3/testsuite/thread/pthread4.cc index be1ae680fa7..a9ec9b84e38 100644 --- a/libstdc++-v3/testsuite/thread/pthread4.cc +++ b/libstdc++-v3/testsuite/thread/pthread4.cc @@ -30,7 +30,6 @@ // Do not include <pthread.h> explicitly; if threads are properly // configured for the port, then it is picked up free from STL headers. -#if __GTHREADS using namespace std; static list<string> foo; @@ -113,6 +112,3 @@ main (void) return 0; } -#else -int main (void) {} -#endif diff --git a/libstdc++-v3/testsuite/thread/pthread5.cc b/libstdc++-v3/testsuite/thread/pthread5.cc index b950542fd61..93f03a22761 100644 --- a/libstdc++-v3/testsuite/thread/pthread5.cc +++ b/libstdc++-v3/testsuite/thread/pthread5.cc @@ -31,7 +31,6 @@ // Do not include <pthread.h> explicitly; if threads are properly // configured for the port, then it is picked up free from STL headers. -#if __GTHREADS #ifdef _GLIBCXX_HAVE_UNISTD_H #include <unistd.h> // To test for _POSIX_THREAD_PRIORITY_SCHEDULING #endif @@ -130,6 +129,3 @@ main () return (0); } -#else -int main (void) {} -#endif diff --git a/libstdc++-v3/testsuite/thread/pthread6.cc b/libstdc++-v3/testsuite/thread/pthread6.cc index e0fee71deac..ba8c341c3f8 100644 --- a/libstdc++-v3/testsuite/thread/pthread6.cc +++ b/libstdc++-v3/testsuite/thread/pthread6.cc @@ -30,8 +30,6 @@ // Do not include <pthread.h> explicitly; if threads are properly // configured for the port, then it is picked up free from STL headers. -#if __GTHREADS - const int max_thread_count = 8; const int loops = 100000; @@ -94,6 +92,3 @@ main (void) return 0; } -#else -int main (void) {} -#endif diff --git a/libstdc++-v3/testsuite/thread/pthread7-rope.cc b/libstdc++-v3/testsuite/thread/pthread7-rope.cc index 2f401344ff4..307973c202d 100644 --- a/libstdc++-v3/testsuite/thread/pthread7-rope.cc +++ b/libstdc++-v3/testsuite/thread/pthread7-rope.cc @@ -29,13 +29,12 @@ // Do not include <pthread.h> explicitly; if threads are properly // configured for the port, then it is picked up free from STL headers. -#if __GTHREADS - const int max_thread_count = 4; const int max_loop_count = 10000; -__gnu_cxx::crope foo2; -__gnu_cxx::crope foo4; +typedef __gnu_cxx::rope<char, std::allocator<char> > rope_type; +rope_type foo2; +rope_type foo4; void* thread_main(void *) { @@ -73,7 +72,7 @@ main() pthread_setconcurrency (max_thread_count); #endif - __gnu_cxx::crope foo; + rope_type foo; foo += "bar"; foo += "baz"; foo += "bongle"; @@ -89,7 +88,7 @@ main() VERIFY( !std::strcmp (data2, "bar2baz2bongle2") ); } - __gnu_cxx::crope foo3 ("hello"); + rope_type foo3 ("hello"); const char* data3 = foo3.c_str(); VERIFY( !std::strcmp (data3, "hello") ); @@ -112,6 +111,3 @@ main() return 0; } -#else -int main (void) {} -#endif |