1. 26 Nov, 1998 10 commits
    • test_summary (address): added Marc Lehmann's testsuite-results to the default e-mail address · aa4d18c9
      	* test_summary (address): added Marc Lehmann's testsuite-results
      	to the default e-mail address
      
      From-SVN: r23908
      Alexandre Oliva committed
    • jcf-path.c (add_entry): recognize ".jar" too · 076b41ee
      	* jcf-path.c (add_entry): recognize ".jar" too
      	* lang-specs.h: ditto
      
      From-SVN: r23907
      Alexandre Oliva committed
    • jcf-write.c (generate_bytecode_insns): In Call_EXPR, handle… · c5941a9f
      jcf-write.c (generate_bytecode_insns): In Call_EXPR, handle soft_monitorenter_node, soft_monitorexit_node, throw_node.
      
      	
      	* jcf-write.c (generate_bytecode_insns):  In Call_EXPR, handle
      	soft_monitorenter_node, soft_monitorexit_node, throw_node.
        	Handle pre/post-increment/decrement of long.
      	Handle missing exception handler (finally for synchronized).
      
      From-SVN: r23904
      Per Bothner committed
    • jcf-write.c (generate_bytecode_insns): In Call_EXPR, handle… · 4c22d9c8
      jcf-write.c (generate_bytecode_insns): In Call_EXPR, handle soft_monitorenter_node, soft_monitorexit_node, throw_node.
      
      H
      	* jcf-write.c (generate_bytecode_insns):  In Call_EXPR, handle
      	soft_monitorenter_node, soft_monitorexit_node, throw_node.
        	Handle pre/post-increment/decrement of long.
      	Handle missing exception handler (finally for synchronized).
      
      From-SVN: r23903
      Per Bothner committed
    • README.C4X: Updated URLs. · 6e863849
      	* README.C4X: Updated URLs.
      	* config/c4x/c4x.c (c4x_address_conflict): Fix typo.
      	(valid_parallel_operands_5): Remove unused variable.
      
      From-SVN: r23897
      Michael Hayes committed
    • * config/c4x/c4x.h (TARGET_DEFAULT): Fix typo. · d97860ae
      From-SVN: r23896
      Michael Hayes committed
    • configure (skip-this-dir): Add handling for new shell script... · 71205e0b
      ./ChangeLog:1998-11-26  Manfred Hollstein  <manfred@s-direktnet.de>
      	* configure (skip-this-dir): Add handling for new shell script, which
      	might be created by a sub-directory's configure to indicate, this particular
      	directory is "unwanted".
      	* Makefile.in ($(CONFIGURE_TARGET_MODULES)): Likewise.
      ./gcc/ChangeLog:1998-11-26  Manfred Hollstein  <manfred@s-direktnet.de>
      	* Makefile.in (CONFIG_LANGUAGES): New macro taking all languages
      	which can be configured.
      	(LANGUAGES): Use $(CONFIG_LANGUAGES) instead of @all_languages@
      	(Makefile): Pass actual LANGUAGES through the environment when
      	re-configuring.
      	(cstamp-h): Likewise.
      	(config.status): Likewise.
      	* configure.in (enable_languages): Add new configuration parameter
      	"--enable-languages=lang1,lang2,...".
      	(${srcdir}/*/config-lang.in): Change handling to configure only
      	those directories, that the user might have enabled; default to
      	"all" existing languages.
      	* configure: Regenerate.
      ./libchill/ChangeLog:1998-11-26  Manfred Hollstein  <manfred@s-direktnet.de>
      	* configure.in (compiler_name): Add check to detect if this
      	language's compiler has been built.
      	* configure: Regenerate.
      ./libf2c/ChangeLog:1998-11-26  Manfred Hollstein  <manfred@s-direktnet.de>
      	* configure.in (compiler_name): Add check to detect if this
      	language's compiler has been built.
      	* configure: Regenerate.
      ./libio/ChangeLog:1998-11-26  Manfred Hollstein  <manfred@s-direktnet.de>
      	* configure.in (compiler_name): Add check to detect if this
      	language's compiler has been built.
      ./libobjc/ChangeLog:1998-11-26  Manfred Hollstein  <manfred@s-direktnet.de>
      	* configure.in (compiler_name): Add check to detect if this
      	language's compiler has been built.
      	* configure: Regenerate.
      ./libstdc++/ChangeLog:1998-11-26  Manfred Hollstein  <manfred@s-direktnet.de>
      	* configure.in (compiler_name): Add check to detect if this
      	language's compiler has been built.
      
      From-SVN: r23892
      Manfred Hollstein committed
    • Daily bump. · 7240472a
      From-SVN: r23889
      Jeff Law committed
    • rtlanal.c (regs_set_between_p): New function. · a2e1a0bf
              * rtlanal.c (regs_set_between_p): New function.
              * rtl.h (regs_set_between_p): Prototype it.
              * jump.c (jump_optimize): Use it instead of modified_between_p
              in the Sep 2 change.
      
      From-SVN: r23888
      Richard Henderson committed
  2. 25 Nov, 1998 30 commits
    • Bulk ns32k patch from Ian Dall. See ChangeLog for details. · 83575957
      Co-Authored-By: Matthias Pfaller <leo@dachau.marco.de>
      
      From-SVN: r23887
      Ian Dall committed
    • * gcc.c (option_map): Recognize --output-class-directory. · 36696297
      From-SVN: r23886
      Tom Tromey committed
    • loop.h (precondition_loop_p): Added new mode argument. · e96b4d7a
       	* loop.h (precondition_loop_p): Added new mode argument.
      	* unroll.c (precondition_loop_p): Likewise.
      	(approx_final_value): Function deleted and subsumed
       	into loop_iterations.
      	(loop_find_equiv_value): New function.
      	(loop_iterations): Use loop_find_equiv_value to find increments
      	too large to be immediate constants.  Also use it to find terms
      	common to initial and final iteration values that can be removed.
      
      From-SVN: r23885
      Michael Hayes committed
    • loop.h (struct loop_info): Define new structure. · 302670f3
      	* loop.h (struct loop_info): Define new structure.
      	(precondition_loop_p): Added prototype.
      	(unroll_loop): Added new argument loop_info to prototype.
      	(final_biv_value, final_giv_value): Added new argument n_iterations
      	to prototype.
      	* loop.c (strength_reduce): Declare new structure loop_iteration_info
      	and new pointer loop_info.
      	(loop_n_iterations): Replace global variable by element in
      	loop_info structure.
      	(check_final_value): New argument n_iterations.
      	(insert_bct): New argument loop_info.
      	(loop_unroll_factor): Replace global array by element in
      	loop_info structure.
      	(loop_optimize): Remove code to allocate and initialise
      	loop_unroll_factor_array.
      	* unroll.c (precondition_loop_p):  No longer static since
      	used by branch on count optimization.
      	(precondition_loop_p, unroll_loop): New argument loop_info.
      	(final_biv_value, final_giv_value, find_splittable_regs): New
      	argument n_iterations.
      	(loop_iteration_var, loop_initial_value, loop_increment,
      	loop_final_value, loop_comparison_code, loop_unroll_factor):
      	Replaced global variables by loop_info structure.
      	(loop_unroll_factor): Replace global array by element in
      	loop_info structure.
      
      From-SVN: r23884
      Michael Hayes committed
    • loop.c (check_dbra_loop): Update JUMP_LABEL field of jump insn when loop reversed. · a7060368
      	* loop.c (check_dbra_loop): Update JUMP_LABEL field of jump insn
      	when loop reversed.
      	* unroll.c (precondition_loop_p): Return loop_initial_value
      	for initial_value instead of loop_iteration_var.
      
      From-SVN: r23881
      Michael Hayes committed
    • c4x.md: Fix minor formatting problems. · 959e0a76
      	* config/c4x/c4x.md: Fix minor formatting problems.  Update docs.
      	(*b, *b_rev, *b_noov, *b_noov_rev, *db,
      	decrement_and_branch_until_zero, rptb_end): Use c4x_output_cbranch
      	to output the instruction sequences.
      	(rpts): Delete.
      	(rptb_top): Provide alternatives to use any register or memory
      	for loop counter.
      	(rptb_end):  Emit use of operands rather than assigning them
      	explicitly to the RS and RE registers.
      
      From-SVN: r23880
      Michael Hayes committed
    • c4x.c: (c4x_override_options): For compatibility with old target options clear... · 4271f003
      	* config/c4x/c4x.c: (c4x_override_options): For compatibility
      	with old target options clear flag_branch_on_count_reg if
      	-mno-rptb specified and set flag_argument_alias is -mno-aliases
      	specified.
      	(c4x_output_cbranch): Handle a sequence of insns rather than a
       	single insn.
      	(c4x_rptb_insert): Do not emit a RPTB insn if the RC register
      	has not been allocated as the loop counter.
      	(c4x_address_conflict): Do not allow two volatile memory references.
      	(valid_parallel_operands_4, valid_parallel_operands_5,
       	valid_parallel_operands_6): Reject pattern if the register destination
      	of the first set is used as part of an address in the second set.
      
      From-SVN: r23879
      Michael Hayes committed
    • c4x.c (c4x_modified_between_p, [...]): Delete. · 0fe69aba
      	* config/c4x/c4x.c (c4x_modified_between_p, c4x_mem_set_p,
       	c4x_mem_set_p, c4x_mem_modified_between_p, c4x_insn_moveable_p,
      	c4x_parallel_pack, c4x_parallel_find, c4x_update_info_reg,
      	c4x_update_info_regs, c4x_copy_insn_after, c4x_copy_insns_after,
      	c4x_merge_notes, c4x_parallel_process,
      	c4x_combine_parallel_independent, c4x_combine_parallel_dependent,
      	c4x_combine_parallel): Delete.
      
      From-SVN: r23878
      Michael Hayes committed
    • lookup5.C: New test. · 51a63112
      	* g++.old-deja/g++.other/lookup5.C: New test.  Not sure the
      	problem is actually related with name lookup, but so what? :-)
      
      From-SVN: r23877
      Alexandre Oliva committed
    • c4x.h (TARGET_DEFAULT): Add PARALEL_MPY_FLAG. · 2e3e9ead
      	* config/c4x/c4x.h (TARGET_DEFAULT): Add PARALEL_MPY_FLAG.
      	(TARGET_SMALL_REG_CLASS): Set to 0 so that SMALL_REGISTER_CLASSES
      	is no longer enabled if PARALLEL_MPY_FLAG set.
      	(HARD_REGNO_CALL_CLOBBERED): Add parentheses to remove ambiguity.
      	(REG_CLASS_CONTENTS): Add braces around initializers.
      	(HAVE_MULTIPLE_PACK): Define.
      	(ASM_OUTPUT_BYTE_FLOAT): Use %lf format specifier with
      	REAL_VALUE_TO_DECIMAL.
      	(ASM_OUTPUT_SHORT_FLOAT): Use %lf format specifier with
      	REAL_VALUE_TO_DECIMAL.
      	(ar0_reg_operand): Add prototype.
      	(ar0_mem_operand): Likewise.
      	(ar1_reg_operand): Likewise.
      	(ar1_mem_operand): Likewise.
      	(ar2_reg_operand): Likewise.
      	(ar2_mem_operand): Likewise.
      	(ar3_reg_operand): Likewise.
      	(ar3_mem_operand): Likewise.
      	(ar4_reg_operand): Likewise.
      	(ar4_mem_operand): Likewise.
      	(ar5_reg_operand): Likewise.
      	(ar5_mem_operand): Likewise.
      	(ar6_reg_operand): Likewise.
      	(ar6_mem_operand): Likewise.
      	(ar7_reg_operand): Likewise.
      	(ar7_mem_operand): Likewise.
      	(ir0_reg_operand): Likewise.
      	(ir0_mem_operand): Likewise.
      	(ir1_reg_operand): Likewise.
      	(ir1_mem_operand): Likewise.
      	(group1_reg_operand): Likewise.
      	(group1_mem_operand): Likewise.
      	(ir1_reg_operand): Likewise.
      	(arx_reg_operand): Likewise.
      	(not_rc_reg): Likewise.
      	(not_modify_reg): Likewise.
      	(c4x_group1_reg_operand): Remove prototype.
      	(c4x_group1_mem_operand): Likewise.
      	(c4x_arx_reg_operand): Likewise.
      
      From-SVN: r23876
      Michael Hayes committed
    • * g++.old-deja/g++.pt/friend37.C: New test. · 3c9a0d0f
      From-SVN: r23875
      Alexandre Oliva committed
    • emit-rtl.c (gen_lowpart_common): Remove earlier change. · a46f03ea
              * emit-rtl.c (gen_lowpart_common): Remove earlier change.
              * real.c (make_nan): Make SIGN arg actually specify the sign bit.
      
      From-SVN: r23874
      Stephen L Moshier committed
    • * Makefile.in (splay-tree.o): Add config.h dependency. · c85c3232
      From-SVN: r23873
      Mike Stump committed
    • c4x.md (addqi3): Emit addqi3_noclobber pattern during reload. · f3ed04e7
      	* config/c4x/c4x.md (addqi3): Emit addqi3_noclobber pattern
      	during reload.
      
      From-SVN: r23872
      Michael Hayes committed
    • java-tree.h (end_params_node): Declare global. · de4c7b02
       
      	* java-tree.h (end_params_node):  Declare global.
      	* decl.c (end_params_node):  New global.
      	(init_decl_processing, start_java_method):  Use end_params_node for
      	end of list of parameter types.  Follows correct gcc conventions.
      	* expr.c (pop_argument_types, pop_arguments):  Likewise.
      	* lang.c (put_decl_node):  Likewise.
      	* typeck.c (various places):  Likewise.
      	* class.y (various places):  Likewise.
      	* parse.y (various places):  Likewise.
      	* parse.y (java_complete_tree):  Move CAN_COMPLETE_NORMALLY.
      	(build_jump_to_finally):  Add missing CAN_COMPLETE_NORMALLY.
      	* class.c:  Add #include flags.h, remove no-longer needed declaration.
      	* class.c (layout_class_method):  Remove commented-out code, re-format.
      	Don't add vtable entry (or index) for private methods.
      	* expr.c (expand_invoke):  A private method is implicitly final.
      	* class.c (make_class_data):  If inlining or optimizing,
      	skip private methods.
      	* class.c (finish_class):  New function.  Calls existing methods,
      	but alls emits deferred inline functions.
      	* jcf-parse.c (parse_class_file):  Call finish_class.
      	* parse.y (java_complete_expand_methods):  Likewise.
      	* expr.c (build_java_binop):  Explicit default, to silence -Wall.
      
      From-SVN: r23871
      Per Bothner committed
    • java-tree.h (end_params_node): Declare global. · 0bd2e6db
      �
      	* java-tree.h (end_params_node):  Declare global.
      	* decl.c (end_params_node):  New global.
      	(init_decl_processing, start_java_method):  Use end_params_node for
      	end of list of parameter types.  Follows correct gcc conventions.
      	* expr.c (pop_argument_types, pop_arguments):  Likewise.
      	* lang.c (put_decl_node):  Likewise.
      	* typeck.c (various places):  Likewise.
      	* class.y (various places):  Likewise.
      	* parse.y (various places):  Likewise.
      	* parse.y (java_complete_tree):  Move CAN_COMPLETE_NORMALLY.
      	(build_jump_to_finally):  Add missing CAN_COMPLETE_NORMALLY.
      	* class.c:  Add #include flags.h, remove no-longer needed declaration.
      	* class.c (layout_class_method):  Remove commented-out code, re-format.
      	Don't add vtable entry (or index) for private methods.
      	* expr.c (expand_invoke):  A private method is implicitly final.
      	* class.c (make_class_data):  If inlining or optimizing,
      	skip private methods.
      	* class.c (finish_class):  New function.  Calls existing methods,
      	but alls emits deferred inline functions.
      	* jcf-parse.c (parse_class_file):  Call finish_class.
      	* parse.y (java_complete_expand_methods):  Likewise.
      	* expr.c (build_java_binop):  Explicit default, to silence -Wall.
      
      From-SVN: r23870
      Per Bothner committed
    • java-tree.h (end_params_node): Declare global. · 75d01ad7
      d
      	* java-tree.h (end_params_node):  Declare global.
      	* decl.c (end_params_node):  New global.
      	(init_decl_processing, start_java_method):  Use end_params_node for
      	end of list of parameter types.  Follows correct gcc conventions.
      	* expr.c (pop_argument_types, pop_arguments):  Likewise.
      	* lang.c (put_decl_node):  Likewise.
      	* typeck.c (various places):  Likewise.
      	* class.y (various places):  Likewise.
      	* parse.y (various places):  Likewise.
      	* parse.y (java_complete_tree):  Move CAN_COMPLETE_NORMALLY.
      	(build_jump_to_finally):  Add missing CAN_COMPLETE_NORMALLY.
      	* class.c:  Add #include flags.h, remove no-longer needed declaration.
      	* class.c (layout_class_method):  Remove commented-out code, re-format.
      	Don't add vtable entry (or index) for private methods.
      	* expr.c (expand_invoke):  A private method is implicitly final.
      	* class.c (make_class_data):  If inlining or optimizing,
      	skip private methods.
      	* class.c (finish_class):  New function.  Calls existing methods,
      	but alls emits deferred inline functions.
      	* jcf-parse.c (parse_class_file):  Call finish_class.
      	* parse.y (java_complete_expand_methods):  Likewise.
      	* expr.c (build_java_binop):  Explicit default, to silence -Wall.
      
      From-SVN: r23869
      Per Bothner committed
    • java-tree.h (end_params_node): Declare global. · df8940cf
      	
      	* java-tree.h (end_params_node):  Declare global.
      	* decl.c (end_params_node):  New global.
      	(init_decl_processing, start_java_method):  Use end_params_node for
      	end of list of parameter types.  Follows correct gcc conventions.
      	* expr.c (pop_argument_types, pop_arguments):  Likewise.
      	* lang.c (put_decl_node):  Likewise.
      	* typeck.c (various places):  Likewise.
      	* class.y (various places):  Likewise.
      	* parse.y (various places):  Likewise.
      	* parse.y (java_complete_tree):  Move CAN_COMPLETE_NORMALLY.
      	(build_jump_to_finally):  Add missing CAN_COMPLETE_NORMALLY.
      	* class.c:  Add #include flags.h, remove no-longer needed declaration.
      	* class.c (layout_class_method):  Remove commented-out code, re-format.
      	Don't add vtable entry (or index) for private methods.
      	* expr.c (expand_invoke):  A private method is implicitly final.
      	* class.c (make_class_data):  If inlining or optimizing,
      	skip private methods.
      	* class.c (finish_class):  New function.  Calls existing methods,
      	but alls emits deferred inline functions.
      	* jcf-parse.c (parse_class_file):  Call finish_class.
      	* parse.y (java_complete_expand_methods):  Likewise.
      	* expr.c (build_java_binop):  Explicit default, to silence -Wall.
      
      From-SVN: r23868
      Per Bothner committed
    • fix typo · 30ef624b
      From-SVN: r23867
      Brendan Kehoe committed
    • lib1funcs.asm (___udivsi3_i4): Don't switch to sz == 1 unless FMOVD_WORKS is defined. · 0e1bd737
      	* config/sh/lib1funcs.asm (___udivsi3_i4): Don't switch to sz == 1
      	unless FMOVD_WORKS is defined.
      
      From-SVN: r23866
      J"orn Rennecke committed
    • test_summary (-p, [...]): add these before the summary · 0a955618
      	* test_summary (-p, prepend_logs): add these before the summary
      	(Compiler, Platform): print these just before configflags
      
      From-SVN: r23864
      Alexandre Oliva committed
    • regclass.c (init_reg_sets): Move code that calculates tables dependent on… · 910bc42d
      regclass.c (init_reg_sets): Move code that calculates tables dependent on reg_class_contents from here...
      
      	* regclass.c (init_reg_sets): Move code that calculates tables
      	dependent on reg_class_contents from here...
      	(init_reg_sets_1): To here.
      
      From-SVN: r23858
      J"orn Rennecke committed
    • cpplib.h: Delete struct import_file. · 0b3d776a
      Wed Nov 25 14:54:46 1998  Zack Weinberg  <zack@rabi.phys.columbia.edu>
              * cpplib.h: Delete struct import_file.  Add ihash element to
              struct cpp_buffer.  Delete dont_repeat_files and
              import_hash_table elements from cpp_reader; change
              all_include_files to a hash table.  Delete all foobar_include
              / last_foobar_include elements from struct cpp_options; put
              back four such: quote_include, bracket_include,
              system_include, after_include.  Redo struct file_name_list
              completely.  Add new structure type include_hash.  Add
              prototypes for merge_include_chains and include_hash.  Change
              prototypes for finclude, find_include_file, and
              append_include_chain to match changes below.
              * cppfiles.c (simplify_pathname, include_hash,
              remap_filename, merge_include_chains): New functions.
              (add_import, lookup_import, open_include_file): Removed.
              (INO_T_EQ): Define this (copied from cccp.c).
              (hack_vms_include_specification): Remove all calls and #if 0
              out the definition.  It was being called incorrectly and at
              the wrong times.  Until a VMSie can look at this, it's better
              to not pretend to support it.
              (append_include_chain): Change calling convention; now takes
              only one directory at a time, and sets up the data structure
              itself.
              (redundant_include_p): Rewritten - this is now used for all
              include redundancy, whether by #ifndef, #import, or #pragma
              once.  Looks up things in the include hash table.
              (file_cleanup): Decrement pfile->system_include_depth here if
              it's >0.
              (find_include_file): Calling convention changed; now passes
              around a struct include_hash instead of 3 separate parameters.
              Guts ripped out and replaced with new include_hash mechanism.
              (finclude): Calling convention changed as for
              find_include_file.  Error exits pulled out-of-line.  Reformat.
              (safe_read): Return a long, not an int.
              (deps_output): Don't recurse.
              * cpplib.c (is_system_include): Deleted.
              (path_include): Fix up call to append_include_chain.
              (do_include): Fix up calls to find_include_file and finclude.
              Clean up dependency output a bit.  Shorten obnoxiously lengthy
              #import warning message.  Don't decrement
              pfile->system_include_depth here.
              (do_pragma): Understand the include_hash structure.  Reformat.
              (do_endif): Correct handling of control macros.  Understand
              the include_hash.
              (cpp_start_read): Fix up calls to finclude.  Call
              merge_include_chains.
              (cpp_handle_option): Fix up calls to append_include_chain.
              Understand the four partial include chains.
              (cpp_finish): Add debugging code (#if 0-ed out) for the
              include_hash.
              (cpp_cleanup): Free the include_hash, not the import hash and
              the all_include and dont_repeat lists which no longer exist.
      
      From-SVN: r23857
      Zack Weinberg committed
    • except.c (expand_throw): Use TYPE_PTR_P to check for pointers. · 08b24bda
      	* except.c (expand_throw): Use TYPE_PTR_P to check for pointers.
      	* decl.c (check_tag_decl): Do complain about null friend decl at
      	file scope.
      
      From-SVN: r23856
      Jason Merrill committed
    • toplev.c (no_new_pseudos): Define. · f1db3576
              * toplev.c (no_new_pseudos): Define.
              (rest_of_compilation):  Set no_new_pseudos as needed.
              * emit-rtl.c (gen_reg_rtx): Abort if we try to create a new pseudo
              if no_new_pseudos is set.
              * rtl.h (no_new_pseudos): Declare it.
              * reload1.c (reload): Update comments.
              * md.texi: Corresponding changes.
              * reload1.c (reg_used_in_insn): Renamed from reg_used_by_pseudo.
              (choose_reload_regs): Rename it here as well.  When computing it,
              also merge in used hardregs.
      
      From-SVN: r23855
      Jeff Law committed
    • u77-test.f (main): Avoid testing [f]statb element, which fails on some systems. · 6edfbe4c
      1998-11-25  Dave Love  <d.love@dl.ac.uk>
      	* g77.f-torture/execute/u77-test.f (main): Avoid testing [f]statb
      	element, which fails on some systems.
      	* g77.f-torture/execute/labug1.f: New test.
      
      From-SVN: r23854
      Dave Love committed
    • (main): Avoid testing [f]statb · f270edbc
      element, which fails on some systems.
      
      From-SVN: r23853
      Dave Love committed
    • New test. · afaa51ba
      From-SVN: r23852
      Dave Love committed
    • expr.c (CHECK_PC_IN_RANGE): Add void cast to kill warnings. · 00abfc00
      �
      	* expr.c (CHECK_PC_IN_RANGE):  Add void cast to kill warnings.
      
      From-SVN: r23851
      Per Bothner committed
    • gcc.c: Split out Objective-C specs to... · b12da25e
              * gcc.c: Split out Objective-C specs to...
              * objc/lang-specs.h: here. (New file.) Make the specs cpplib
              aware.
              * c-lex.c (init_parse): Always initialize the filename global.
              * objc/objc-act.c (lang_init): Always call check_newline at
              beginning of file.
      
      From-SVN: r23850
      Zack Weinberg committed