]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
This commit was manufactured by cvs2svn to create branch
authorNo Author <no-author@gcc.gnu.org>
Mon, 3 Nov 1997 02:28:13 +0000 (02:28 +0000)
committerNo Author <no-author@gcc.gnu.org>
Mon, 3 Nov 1997 02:28:13 +0000 (02:28 +0000)
'egcs_1_00_branch'.

From-SVN: r16282

95 files changed:
gcc/auto-config.h [deleted file]
gcc/config/alpha/vms-tramp.asm [deleted file]
gcc/config/float-i128.h [deleted file]
gcc/config/mips/r3900.h [deleted file]
gcc/cp/ChangeLog.1 [deleted file]
gcc/cpp.info [deleted file]
gcc/cpp.info-1 [deleted file]
gcc/cpp.info-2 [deleted file]
gcc/cpp.info-3 [deleted file]
gcc/cstamp-h [deleted file]
gcc/fixinc.wrap [deleted file]
gcc/future.options [deleted file]
gcc/gcc.info [deleted file]
gcc/gcc.info-1 [deleted file]
gcc/gcc.info-10 [deleted file]
gcc/gcc.info-11 [deleted file]
gcc/gcc.info-12 [deleted file]
gcc/gcc.info-13 [deleted file]
gcc/gcc.info-14 [deleted file]
gcc/gcc.info-15 [deleted file]
gcc/gcc.info-16 [deleted file]
gcc/gcc.info-17 [deleted file]
gcc/gcc.info-18 [deleted file]
gcc/gcc.info-19 [deleted file]
gcc/gcc.info-2 [deleted file]
gcc/gcc.info-20 [deleted file]
gcc/gcc.info-21 [deleted file]
gcc/gcc.info-22 [deleted file]
gcc/gcc.info-23 [deleted file]
gcc/gcc.info-24 [deleted file]
gcc/gcc.info-25 [deleted file]
gcc/gcc.info-26 [deleted file]
gcc/gcc.info-27 [deleted file]
gcc/gcc.info-28 [deleted file]
gcc/gcc.info-3 [deleted file]
gcc/gcc.info-4 [deleted file]
gcc/gcc.info-5 [deleted file]
gcc/gcc.info-6 [deleted file]
gcc/gcc.info-7 [deleted file]
gcc/gcc.info-8 [deleted file]
gcc/gcc.info-9 [deleted file]
gcc/intl/cat-compat.c [deleted file]
gcc/intl/intl-compat.c [deleted file]
gcc/intl/linux-msg.sed [deleted file]
gcc/intl/po2tbl.sed.in [deleted file]
gcc/intl/xopen-msg.sed [deleted file]
gcc/prefix.c [deleted file]
libstdc++/stl/algorithm [new file with mode: 0644]
libstdc++/stl/deque [new file with mode: 0644]
libstdc++/stl/functional [new file with mode: 0644]
libstdc++/stl/hash_map [new file with mode: 0644]
libstdc++/stl/hash_set [new file with mode: 0644]
libstdc++/stl/iterator [new file with mode: 0644]
libstdc++/stl/list [new file with mode: 0644]
libstdc++/stl/map [new file with mode: 0644]
libstdc++/stl/memory [new file with mode: 0644]
libstdc++/stl/numeric [new file with mode: 0644]
libstdc++/stl/pthread_alloc [new file with mode: 0644]
libstdc++/stl/queue [new file with mode: 0644]
libstdc++/stl/rope [new file with mode: 0644]
libstdc++/stl/set [new file with mode: 0644]
libstdc++/stl/slist [new file with mode: 0644]
libstdc++/stl/stack [new file with mode: 0644]
libstdc++/stl/stl_algo.h [new file with mode: 0644]
libstdc++/stl/stl_algobase.h [new file with mode: 0644]
libstdc++/stl/stl_alloc.h [new file with mode: 0644]
libstdc++/stl/stl_bvector.h [new file with mode: 0644]
libstdc++/stl/stl_construct.h [new file with mode: 0644]
libstdc++/stl/stl_deque.h [new file with mode: 0644]
libstdc++/stl/stl_function.h [new file with mode: 0644]
libstdc++/stl/stl_hash_fun.h [new file with mode: 0644]
libstdc++/stl/stl_hash_map.h [new file with mode: 0644]
libstdc++/stl/stl_hash_set.h [new file with mode: 0644]
libstdc++/stl/stl_hashtable.h [new file with mode: 0644]
libstdc++/stl/stl_heap.h [new file with mode: 0644]
libstdc++/stl/stl_iterator.h [new file with mode: 0644]
libstdc++/stl/stl_list.h [new file with mode: 0644]
libstdc++/stl/stl_map.h [new file with mode: 0644]
libstdc++/stl/stl_multimap.h [new file with mode: 0644]
libstdc++/stl/stl_multiset.h [new file with mode: 0644]
libstdc++/stl/stl_numeric.h [new file with mode: 0644]
libstdc++/stl/stl_pair.h [new file with mode: 0644]
libstdc++/stl/stl_queue.h [new file with mode: 0644]
libstdc++/stl/stl_raw_storage_iter.h [new file with mode: 0644]
libstdc++/stl/stl_relops.h [new file with mode: 0644]
libstdc++/stl/stl_rope.h [new file with mode: 0644]
libstdc++/stl/stl_set.h [new file with mode: 0644]
libstdc++/stl/stl_slist.h [new file with mode: 0644]
libstdc++/stl/stl_stack.h [new file with mode: 0644]
libstdc++/stl/stl_tempbuf.h [new file with mode: 0644]
libstdc++/stl/stl_tree.h [new file with mode: 0644]
libstdc++/stl/stl_uninitialized.h [new file with mode: 0644]
libstdc++/stl/stl_vector.h [new file with mode: 0644]
libstdc++/stl/utility [new file with mode: 0644]
libstdc++/stl/vector [new file with mode: 0644]

diff --git a/gcc/auto-config.h b/gcc/auto-config.h
deleted file mode 100644 (file)
index 477fdf5..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/* auto-config.h.  Generated automatically by configure.  */
-/* config.in.  Generated automatically from configure.in by autoheader.  */
-/* Whether malloc must be declared even if <stdlib.h> is included.  */
-/* #undef NEED_DECLARATION_MALLOC */
-
-/* Whether realloc must be declared even if <stdlib.h> is included.  */
-/* #undef NEED_DECLARATION_REALLOC */
-
-/* Whether calloc must be declared even if <stdlib.h> is included.  */
-/* #undef NEED_DECLARATION_CALLOC */
-
-/* Whether free must be declared even if <stdlib.h> is included.  */
-/* #undef NEED_DECLARATION_FREE */
-
-/* Define if `sys_siglist' is declared by <signal.h>.  */
-#define SYS_SIGLIST_DECLARED 1
-
-/* Define if you have the strerror function.  */
-#define HAVE_STRERROR 1
-
-/* Define if you have the <inttypes.h> header file.  */
-/* #undef HAVE_INTTYPES_H */
-
-/* Define if you have the <limits.h> header file.  */
-#define HAVE_LIMITS_H 1
-
-/* Define if you have the <stddef.h> header file.  */
-#define HAVE_STDDEF_H 1
-
-/* Define if you have the <stdlib.h> header file.  */
-#define HAVE_STDLIB_H 1
-
-/* Define if you have the <string.h> header file.  */
-#define HAVE_STRING_H 1
-
-/* Define if you have the <strings.h> header file.  */
-#define HAVE_STRINGS_H 1
-
-/* Define if you have the <time.h> header file.  */
-#define HAVE_TIME_H 1
-
-/* Define if you have the <unistd.h> header file.  */
-#define HAVE_UNISTD_H 1
diff --git a/gcc/config/alpha/vms-tramp.asm b/gcc/config/alpha/vms-tramp.asm
deleted file mode 100644 (file)
index fce9ec5..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-;# New Alpha OpenVMS trampoline
-;#
-       .set noreorder
-       .set volatile
-       .set noat
-       .file 1 "tramp.s"
-.text
-       .align 3
-       .globl __tramp
-       .ent __tramp
-__tramp..en:
-
-.link
-       .align 3
-__tramp:
-       .pdesc __tramp..en,null
-.text
-       ldq $1,24($27)
-       ldq $27,16($27)
-       ldq $28,8($27)
-       jmp $31,($28),0
-       .end __tramp
diff --git a/gcc/config/float-i128.h b/gcc/config/float-i128.h
deleted file mode 100644 (file)
index 6a9dd48..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/* float.h for target with IEEE 32, 64 and 128 bit floating point formats */
-#ifndef _FLOAT_H_
-#define _FLOAT_H_
-/* Produced by enquire version 4.3, CWI, Amsterdam */
-
-   /* Radix of exponent representation */
-#undef FLT_RADIX
-#define FLT_RADIX 2
-   /* Number of base-FLT_RADIX digits in the significand of a float */
-#undef FLT_MANT_DIG
-#define FLT_MANT_DIG 24
-   /* Number of decimal digits of precision in a float */
-#undef FLT_DIG
-#define FLT_DIG 6
-   /* Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown */
-#undef FLT_ROUNDS
-#define FLT_ROUNDS 1
-   /* Difference between 1.0 and the minimum float greater than 1.0 */
-#undef FLT_EPSILON
-#define FLT_EPSILON 1.19209290e-07F
-   /* Minimum int x such that FLT_RADIX**(x-1) is a normalised float */
-#undef FLT_MIN_EXP
-#define FLT_MIN_EXP (-125)
-   /* Minimum normalised float */
-#undef FLT_MIN
-#define FLT_MIN 1.17549435e-38F
-   /* Minimum int x such that 10**x is a normalised float */
-#undef FLT_MIN_10_EXP
-#define FLT_MIN_10_EXP (-37)
-   /* Maximum int x such that FLT_RADIX**(x-1) is a representable float */
-#undef FLT_MAX_EXP
-#define FLT_MAX_EXP 128
-   /* Maximum float */
-#undef FLT_MAX
-#define FLT_MAX 3.40282347e+38F
-   /* Maximum int x such that 10**x is a representable float */
-#undef FLT_MAX_10_EXP
-#define FLT_MAX_10_EXP 38
-
-   /* Number of base-FLT_RADIX digits in the significand of a double */
-#undef DBL_MANT_DIG
-#define DBL_MANT_DIG 53
-   /* Number of decimal digits of precision in a double */
-#undef DBL_DIG
-#define DBL_DIG 15
-   /* Difference between 1.0 and the minimum double greater than 1.0 */
-#undef DBL_EPSILON
-#define DBL_EPSILON 2.2204460492503131e-16
-   /* Minimum int x such that FLT_RADIX**(x-1) is a normalised double */
-#undef DBL_MIN_EXP
-#define DBL_MIN_EXP (-1021)
-   /* Minimum normalised double */
-#undef DBL_MIN
-#define DBL_MIN 2.2250738585072014e-308
-   /* Minimum int x such that 10**x is a normalised double */
-#undef DBL_MIN_10_EXP
-#define DBL_MIN_10_EXP (-307)
-   /* Maximum int x such that FLT_RADIX**(x-1) is a representable double */
-#undef DBL_MAX_EXP
-#define DBL_MAX_EXP 1024
-   /* Maximum double */
-#undef DBL_MAX
-#define DBL_MAX 1.7976931348623157e+308
-   /* Maximum int x such that 10**x is a representable double */
-#undef DBL_MAX_10_EXP
-#define DBL_MAX_10_EXP 308
-
-   /* Number of base-FLT_RADIX digits in the significand of a long double */
-#undef LDBL_MANT_DIG
-#define LDBL_MANT_DIG 113
-   /* Number of decimal digits of precision in a long double */
-#undef LDBL_DIG
-#define LDBL_DIG 33
-   /* Difference between 1.0 and the minimum long double greater than 1.0 */
-#undef LDBL_EPSILON
-#define LDBL_EPSILON 1.925929944387235853055977942584927319E-34L
-   /* Minimum int x such that FLT_RADIX**(x-1) is a normalised long double */
-#undef LDBL_MIN_EXP
-#define LDBL_MIN_EXP (-16381)
-   /* Minimum normalised long double */
-#undef LDBL_MIN
-#define LDBL_MIN 3.362103143112093506262677817321752603E-4932L
-   /* Minimum int x such that 10**x is a normalised long double */
-#undef LDBL_MIN_10_EXP
-#define LDBL_MIN_10_EXP (-4931)
-   /* Maximum int x such that FLT_RADIX**(x-1) is a representable long double */
-#undef LDBL_MAX_EXP
-#define LDBL_MAX_EXP 16384
-   /* Maximum long double */
-#undef LDBL_MAX
-#define LDBL_MAX 1.189731495357231765085759326628007016E+4932L
-   /* Maximum int x such that 10**x is a representable long double */
-#undef LDBL_MAX_10_EXP
-#define LDBL_MAX_10_EXP 4932
-
-#endif /*  _FLOAT_H_ */
diff --git a/gcc/config/mips/r3900.h b/gcc/config/mips/r3900.h
deleted file mode 100644 (file)
index c186743..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Definitions of MIPS sub target machine for GNU compiler. 
-   Toshiba r3900.  You should include mips.h after this.
-
-   Copyright (C) 1989, 90-6, 1997 Free Software Foundation, Inc.
-   Contributed by Gavin Koch (gavin@cygnus.com).
-
-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 SUBTARGET_CPP_SPEC "\
-%{!mabi=32: %{!mabi=n32: %{!mabi=64: -D__mips_eabi}}} \
-%{!msingle-float:-D__mips_soft_float} \
-%{mhard-float:%e-mhard-float not supported.} \
-%{msingle-float:%{msoft-float: \
-  %e-msingle-float and -msoft-float can not both be specified.}}"
-
-/* The following is needed because -mips3 and -mips4 set gp64 which in
-   combination with abi=eabi, causes long64 to be set. */
-#define SUBTARGET_CPP_SIZE_SPEC "\
-%{mips3:-D__SIZE_TYPE__=long\\ unsigned\\ int -D__PTRDIFF_TYPE__=long\\ int} \
-%{mips4:-D__SIZE_TYPE__=long\\ unsigned\\ int -D__PTRDIFF_TYPE__=long\\ int} \
-%{!mips3:%{!mips4:%{!m4650:\
-  -D__SIZE_TYPE__=unsigned\\ int -D__PTRDIFF_TYPE__=int}}} "
-
-/* by default (if not mips-something-else) produce code for the r3900 */
-#define SUBTARGET_CC1_SPEC "\
-%{mhard-float:%e-mhard-float not supported.} \
-%{msingle-float:%{msoft-float: \
-  %e-msingle-float and -msoft-float can not both be specified.}}"
-
-#define TARGET_DEFAULT (MASK_SOFT_FLOAT | MASK_MIPS3900)
-#define MIPS_CPU_STRING_DEFAULT "R3900"
-#define MIPS_ISA_DEFAULT 1
-
-#define MULTILIB_DEFAULTS { "EB", "mips1", "msoft-float" }
-
-/* We use the MIPS EABI by default.  */
-#define MIPS_ABI_DEFAULT ABI_EABI
-
-
-/* Debugging */
-
-#define DWARF2_DEBUGGING_INFO
-#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
-
-/* For the 'preferred' cases ("gN" and "ggdbN") we need to tell the 
-   gnu assembler "dwarf-2" */
-   
-#define SUBTARGET_ASM_DEBUGGING_SPEC "\
-%{!mmips-as: \
-  %{g:-gdwarf-2} %{g0:-gdwarf-2} %{g1:-gdwarf-2} %{g2:-gdwarf-2} %{g3:-gdwarf-2} \
-  %{ggdb:-gdwarf-2} %{ggdb0:-gdwarf-2} %{ggdb1:-gdwarf-2} %{ggdb2:-gdwarf-2} %{ggdb3:-gdwarf-2} \
-  %{gdwarf-2*:-gdwarf-2}} \
-%{gstabs:-g} %{gstabs0:-g0} %{gstabs1:-g1} %{gstabs2:-g2} %{gstabs3:-g3} \
-%{gstabs+:-g} %{gstabs+0:-g0} %{gstabs+1:-g1} %{gstabs+2:-g2} %{gstabs+3:-g3} \
-%{gcoff:-g} %{gcoff0:-g0} %{gcoff1:-g1} %{gcoff2:-g2} %{gcoff3:-g3}"
-
diff --git a/gcc/cp/ChangeLog.1 b/gcc/cp/ChangeLog.1
deleted file mode 100644 (file)
index 024a4e6..0000000
+++ /dev/null
@@ -1,9451 +0,0 @@
-Sun Nov 26 14:47:42 1995  Richard Kenner  <kenner@mole.gnu.ai.mit.edu>
-
-       * Version 2.7.2 released.
-
-Mon Nov 20 14:05:00 1995  Mike Stump  <mrs@cygnus.com>
-
-       * g++.c (pfatal_with_name): Add missing third argument to concat.
-
-Thu Oct 26 13:59:54 1995  Mike Stump  <mrs@cygnus.com>
-
-       * init.c (expand_aggr_init): Handle cv qualifiers on the object's
-       type.
-
-Sat Nov 11 08:25:55 1995  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
-
-       * Version 2.7.1 released.
-
-Thu Nov  2 17:02:47 1995  Jason Merrill  <jason@yorick.cygnus.com>
-
-       * call.c (convert_harshness): Handle references to arrays.
-
-Fri Oct 27 14:20:21 1995  Jason Merrill  <jason@yorick.cygnus.com>
-
-       * typeck.c (comp_target_types): Check multi-level pointer
-       conversions in both directions.
-
-Tue Oct 17 21:39:05 1995  Jason Merrill  <jason@yorick.cygnus.com>
-
-       * parse.y (explicit_instantiation): Fix 'extern template' with no
-       return type.
-
-Mon Oct 16 14:35:20 1995  Jason Merrill  <jason@yorick.cygnus.com>
-
-       * parse.y (explicit_instantiation): Support automatic instantiation
-       of constructors.
-       (named_class_head_*): Support out-of-class definition of nested
-       types.
-
-Wed Oct 11 12:20:56 1995  Mike Stump  <mrs@cygnus.com>
-
-       * search.c (envelope_add_decl): New routine.  Fix so that
-       methods are hidden in the same way that other members are.
-       (dfs_pushdecls): Cleanup and move functionality out of line,
-       into envelope_add_decl. 
-
-Tue Oct 10 15:46:01 1995  Mike Stump  <mrs@cygnus.com>
-
-       * typeck.c (mark_addressable): Only call assemble_external if we
-       have started the output file.
-
-Tue Oct 10 11:27:18 1995  Jason Merrill  <jason@yorick.cygnus.com>
-
-       * decl.c (start_function): Fix earlier cv-quals change.
-
-Mon Oct  9 23:53:05 1995  Mike Stump  <mrs@cygnus.com>
-
-       * parse.y (complex_direct_notype_declarator): Only push the class if
-       we are not already in the class.
-
-Mon Oct  9 11:22:03 1995  Doug Evans  <dje@canuck.cygnus.com>
-
-       * decl.c (duplicate_decls): Call merge_machine_decl_attributes.
-       Update olddecl's attributes too.
-       (grokdeclarator): #if 0 out call to build_decl_attribute_variant.
-       * typeck.c (common_type): Call merge_machine_type_attributes.
-
-Fri Oct  6 14:44:27 1995  Mike Stump  <mrs@cygnus.com>
-
-       * typeck.c (mark_addressable): Add missing call to
-       assemble_external.
-
-Wed Oct  4 15:06:39 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (store_parm_decls): Make sure the unwinder start comes
-       before the exception specification start.
-       * except.c (expand_exception_blocks): Make sure the unwinder end
-       comes after the terminate protected catch clause region and after
-       the end of the exception specification region.
-
-Wed Oct  4 12:47:02 1995  Jason Merrill  <jason@yorick.cygnus.com>
-
-       * lex.c (real_yylex): Fix identifier case for linemode.
-       (handle_sysv_pragma): Don't abort when we see a pragma we don't
-       recognize.
-
-Tue Oct  3 14:09:46 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (store_parm_decls): Add a call to start_eh_unwinder.
-       * except.c (init_exception_processing): __throw doesn't take any
-       arguments.
-       (expand_builtin_throw): Likewise.  Always use Pmode, instead of SImode
-       for all pointers.  Use expand_builtin_return_addr to unwind the
-       first level off the stack.
-       (do_unwind): Always use Pmode, instead of SImode for all pointers.
-       (expand_exception_blocks): Add a call to end_eh_unwinder.
-       (start_eh_unwinder, end_eh_unwinder): New routines to build machine
-       independent stack unwinders for function/method calls.
-       
-Mon Oct  2 17:20:42 1995  Mike Stump  <mrs@cygnus.com>
-
-       * tree.c (unsave_expr_now): Make sure we process the argument list
-       of any called functions.  Fixes incorrect code generation for
-       cleanups.
-
-Mon Oct  2 13:04:16 1995  Mike Stump  <mrs@cygnus.com>
-
-       * typeck.c (get_member_function_from_ptrfunc): Save function if it
-       needs it.  Cures core dump on things like (this->*(f()))().
-
-Sat Sep 23 22:51:25 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (start_function): Conform to gcc cv-quals convention (no
-       expression has a cv-qualified type) in RESULT_DECLs.
-       * method.c (make_thunk): Likewise.
-
-Fri Sep 22 10:21:13 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (pushtag): Add in the namespace name for the tag.
-
-Thu Sep 21 13:11:13 1995  Mike Stump  <mrs@cygnus.com>
-
-       * parse.y (maybe_base_class_list, base_class_list, base_class,
-       base_class_access_list): Make sure we see the typenames for base
-       classes.
-       * lex.c (see_typename): Instead of failing to see a typename when
-       there is no next token, perfer a typename, and get the next token.
-
-Wed Sep 20 12:35:27 1995  Michael Meissner  <meissner@cygnus.com>
-
-       * decl.c (init_decl_processing): Add __builtin_expect.
-
-Tue Sep 19 16:48:11 1995  Mike Stump  <mrs@cygnus.com>
-
-       * cvt.c (cp_convert_to_pointer): Don't allow leftover conversions to
-       or from pointer to member functions, they must all be handled before
-       this point.
-
-Fri Sep 15 17:14:47 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * init.c (resolve_offset_ref): Fix wording of non-static member
-       being referenced as a static.
-
-Fri Sep 15 12:39:11 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (build_indirect_ref): Only bash pointer if we actually
-       call build_expr_type_conversion.
-
-Thu Sep 14 18:24:56 1995  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cvt.c (build_expr_type_conversion): Handle conversion from
-       reference.
-       * typeck.c (build_indirect_ref): Avoid infinite recursion.
-
-Thu Sep 14 17:23:28 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (expand_start_early_try_stmts): New routine to start a try
-       block at the start of the function, for function-try-blocks.
-       * cp-tree.h (expand_start_early_try_stmts): Declare it.
-       * parse.y (function_try_block): Use it, instead of doing it here, as
-       we don't want to include rtl.h here, as that conflicts with RETURN
-       in the parser.
-
-Wed Sep 13 18:32:24 1995  Mike Stump  <mrs@cygnus.com>
-
-       * lex.c (reinit_parse_for_block): Support saving inline
-       function-try-blocks, uses peekyylex.
-       * parse.y (eat_saved_input): New rule, permit the parser to see that
-       END_OF_SAVED_INPUT is ok, as it can see this when parsing the
-       handlers of a function-try-block.
-       (fndef): Use it.
-       (component_decl): Make sure TRY and RETURN can come after fn.def2.
-       * spew.c (peekyylex): New routine to peek at what will come next.
-
-Wed Sep 13 16:52:06 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (comptypes): Tighten up comparisons of template type
-       parms.
-
-       * decl.c (duplicate_decls): Turn off whining about virtual functions
-       redeclared inline for now.
-
-Wed Sep 13 11:13:40 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (store_in_parms): New routine to put things before we
-       put base inits.
-       * cp-tree.h (store_in_parms): Declare it.
-       * decl.c (store_parm_decls): Use it to makr sure the starting of the
-       eh spec comes before base inits.
-       (finish_function): Use sequences instead of the obsolete
-       reorder_insns.
-       * parse.y (fndef): Enhance readability and maintainability.  Update
-       to include function_try_block syntax.
-       (function_try_block): Add.
-
-Tue Sep 12 17:43:07 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * call.c (convert_harshness): Use comptypes, not ==, to check if
-       TYPE and PARMTYPE are equivalent on a function type.
-
-Tue Sep 12 17:31:33 1995  Douglas Rupp  <drupp@cs.washington.edu>
-
-       * Make-lang.in (cc1plus) : Removed unnecessary $(exeext).
-
-Mon Sep 11 23:24:07 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_throw): Never allocate storage for thrown pointer
-       to objects.
-
-Mon Sep 11 19:36:45 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_start_catch_block): Pointers to objects come
-       back from catch matching already dereferenced, don't dereference
-       again.
-
-Mon Sep 11 15:46:28 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_throw): Only decay the throw expression, don't do
-       any default conversions.  This is so that one can throw and catch
-       characters, and not have them match integers.
-
-Mon Sep 11 13:46:45 1995  Mike Stump  <mrs@cygnus.com>
-
-       * error.c (dump_aggr_type): Deal with anonymous unions that don't
-       have a TYPE_NAME.
-
-Fri Sep  8 20:40:27 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * lex.c (handle_sysv_pragma): Deal with getting a comma from yylex.
-
-Fri Sep  8 15:51:41 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_end_eh_spec): Handle empty EH specifications.
-
-Fri Sep  8 15:27:22 1995  Mike Stump  <mrs@cygnus.com>
-
-       * cp-tree.h (expand_start_eh_spec): Declare new routine.
-       (expand_end_eh_spec): Likewise.
-       * decl.c (store_parm_decls): Call expand_start_eh_spec to process
-       exception specifications.
-       * except.c (expand_leftover_cleanups): Remove unused parameter.
-       (expand_end_catch_block): Likewise.
-       (expand_exception_blocks): Likewise.
-       (expand_start_eh_spec): New routine to mark the start of an
-       exception specification region.
-       (expand_end_eh_spec): New routine to mark the end of an exception
-       specification region.
-       (expand_exception_blocks): Call expand_end_eh_spec to process
-       exception specifications.
-
-Fri Sep  8 14:40:48 1995  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * lex.c (do_identifier):  Use global binding in preference of
-       dead for local variable.
-
-Wed Sep  6 19:32:59 1995  Mike Stump  <mrs@cygnus.com>
-
-       * cp-tree.h (build_exception_variant): Remove used first argument.
-       * decl.c (duplicate_decls): Likewise.
-       (grokfndecl): Likewise.
-       (revert_static_member_fn): Likewise.
-       * decl2.c (grok_method_quals): Likewise.
-       * tree.c (build_exception_variant): Likewise.
-       * typeck.c (common_type): Likewise.
-       * decl2.c (grokclassfn): After changing the type, call
-       build_exception_variant, if necessary.
-
-Tue Sep  5 15:56:27 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_throw): Run cleanups for the throw expression.
-
-Wed Aug 30 15:24:38 1995  Stephen L. Favor  <sfavor@tigger.intecom.com>
-
-       * except.c (expand_builtin_throw): Moved gen_label_rtx calls beyond
-       the store_parm_decls call which does initialization in the emit_*
-       code concerning label numbering.
-       
-Thu Aug 31 09:01:07 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_internal_throw): Let the frontend be responsible
-       for managing all frontend EH parameters, the backend routine only
-       needs to deal with backend values.  type and value are no longer
-       passed to __throw.
-       (init_exception_processing): Likewise.
-       (expand_start_all_catch): Likewise.
-       (expand_end_all_catch): Likewise.
-       (expand_leftover_cleanups): Likewise.
-       (expand_end_catch_block): Likewise.
-       (expand_builtin_throw): Likewise.
-       (expand_throw): Likewise.
-       
-Tue Aug 29 15:04:36 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * cp-tree.h (DECL_REAL_CONTEXT): Give the real declaration context
-       for a decl.
-       * decl.c (cp_finish_decl): Use it.
-
-Tue Aug 29 10:30:27 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_internal_throw): Oops, almost forgot type and
-       value are now trees.
-
-Mon Aug 28 17:57:45 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       Fix the attribute handling to make sure they get noted before we
-       create the function's RTL, in case they can affect that.
-       * decl.c (grokfndecl): New arg ATTRLIST.  Run
-       cplus_decl_attributes before creating the decl's rtl.
-       (grokdeclarator): New arg ATTRLIST, passed down into grokfndecl.
-       (shadow_tag, groktypename, start_decl, start_method): Pass a
-       NULL_TREE to grokdeclarator's new last arg.
-       * decl2.c (grokfield): New arg ATTRLIST, passed into grokdeclarator.
-       (grokbitfield, grokoptypename): Pass a NULL_TREE to
-       grokdeclarator's new last arg.
-       * except.c (expand_start_catch_block): Likewise.
-       * pt.c (process_template_parm, end_template_decl,
-       do_function_instantiation): Likewise.
-       * cp-tree.h (grokfield): Add arg.
-       (grokdeclarator): Move the prototype from here...
-       * decl.h: ...to here.
-       * lex.c (cons_up_default_function): Pass NULL_TREE to grokfield
-       ATTRLIST argument.
-       * parse.y: Create a list for the grokfield arg where appropriate,
-       and pass it down instead of calling cplus_decl_attributes.
-
-Mon Aug 28 15:07:24 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c: Always allow turning on exception handling.  Allow cross
-       compilations to use EH.
-
-Thu Aug 24 17:39:24 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (saved_pc, saved_throw_type, saved_throw_value): Use
-       trees, instead of rtxs, and don't depend on using special machine
-       dependent registers.
-       (expand_internal_throw): Likewise.
-       (init_exception_processing): Likewise.
-       (expand_start_all_catch): Likewise.
-       (expand_end_all_catch): Likewise.
-       (expand_start_catch_block): Likewise.
-       (expand_leftover_cleanups): Likewise.
-       (expand_end_catch_block): Likewise.
-       (expand_builtin_throw): Likewise.
-       (expand_throw): Likewise.
-
-Wed Aug 23 17:25:51 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * cvt.c (build_expr_type_conversion): Handle conversions to
-       reference types.
-
-Wed Aug 23 15:33:59 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (do_unwind): Work around backend bug with -fpic.
-
-Tue Aug 22 17:20:07 1995  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * decl2.c (flag_new_for_scope):  Add a new mode that follows ANSI
-       for-scoping, but supports (and warns about) old programs.
-       Make the new mode (with value 1) the default.
-       (lang_f_options):  The on-value for flag_new_for_scope is now 2.
-       * cp-tree.h (DECL_DEAD_FOR_LOCAL, DECL_ERROR_REPORTED): New macros
-       (DECL_SHADOWED_FOR_VAR):  Likewise.
-       * decl.c (struct binding_level):  New fields dead_vars_from_for
-       and is_for_scope.
-       (note_level_for_for):  New function.
-       (poplevel):  Special processing if is_for_scope.
-       (pushdecl):  Warn if for-scope variable shadows local.
-       * lex.c (do_identifier):  Handle old (non-ANSI) for scoping,
-       and warn if conflicts.
-       * parse.y (FOR):  Call note_level_for_for.
-
-Mon Aug 21 10:28:31 1995  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl2.c (import_export_inline): Class interface hackery does not
-       apply to synthesized methods.
-
-Sun Aug 20 16:29:00 1995  Mike Stump  <mrs@cygnus.com>
-
-       * search.c (virtual_context): Find the right context more often.
-       Solves a `recoverable compiler error, fixups for virtual function'
-       problem.
-
-Sun Aug 20 13:53:24 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_start_all_catch): Ensure that we always transfer
-       control to the right EH handler, by rethrowing the end label on the
-       region, instead of hoping we are nested and falling through.
-       (expand_leftover_cleanups): Likewise.
-       (end_protect): Since we now rethrow the end label, put a
-       nop after it, so that outer regions are recognized.
-       * init.c (build_vec_delete_1): New routine to handle most of vector
-       deleting, all code moved here from build_vec_delete.
-       (build_array_eh_cleanup): Use build_vec_delete_1 to do all the real
-       work.
-       (expand_vec_init): If the array needs partial destructing, setup an
-       EH region to handle it.
-       (build_vec_delete): Move lots of code to build_vec_delete_1, use
-       build_vec_delete_1 to do the grunt work.
-       
-Sat Aug 19 14:25:33 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       Handle decl attributes properly for function definitions without
-       previous attribute-loaded declarations.
-       * decl.c (start_function): New arg ATTRS.  Add a call to
-       cplus_decl_attributes with it before we create the RTL.
-       * cp-tree.h (start_function): Update prototype.
-       * parse.y (fn.def1): Pass ATTRS into start_function instead of
-       trying to call cplus_decl_attributes too late.  Pass a NULL_TREE
-       for other use.
-       * decl2.c (finish_file): Pass NULL_TREE as fourth arg to
-       start_function.
-       * method.c (synthesize_method): Likewise.
-       * except.c (expand_builtin_throw): Likewise for start on __throw.
-
-Sat Aug 19 13:36:08 1995  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (set_rtti_entry): Turn on -fvtable-thunk -frtti support.
-       This changes -fvtable-thunks vtable layout, so a recompile will be
-       necessary, if you use -fvtable-thunks.
-       (get_vtable_entry): Use n, instead of i to be consistent with the
-       rest of the compiler.
-       (get_vtable_entry_n): Likewise.
-       (add_virtual_function): Add a slot for the tdesc, if -fvtable-thunks
-       are being used.
-       (finish_struct_1): Likewise.
-       (skip_rtti_stuff): New routine to collapse similar code from many
-       different parts of the compiler.  I think I got them all.
-       (modify_one_vtable): Use it.
-       (fixup_vtable_deltas1): Likewise.
-       (override_one_vtable): Likewise.
-       * decl2.c (mark_vtable_entries): Likewise.
-       * tree.c (debug_binfo): Likewise.
-       * search.c (expand_upcast_fixups): Likewise.
-       (get_abstract_virtuals_1): Likewise.  Use virtuals, instead of tmp to
-       consistent with the rest of the compiler.
-       (get_abstract_virtuals): Likewise.
-       * cp-tree.h (skip_rtti_stuff): New routine, declare it.
-       * gc.c (build_headof): Support -fvtable-thunk and -frtti together.
-       (build_typeid): Likewise.
-       (build_classof): Remove old style way of doing rtti.  Remove support
-       for `classof' and `headof'.
-       * gxx.gperf: Likewise.
-       * hash.h: Likewise.
-       * parse.y: Likewise.
-
-Fri Aug 18 17:31:58 1995  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (start_function): Clear ctor_label and dtor_label.
-
-       * class.c (finish_struct_1): Fix handling of access decls.
-
-Tue Aug 15 19:21:54 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * class.c (finish_struct): Only do minimal processing here, so it
-       can be used for class template definitions, as well.
-       (finish_struct_1): New function with the rest of the code.
-
-Tue Aug 15 09:46:16 1995  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (prepare_fresh_vtable): On second though, always build the
-       offset (see Aug 10 change), unless -fvtable-thunks is given.  It
-       does this by calling the new routine set_rtti_entry.
-       (finish_struct): Likewise.
-       (set_rtti_entry): New routine to update the rtti information at the
-       start of the vtable.
-
-Mon Aug 14 12:21:22 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * error.c (dump_decl, case IDENTIFIER_NODE): Only work on a dtor
-       if it's declared in the C++ language spec.
-       (dump_function_decl): Likewise.
-       (dump_function_name): Likewise.
-       (ident_fndecl): Make sure we got something back from lookup_name.
-       * decl.c (start_function): Likewise.
-
-Fri Aug 11 16:52:15 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (build_method_call): Don't call build_new when calling a
-       constructor without an instance.
-
-Thu Aug 10 20:00:17 1995  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (prepare_fresh_vtable): Always build the offset to the
-       complete object, as it doesn't cost much.  This allows dynamic_cast
-       to void * to work when -frtti isn't given.
-       (finish_struct): Likewise.
-
-Thu Aug 10 16:31:28 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (build_eh_type): Split out some functionality to new
-       routine named build_eh_type_type.
-       (build_eh_type_type): New routine.
-       (expand_start_catch_block): Use build_eh_type_type, as we never want
-       the dynamic type of the catch parameter, just the static type.
-       Fixes core dumps when -frtti is used and one catchs pointers to
-       classes.
-
-Thu Aug 10 14:55:29 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_builtin_throw): Since we now use normal calling
-       conventions for __throw, we have to remove the first layer off the
-       stack, so that the next context we search for handlers is the outer
-       context instead of the context that had the call to __throw, if we
-       don't immediately find the desired context.
-
-Tue Aug  8 17:44:23 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * tree.c (cp_expand_decl_cleanup): Returns int, not tree.
-       * cp-tree.h: Update.
-
-       * parse.y (template_type_parm): Add support for `typename'.
-
-Tue Aug  8 12:06:31 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_internal_throw): New internal routine to throw a
-       value.
-       (expand_end_all_catch, expand_leftover_cleanups): All throwers
-       changed to use `expand_internal_throw' instead of jumping to throw
-       label.
-       (expand_end_catch_block, expand_throw): Likewise.
-       (throw_label): Removed.
-       (expand_builtin_throw): Changed so that EH parameters are passed by
-       normal function call conventions.  Completes Aug 4th work.
-
-Fri Aug  4 17:17:08 1995  Mike Stump  <mrs@cygnus.com>
-
-       * cp-tree.h (expand_builtin_throw): Declare it.
-       * decl2.c (finish_file): Call expand_builtin_throw.
-       * except.c (make_first_label): Remove.
-       (init_exception_processing): Don't use a LABEL_REF for throw_label,
-       instead use a SYMBOL_REF, this is so that we don't use LABEL_REFs in
-       other functions that don't really appear in those functions.  This
-       solves a problem where cc1plus consumed exponential amounts of
-       memory when -Wall was used.
-       (expand_end_all_catch, expand_leftover_cleanups,
-       expand_end_catch_block, expand_throw): Change all uses of
-       throw_label to match new style.
-       (do_unwind): Rename parameter to inner_throw_label, as it is now
-       different from throw_label.  Also, assume that our caller will wrap
-       the passed label with a LABEL_REF, if needed.
-       (expand_builtin_throw): Make external, change so that the generated
-       throw is now a real function.
-       (expand_exception_blocks): Never generate throw code inside another
-       function.
-
-Fri Aug  4 12:20:02 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (grokdeclarator): Move checking of mutable const objects
-       and mutable static objects down, as we might decide during parsing
-       to unset staticp or constp (for example, when const is part of the
-       object being pointed to).
-
-Thu Aug  3 17:13:43 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (output_exception_table_entry): Enhance portability to
-       weird machines.
-       (emit_exception_table): Likewise.
-
-Thu Aug  3 16:41:38 1995  Mike Stump  <mrs@cygnus.com>
-
-       * typeck.c (build_ptrmemfunc): Handle casting of pointer to
-       non-virtual member functions.
-
-Wed Aug  2 11:58:25 1995  Mike Stump  <mrs@cygnus.com>
-
-       * gc.c (build_typeid): Strip cv qualifiers so that const T&, T&, T
-       and const T all match.
-
-Wed Aug  2 11:25:33 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (build_eh_type): Strip cv qualifiers so that const T&,
-       T&, T and const T all match.
-
-Tue Aug  1 14:20:16 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c: Fix up comments, cleanup code and eliminate exceptNode,
-       exceptStack, exceptstack, push_except_stmts, pop_except_stmts,
-       new_except_stack, push_last_insn, pop_last_insn, insn_save_node and
-       InsnSave.  Also, numerous speed improvements, and correctness
-       improvements.  Double faulting in all situations should now be
-       handled correctly.
-       (expand_start_all_catch): Instead of having many terminate protected
-       regions, just have one.
-       (expand_start_catch_block): No longer have to protect
-       false_label_rtx, as it isn't used for EH region marking.
-       (expand_end_catch_block): Expand out EH cleanups here by using
-       expand_leftover_cleanups.
-       (expand_end_all_catch): Use sequences instead of playing with insn
-       links directly.
-       (expand_exception_blocks): Likewise.  Also protect all catch clauses
-       with one terminate region.
-
-Mon Jul 31 13:24:30 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * method.c (report_type_mismatch): Don't talk about an object
-       parameter for non-methods.
-
-Sun Jul 30 13:13:02 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * class.c (finish_struct): Catch private and protected members of
-       anonymous unions here.
-       * decl2.c (finish_anon_union): And here.
-       * parse.y: Instead of here.
-
-       * errfn.c (ARGSLIST): Support passing four args.
-       * error.c (cv_as_string): New function.
-       (cp_printers): Add it.
-       * call.c (build_method_call): Report 'const' at end of pseudo-decl.
-
-       * method.c (report_type_mismatch): Deal with a bad_arg of 0.
-
-       * init.c (expand_aggr_init): Handle volatile objects, too.
-
-Sat Jul 29 13:42:03 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (struct binding_level): Keep list of incomplete decls.
-       (print_binding_level): Use list_length to count them.
-       (pushdecl): Build up the list.
-       (hack_incomplete_structures): Walk it and prune completed decls.
-
-Fri Jul 28 15:26:44 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (comp_target_types): Don't check const and volatile for
-       function types.
-       (comp_ptr_ttypes_real): Likewise.
-
-Thu Jul 27 15:40:48 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (comp_target_types): Fix.
-
-Thu Jul 27 15:10:48 1995  Mike Stump  <mrs@cygnus.com>
-
-       * cp-tree.h (unsave_expr_now, build_unsave_expr,
-       cp_expand_decl_cleanup): Declare new routines.
-       * decl.c (cp_finish_decl, store_parm_decls,
-       hack_incomplete_structures): Change all cals from
-       expand_decl_cleanup to cp_expand_decl_cleanup.
-       * gc.c (protect_value_from_gc): Likewise.
-       * expr.c (cplus_expand_expr): Handle UNSAVE_EXPRs.
-       * tree.c (unsave_expr): New routine to build an UNSAVE_EXPR.
-       (unsave_expr_now): Backend routine used by tree expander.
-       (cp_expand_decl_cleanup): Wrap second argument in an UNSAVE_EXPR to
-       work around a limitation in the backend.  The backend uses the
-       cleanups multiple times, on disjoint control flows, so we cannot
-       pass unsaved SAVE_EXPRs to the backend.
-       * tree.def (UNSAVE_EXPR): New tree code.
-       * typeck.c (c_expand_return): Move goto/return code up inside
-       conditional, as we don't always want to do this, we only want to do
-       this when we don't otherwise finish with this control flow.
-
-Thu Jul 27 10:38:43 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * parse.y (typespec): Only complain about typeof if we're not
-       getting it from a system header.
-
-Thu Jul 27 10:26:23 1995  Doug Evans  <dje@canuck.cygnus.com>
-
-       Clean up prefix attribute handling.
-       * parse.y (reserved_declspecs): Link prefix attributes with declspecs.
-       (declmods): Likewise.
-       (all rules that reference typed_declspecs and declmods): Call
-       split_specs_attrs or strip_attrs to separate declspecs and attrs.
-       (lang_extdef): Delete resetting of prefix_attributes.
-       (template_def, notype_declarator rule): Use NULL_TREE for
-       prefix_attributes.
-       (condition): Use NULL_TREE for prefix_attributes.
-       (setattrs): Deleted.
-       (nomods_initdcl0): Set prefix_attributes to NULL_TREE.
-       (component_decl): Delete resetting of prefix_attributes.
-       (component_decl_1, notype_components rule): Use NULL_TREE for
-       prefix_attributes.
-       (simple_stmt): Delete resetting of prefix_attributes.
-
-Mon Jul 24 13:37:53 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (convert_harshness): Deal with reference conversions before
-       others.  Actually do array->pointer decay.  Call comp_target_types
-       with pointer types rather than their targets.
-
-       * typeck.c (comp_target_types): Avoid assigning D const * to B *.
-
-Mon Jul 24 08:54:46 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * pt.c (to_be_restored): Move decl to global scope.
-
-Sat Jul 22 12:22:11 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (start_decl): Put back clearing of DECL_IN_AGGR_P.
-
-Fri Jul 21 17:09:02 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (grokdeclarator): Downgrade error about 'extern int A::i'
-       to pedwarn.
-
-       * pt.c (instantiate_template): Also avoid instantiation if the
-       function has already been declared to be a specialization.
-
-       * decl2.c (check_classfn): Ignore cname argument, and return the
-       matching function.
-
-       * decl.c (start_decl): Handle declarations of member functions
-       outside of the class (i.e. specialization declarations).
-
-Thu Jul 20 10:34:48 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * class.c (finish_struct): Don't mess with the type of bitfields.
-
-       * various.c: s/TYPE_POINTER_TO/build_pointer_type/.
-
-Thu Jul 20 01:43:10 1995  Mike Stump  <mrs@cygnus.com>
-
-       * init.c (expand_aggr_init): Assume LOOKUP_ONLYCONVERTING if init
-       is not a parameter list (TREE_LIST).
-       (expand_default_init): If LOOKUP_ONLYCONVERTING is set, then set
-       LOOKUP_NO_CONVERSION so that we don't allow two-level conversions,
-       but don't set it otherwise.
-
-Wed Jul 19 20:32:01 1995  Mike Stump  <mrs@cygnus.com>
-
-       * init.c (expand_default_init): Don't allow two-level conversions
-       during construction.
-
-Wed Jul 19 18:06:37 1995  Mike Stump  <mrs@cygnus.com>
-
-       * gc.c (build_headof): The type of dyncasting to a pointer to cv
-       void, should be pointer to cv void.
-
-Wed Jul 19 17:25:43 1995  Mike Stump  <mrs@cygnus.com>
-
-       * gc.c (build_dynamic_cast): Allow casting in const.
-
-Wed Jul 19 16:34:27 1995  Mike Stump  <mrs@cygnus.com>
-
-       * typeck.c (build_const_cast): If we are passed error_mark_node,
-       return it.
-
-Wed Jul 19 15:24:48 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * class.c (push_nested_class): Make sure TYPE is non-nil.
-
-       * cvt.c (type_promotes_to): Watch for error_mark_node on the
-       incoming TYPE.
-
-Wed Jul 19 13:23:12 1995  Gerald Baumgartner  <gb@alexander.cs.purdue.edu>
-
-       * cp-tree.h (SIGTABLE_VT_OFF_NAME): Renamed from SIGTABLE_OFFSET_NAME.
-       (SIGTABLE_VB_OFF_NAME): New macro.
-       (vt_off_identifier): Renamed from offset_identifier.
-       (vb_off_identifier): Added extern declaration.
-
-       * decl.c (vt_off_identifier): Renamed from offset identifier.
-       (vb_off_identifier): New variable to hold the identifier for the
-       sigtable field vb_off.
-       (init_decl_processing): Initialize vb_off_identifier.
-       Renamed vt_off_identifier from offset_identifier.
-       * sig.c (build_signature_method_call): Renamed offset_identifier and
-       local variable offset to vt_off_identifer and vt_off, respecitively.
-       * sig.c (build_signature_table_constructor): Renamed offset to vt_off.
-
-       * decl.c (init_decl_processing): Add vb_off field to
-       sigtable_entry_type.  Reorder fields so that pfn gets properly
-       aligned at a 64 bit boundary on the Alpha.
-       * sig.c (build_signature_table_constructor): Build the constructor
-       according to the new layout.  Set the vb_off field to -1 for now.
-
-       * decl.c (init_decl_processing): Align sigtable_entry_type on word
-       boundaries instead of double word boundaries to save space.
-
-Tue Jul 18 16:58:37 1995  Mike Stump  <mrs@cygnus.com>
-
-       * cvt.c (cp_convert): Always call build_cplus_new for a ctor.
-
-Tue Jul 18 14:24:53 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * parse.y (opt.component_decl_list): Only forbid private/protected
-       in anonymous unions.  We need to make this know when the type is
-       defined for an object, to not give the error.
-
-Mon Jul 17 14:22:44 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * parse.y (opt.component_decl_list): Don't allow access control
-       as private or protected for union members.
-
-Sun Jul 16 14:01:00 1995  Jim Wilson  <wilson@chestnut.cygnus.com>
-
-       * lex.c (check_newline): For 'p' case, move goto skipline line to
-       before end brace for 'pragma'.
-
-Fri Jul  7 13:55:58 1995  Mike Stump  <mrs@cygnus.com>
-
-       * g++.1: Tiny updates.
-
-Fri Jul  7 13:05:20 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (cp_finish_decl): Only destruct local static variables if
-       they are constructed, and only construct the first time control
-       passes completely through its declaration (if not initialized with a
-       constant-expression).
-       (expand_static_init): Likewise.
-
-Wed Jul  5 14:05:04 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * typeck.c (comptypes, case OFFSET_REF): If either offset basetype
-       is a TEMPLATE_TYPE_PARM, give a match.
-
-Fri Jun 30 15:42:57 1995  Mike Stump  <mrs@cygnus.com>
-
-       * method.c (build_overload_value): Handle encoding of null pointer
-       constants (or any pointer with a constant numeric value) for
-       templates.
-
-Fri Jun 30 13:45:51 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * call.c (convert_harshness): Add QUAL_CODE when we're faced with
-       const vs non-const for void conversions.
-
-Fri Jun 30 10:19:52 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_start_all_catch): Fix problem with finding an
-       outer nested try block when there is no code to separate it from an
-       inner try block.
-
-Fri Jun 30 02:22:26 1995  Mike Stump  <mrs@cygnus.com>
-
-       * search.c (dfs_pushdecls): Consume 2 or 3 orders of magnitude less
-       memory please when virtual bases are used.
-
-Thu Jun 29 19:03:47 1995  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (build_vbase_path): Avoid testing things that cannot be
-       null to see if they are null.
-       * cvt.c (convert_pointer_to_vbase): Remove code that doesn't work.
-       * decl.c (finish_function): Pass a type into the new
-       convert_pointer_to_vbase instead of a binfo.
-       * search.c (convert_pointer_to_vbase): Rewritten to use get_vbase
-       and convert_pointer_to_real.
-       (expand_indirect_vtbls_init): Use convert_pointer_to_vbase instead
-       of the more cryptic call to get_vbase.
-
-Thu Jun 29 09:35:05 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (BOOL_TYPE_SIZE): Fix broken SLOW_BYTE_ACCESS check.
-
-Thu Jun 29 03:43:55 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * pt.c (instantiate_template): Don't strip 'this' twice.
-
-       * pt.c (coerce_template_parms): Allow null pointer constants.
-
-       * decl.c (revert_static_member_fn): But only if DECL_ARGUMENTS is
-       set.
-
-Wed Jun 28 18:39:03 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (revert_static_member_fn): Also remove 'this' from
-       DECL_ARGUMENTS.
-       * decl2.c (check_classfn): Don't revert this function until we get a
-       match.
-
-Wed Jun 28 14:07:27 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * parse.y (component_decl): Clear PREFIX_ATTRIBUTES here.
-
-Wed Jun 28 11:05:13 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl2.c (finish_file): Handle global vector news.
-       * init.c (build_new): Encode vector news so that later we will know
-       how many elements there are.
-
-Mon Jun 26 13:38:06 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * expr.c (cplus_expand_expr): Don't mess with temp slots.
-
-       * decl2.c (warn_if_unknown_interface): Don't crash if tinst_for_decl
-       returns null.
-
-       * decl2.c (check_classfn): Use revert_static_member_fn.
-       * decl.c (revert_static_member_fn): Diagnose static member functions
-       declared const or volatile.
-
-       * decl2.c (grokfield): Check for missing default args here, too.
-       (check_default_args): Function to do the checking.
-       * decl.c (pushdecl): Use it.
-
-       * decl.c (pushdecl): Don't warn about shadowing a member of `this'
-       if there is no `this'.
-
-Sun Jun 25 11:34:25 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (build_method_call): Downgrade 'called before definition'
-       to a warning, as it ought to go away after Monterey.
-
-Sat Jun 24 14:18:42 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * pt.c (coerce_template_parms): Don't do extra checking on pointer
-       to member arguments.
-
-       * class.c (finish_struct): const and reference members don't prevent
-       a class from being an aggregate.
-
-       * class.c (finish_struct): Signatures are always aggregates.
-
-Fri Jun 23 17:20:29 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl2.c (check_classfn): Improve error message.
-
-       * pt.c (tsubst): Handle PROMOTE_PROTOTYPES.
-
-Thu Jun 22 01:50:42 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (comptypes): Don't ignore method quals.
-
-       * class.c (finish_struct): Non-abstract virtuals are always USED.
-
-       * decl.c (build_ptrmemfunc_type): The underlying union type isn't
-       IS_AGGR_TYPE, either.
-       * class.c (finish_struct): Use CLASSTYPE_NON_AGGREGATE instead.
-       * cp-tree.h: Likewise.
-
-       * cp-tree.h (lang_type): Add aggregate.
-       (CLASSTYPE_AGGREGATE): New macro.
-       (TYPE_NON_AGGREGATE_CLASS): Likewise.
-       * class.c (finish_struct): Determine whether a class is an
-       aggregate.
-       * decl.c (cp_finish_decl): Check TYPE_NON_AGGREGATE_CLASS instead of
-       TYPE_NEEDS_CONSTRUCTING.
-       * typeck2.c (digest_init): Check TYPE_NON_AGGREGATE_CLASS for
-       subobjects, too.
-
-       * pt.c (tsubst, PARM_TYPE): Propagate DECL_ARTIFICIAL.
-
-       * decl.c (start_function): For pre-parsed functions, layout all of
-       the parm decls again.
-       (grokvardecl): TREE_PUBLIC depends on DECL_THIS_EXTERN, not
-       DECL_EXTERNAL.
-
-       * pt.c (coerce_template_parms): Improve checking for invalid
-       template parms.
-
-Wed Jun 21 12:01:16 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl.c (grokdeclarator): Forbid declaration of a static member
-       with the same name as its enclosing class.
-
-Mon Jun 19 10:28:14 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (finish_function): Clear current_class_decl.
-
-       * typeck.c (build_conditional_expr): Use convert (boolean_type_node
-       instead of truthvalue_conversion.
-
-       * class.c (finish_struct): A data member with the same name as the
-       class doesn't suppress constructors.
-
-Fri Jun 16 18:11:39 1995  Gerald Baumgartner  <gb@alexander.cs.purdue.edu>
-
-       * decl.c (start_function): If current_class_decl is a signature
-       pointer, don't dereference it but set C_C_D to current_class_decl.
-
-Fri Jun 16 17:06:28 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (duplicate_decls): Complain about virtual functions
-       redeclared to be inline.
-
-Fri Jun 16 13:20:38 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (get_unique_name): New routine to name unnamed namespaces.
-       (push_namespace): Use get_unique_name for naming unnamed namespaces.
-
-Thu Jun 15 15:00:41 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * parse.y: Call cplus_decl_attributes with prefix_attributes where
-       appropriate.
-
-Wed Jun 14 19:24:49 1995  Mike Stump  <mrs@cygnus.com>
-
-       * search.c (get_vbase): New routine to switch hierarchies from the
-       CLASSTYPE_VBASECLASSES to the normal one.
-       (expand_indirect_vtbls_init): Use get_vbase to figure out how we
-       want to convert to a vbase pointer.
-
-Mon Jun 12 17:50:30 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * pt.c (instantiate_class_template): Add the new instantiation to
-       template_classes.
-       (do_pending_expansions): Call instantiate_member_templates on all of
-       the classes in template_classes.
-
-Mon Jun 12 12:36:59 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (complete_array_type): Fill in the TYPE_DOMAIN of our
-       TYPE_MAIN_VARIANT if it is not filled in.
-       * init.c (build_delete): If the TYPE_DOMAIN is not set, give an
-       error instead of core dumping.
-
-Mon Jun 12 10:41:40 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (can_convert): Also check for distance > 0.
-       (can_convert_arg): Likewise.
-       (user_harshness): Likewise.
-
-Fri Jun  9 19:17:21 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * g++.c (MATH_LIBRARY): Provide default.
-       (main): Always link with the math library if we link with libstdc++.
-
-       * decl.c (start_function): Complain about redefinition of a function
-       even when the pending_inline version is compiled after the other
-       version.
-
-Thu Jun  8 15:44:38 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * gc.c (build_dynamic_cast): Build up a reference to a parameter of
-       aggregate type.
-
-Wed Jun  7 15:31:57 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * init.c (build_vec_delete): Resolve an offset ref before we try to
-       use it.
-
-Wed Jun  7 14:19:32 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (build_modify_expr): If the class lacks a constructor or
-       assignment operator, return error_mark_node.
-       (common_type): Use build_cplus_array_type.
-
-Tue Jun  6 09:41:27 1995  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (dont_allow_type_definitions): New variable set when types
-       cannot be defined.
-       (finish_struct): Use it.
-       * cp-tree.h (dont_allow_type_definitions): Define it.
-       * parse.y (primary, handler_seq): Set it.
-
-Mon Jun  5 18:49:38 1995  Mike Stump  <mrs@cygnus.com>
-
-       * method.c (build_opfncall): Use DECL_CHAIN, not TREE_CHAIN for
-       results from lookup_fnfields.  Always give warning/error on bad
-       code.
-
-Mon Jun  5 11:39:37 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * init.c (member_init_ok_or_else): Don't allow initialization of
-       an ancestor's member from within a constructor.
-
-Mon Jun  5 11:20:34 1995  Gerald Baumgartner  <gb@alexander.cs.purdue.edu>
-
-       * sig.c (build_signature_table_constructor): Use DECL_CONTEXT
-       instead of DECL_CLASS_CONTEXT for calculating the vfield offset so
-       abstract virtual functions are handled correctly.
-
-       * sig.c (build_signature_table_constructor): Store the correct
-       delta in signature table entries.  It does not yet work for
-       classes with virtual base classes as implementations of signatures.
-       (build_signature_method_call): Add the delta to the object_ptr
-       before generating the function call.
-
-       * call.c (build_method_call): Make instance_ptr the signature
-       pointer itself instead of dereferencing the optr.
-       * sig.c (build_signature_method_call): Dereference the optr for the
-       direct and virtual calls.
-
-       * sig.c (build_signature_table_constructor): Make the tag for
-       default implementations -1 instead of 2.
-       (build_signature_method_call): Change the generated conditional
-       expression correspondingly.
-
-       * sig.c (build_signature_pointer_constructor): Deleted the sorry
-       message that said we can't handle multiple inheritance for
-       implementations of signatures
-       (build_signature_method_call): Use the offset from the sigtable
-       entry instead of the vptr field from the signature pointer for
-       building a virtual function call.
-
-       * class.c (build_vfn_ref): Deleted signature specific code, we don't
-       call this function anymore from build_signature_method_call.
-
-       * cp-tree.h (SIGNATURE_VPTR_NAME): Deleted.  We use the right vptr
-       field in the object now instead of in the signature pointer/ref. 
-       (build_vptr_ref): Deleted extern declaration.
-       * sig.c (build_vptr_ref): Deleted.
-       (build_signature_pointer_or_reference_type): Deleted construction of
-       the vptr field.
-       (build_signature_pointer_constructor): Deleted initialization of/
-       assignment to the vptr field.
-
-       * sig.c (build_signature_table_constructor): Convert the signature
-       table entry fields to their correct types.
-
-       * sig.c (build_signature_table_constructor): Don't call digest_init
-       for the fields of a sigtable entry, it's wasted time.
-
-       * sig.c (build_signature_table_constructor): Correctly set the
-       offset and index fields of a sigtable entry.  Build the constructor
-       the way digest_init does, digest_init can't handle initializing an
-       anonymous union inside a struct.
-       (build_signature_method_call): Use the index field instead of the
-       delta field to get the vtable index.
-
-       * decl.c (init_decl_processing): Fix number of fields for building
-       sigtable_entry_type.
-
-       * cp-tree.h (tag_identifier, offset_identifier): Added extern decls.
-       (SIGTABLE_CODE_NAME): Renamed to SIGTABLE_TAG_NAME.
-       (SIGTABLE_PFN_NAME): Deleted, we'll use VTABLE_PFN_NAME instead.
-       * decl.c (tag_identifier, offset_identifier): New variables to
-       hold the identifiers for the sigtable fields tag and offset.
-       (init_decl_processing): Initialize these variables.
-       (init_decl_processing): Use these variables to build the
-       sigtable_entry_type structure.  Rename the code and offset fields
-       to tag and delta, respectively; add offset and index fields. Changed
-       types of fields from short_integer_type_node to delta_type_node.
-       * sig.c (build_signature_table_constructor): Rename code and offset
-       to tag and delta, respectively.
-       (build_signature_method_call): Likewise.  Use above variables.
-
-Thu Jun  1 17:03:51 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (lookup_name_real): Don't try to look anything up in an
-       erroneous object.
-
-Fri Jun  2 10:30:14 1995  Mike Stump  <mrs@cygnus.com>
-
-       * method.c (build_overload_int): New routine.  Break out
-       functionality from build_overload_value so we can reuse it.
-       (build_overload_value): Handle pointer to member functions as value
-       parameters for templates.
-       (build_overload_identifier): Since template parameters are shared
-       among all instantiations, we have to substitute in the real types
-       in TREE_TYPE (parm).
-       pt.c (coerce_template_parms): Likewise.
-       (push_template_decls): Likewise.
-       (grok_template_type): Deleted as template parameters are shared
-       among all instantiations.
-
-Wed May 31 19:10:32 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (grokdeclarator): Always give errors on constant overflow
-       for array indices.
-
-Wed May 31 11:39:43 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (commonparms): Don't abort if simple_cst_equal returns < 0.
-       (build_c_cast): Don't tack on a NON_LVALUE_EXPR when casting to
-       reference type.
-       (build_indirect_ref): Fix check for *&.
-
-Fri Jun 16 06:54:03 1995  Mike Stump  <mrs@cygnus.com>
-
-       * Version 2.7.0 released.
-
-Fri Jun 16 15:07:29 1995  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
-
-       * Make-lang.in (DEMANGLER_PROG): Add LIBS.
-
-Thu Jun 15 15:00:41 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (define_function): Don't set DECL_INTERFACE_KNOWN.
-
-Wed Jun  7 20:00:31 1995  Mike Stump  <mrs@cygnus.com>
-
-       * *.[chy]: Change all callers of finish_decl to cp_finish_decl.
-       * decl.c (finish_decl): New routine to handle call backs from the
-       mid end (declare_hidden_char_array).
-
-Wed Jun  7 19:02:50 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (start_function): Handle setting C_C_D here.
-       (set_C_C_D): Removed.
-       (struct saved_scope): Remove class_decl.
-       (push_to_top_level): Don't save current_class_decl.
-       (pop_from_top_level): Don't restore current_class_decl or C_C_D.
-       (struct cp_function): Add C_C_D.
-       (push_cp_function_context): Save C_C_D.
-       (pop_cp_function_context): Restore C_C_D.
-
-Fri Jun  2 11:05:58 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (set_C_C_D): New function.  suspend_momentary before
-       building C_C_D.
-       (pop_from_top_level): Call it.
-       (start_function): Likewise.
-       (pop_cp_function_context): Likewise.
-
-       * class.c, cp-tree.h, decl.c, decl2.c, parse.y: Lose all references
-       to current_vtable_decl, CLASSTYPE_INST_VAR and CLASSTYPE_VTBL_PTR.
-
-       * decl.c (push_cp_function_context): Save current_class_decl.
-       (pop_cp_function_context): Restore current_class_decl and set C_C_D.
-       (pop_from_top_level): Don't use CLASSTYPE_INST_VAR to set C_C_D.
-       (start_function): Likewise.
-
-       * class.c (popclass): Don't mess with current_class_decl,
-       current_vtable_decl, or C_C_D.
-
-Mon May 29 12:45:10 1995  Paul Eggert  <eggert@twinsun.com>
-
-       * Make-lang.in (c++.mostlyclean): Remove $(DEMANGLER_PROG).
-
-Wed May 24 15:55:18 1995  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
-
-       * decl.c (duplicate_decls): Check simple_cst_equal result against 0.
-       * decl2.c (finish_anon_union): Likewise.
-       * method.c (largest_union_member): Likewise.
-
-Wed May 24 14:41:11 1995  H.J. Lu  <hjl@nynexst.com>
-
-       * Make-lang.in (cxxmain.o): Replace single quotes with backslashes.
-
-Mon May 22 17:38:48 1995  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
-
-       * Make-lang.in (g++, g++-cross, cc1plus, DEMANGLER_PROG):
-       Use $@ instead of output name so works even if have .exe.
-       (cxxmain.o): Use cp if ln -s fails.
-       (c++.install-man): Use $(exeext) in executable names.
-       (c++.mostlyclean, stage[1-4]): Use $(objext) in object file names.
-       * Makefile.in (../cc1plus): Use $(exeext) in name of executable.
-
-Wed May 24 01:39:03 1995  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * call.c (build_method_call): parms can be null, duh.
-
-Tue May 23 01:32:09 1995  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * call.c (build_method_call): If convert_arguments failed, just bail.
-
-Fri May 19 10:31:11 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * cvt.c (convert_force): Pass LOOKUP_NORMAL to cp_convert.
-
-       * tree.c (copy_to_permanent): Oops.
-
-Fri May 19 10:01:07 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * cp-tree.h (break_out_target_exprs): Add decl.
-
-Thu May 18 13:02:30 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (start_function): Move *all* interface handling stuff after
-       the pushdecl.
-
-       * tree.c (mapcar): Renamed from make_deep_copy and generalized.
-       (perm_manip): Return t if permanent, otherwise 0.
-       (copy_to_permanent): Use them.
-       (bot_manip): Helper for break_out_target_exprs.
-       (break_out_target_exprs): New function.  Uses mapcar.
-
-       * typeck.c (convert_arguments): Use it.
-
-       * method.c (hack_identifier): Use convert_from_reference to
-       dereference a reference.
-
-Wed May 17 17:54:54 1995  Mike Stump  <mrs@cygnus.com>
-
-       * call.c (convert_harshness): Move reference bashing before pointer
-       to member bashing.
-
-Wed May 17 16:57:53 1995  Mike Stump  <mrs@cygnus.com>
-
-       * cvt.c (convert_to_reference): Only complain, if complaints are
-       wanted.
-       * typeck.c (build_function_call_real): Likewise.  If
-       LOOKUP_SPECULATIVELY is set and something won't work, return
-       NULL_TREE.
-       * cvt.c (cp_convert): Likewise.  Pass flags down to build_method_call.
-       (convert): Pass LOOKUP_NORMAL to cp_convert.
-       * typeck.c (convert_for_assignment): Likewise.
-       (convert_force): Pass LOOKUP_COMPLAIN to cp_convert.
-       (convert_arguments): Get out early if we get an error_mark_node.
-       (convert_for_initialization): Use cp_convert instead of convert so
-       that we can pass flags down.
-       * cp-tree.h (LOOKUP_SPECULATIVELY): Added documentation.
-
-Wed May 17 01:43:58 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck2.c (store_init_value): Don't take the MAIN_VARIANT of the
-       decl type.
-
-       * class.c (finish_struct): Don't complain about a class with no
-       user-defined constructors but with a member that has no default
-       constructor, as this is OK for aggregates.
-
-       * expr.c (cplus_expand_expr, NEW_EXPR): If this is an explicit
-       constructor call, mark slot addressable.
-
-Tue May 16 18:37:51 1995  Douglas Rupp  <drupp@cs.washington.edu>
-
-       * g++.c: Changed WINNT to _WIN32.
-
-Tue May 16 12:40:16 1995  Jason Merrill  <jason@lisa.cygnus.com>
-
-       * lex.c (handle_sysv_pragma): Don't use token_buffer.
-
-Tue May 16 12:05:26 1995  Mike Stump  <mrs@cygnus.com>
-
-       * call.c (resolve_scope_to_name): Add initial semantic support for
-       namespaces.
-       * class.c (finish_struct): Likewise.
-       * cp-tree.h (NAMESPACE_LEVEL): Likewise.
-       * cvt.c (build_up_reference, convert_to_reference): Likewise. 
-       * decl.c (binding_level::namespace_p, suspend_binding_level): Likewise.
-       (resume_binding_level, toplevel_bindings_p): Likewise
-       (namespace_bindings_p, declare_namespace_level): Likewise.
-       (resume_level, push_namespace, pop_namespace): Likewise.
-       (pop_everything, pushtag, duplicate_decls, pushdecl): Likewise.
-       (implicitly_declare, lookup_namespace_name): Likewise.
-       (lookup_name_real, start_decl, make_temporary_for_reference): Likewise.
-       (obscure_complex_init, finish_decl, expand_static_init): Likewise.
-       (grokvardecl, grokdeclarator, parmlist_is_exprlist): Likewise.
-       (store_parm_decls, hack_incomplete_structures): Likewise.
-       * decl2.c (get_temp_name, finish_anon_union): Likewise.
-       (current_namespace, push_namespace, pop_namespace): Likewise.
-       (do_namespace_alias, do_toplevel_using_decl): Likewise.
-       (do_class_using_decl): Likewise.
-       * error.c (dump_decl): Likewise.
-       * init.c (build_member_call, build_offset_ref): Likewise.
-       * lex.c (identifier_type): Likewise.
-       * parse.y (lang_extdef, using_decl, extdef): Likewise.
-       (component_decl_1, nested_name_specifier_1): Likewise.
-       * spew.c (yylex): Likewise.
-       * tree.def (NAMESPACE_DECL): Likewise.
-
-Tue May 16 11:55:35 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (push_overloaded_decl): Return the new decl even if it
-       can't be pushed.
-
-Tue May 16 11:00:37 1995  Jason Merrill  <jason@lisa.cygnus.com>
-
-       * typeck.c (decay_conversion): Split out from default_conversion.
-       (default_conversion): Call it.
-       (build_binary_op): Likewise.
-       (build_binary_op_nodefault): Use decay_conversion for truth ops.
-
-Mon May 15 12:47:56 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (warn_extern_redeclared_static): This is a pedwarn.
-       (duplicate_decls): Always use the old decl's linkage info.  Don't
-       play with linkage of consts.
-       (pushdecl): Don't play with linkage of consts.
-       (redeclaration_error_message): Don't complain about an old public
-       decl and a new non-public decl here.
-       (grokvardecl): Handle linkage of consts here.
-       (grokdeclarator): An 'extern inline' is public.  Pass constp to
-       grokvardecl.
-       (start_function): Wait until after the pushdecl to do some linkage
-       stuff.
-
-       * decl2.c (import_export_vtable): Make duplicates weak rather than
-       static if supported.
-       (import_export_inline): Likewise.
-       * pt.c (do_pending_expansions): Likewise.
-
-       * class.c (build_vbase_path): flag_assume_nonnull_objects only
-       affects reference conversion.
-
-       * init.c (emit_base_init): Build up an RTL_EXPR and add it to
-       rtl_expr_chain.
-       * decl.c, decl2.c: s/base_init_insns/base_init_expr/.
-
-Tue May 16 07:06:28 1995  Paul Eggert  <eggert@twinsun.com>
-
-       * method.c (numeric_output_need_bar): Renamed from misspelling.
-
-       * typeck.c (build_ptrmemfunc): Fix misspellings in messages.
-
-Sun May 14 10:26:22 1995  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
-
-       * lang-options.h, lang-specs.h: New files.
-
-Thu May 11 00:31:48 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (default_conversion): Don't check for BLKmode before
-       pulling out the decl_constant_value.
-
-       * decl.c (start_function): Clear named_labels and shadowed_labels.
-
-       * typeck.c (build_function_call_real): Also synthesize methods here.
-
-Wed May 10 00:55:59 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl2.c (finish_file): Synthesize exported methods before the
-       reconsider loop.
-
-       * parse.y: Move declaration of flag_new_for_scope to file scope.
-
-Tue May  9 19:10:33 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl2.c: Add flag_new_for_scope for new -ffor-scope flag.
-       * parse.y (FOR): Conditionalize the pushing and poping of scope for
-       the for-init-statement upon the new flag_new_for_scope.
-       * parse.y (try_block): Simplify and use compstmt.
-
-Mon May  8 12:41:52 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (define_function): Mark function decl artificial.
-
-Sun May  7 00:51:28 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * parse.y (simple_stmt, FOR): Put back push/pop for condition scope.
-
-       * decl2.c (grokclassfn): DECLs don't have cv-qualified types.
-       * tree.c (build_cplus_method_type): Likewise.
-
-       * cp-tree.h (SET_DECL_ARTIFICIAL): Just set DECL_ARTIFICIAL to 1.
-
-       * typeck.c (build_function_call_real): If convert_arguments failed,
-       just bail.
-       (convert_arguments): If one of the arguments is error_mark_node,
-       just bail.
-
-Sat May  6 02:39:41 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (duplicate_decls): Don't check DECL_NOT_REALLY_EXTERN for
-       decls that don't include it.
-
-Fri May  5 14:23:30 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (duplicate_decls): Decls that have DECL_INTERFACE_KNOWN or
-       DECL_NOT_REALLY_EXTERN set aren't extern decls.
-
-       * typeck.c (build_indirect_ref): Don't call default_conversion for a
-       parameter of reference_type.
-       * cvt.c (convert_from_reference): Just use build_indirect_ref.
-
-       * pt.c (do_type_instantiation): Only instantiate member functions
-       that actually come from templates.
-
-Fri May  5 09:46:05 1995  Mike Stump  <mrs@cygnus.com>
-
-       * parse.y: Generalized cleanup of poplevels, and compound statements
-       and compound statements in try blocks.  Rewritten `for' rule so that
-       the scope of variables declared in the for clause is shortened to
-       span just to the end of the statement, instead of the whole
-       containing block.
-
-Fri May  5 00:37:14 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (convert_harshness): Handle pointers to members better.
-
-Thu May  4 16:00:26 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl2.c (delete_sanity): Do access control here.
-       * init.c (build_delete): Instead of here.
-
-       * Make-lang.in: Build c++filt.
-
-Wed May  3 02:59:53 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl2.c (cplus_decl_attributes): If we just modified a TYPE_DECL,
-       update our IDENTIFIER_TYPE_VALUE.
-
-Fri Apr 28 07:58:41 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * lex.c (cons_up_default_function): Fix linkage of #pragma
-       implemented functions.
-
-Thu Apr 27 16:56:24 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * method.c (build_overload_name): Simplify and fix repeated type
-       folding.
-
-       * decl.c (grokdeclarator): Prohibit pointers to void or reference
-       members.
-
-Thu Apr 27 09:49:07 1995  Mike Stump  <mrs@cygnus.com>
-
-       * typeck2.c (process_init_constructor): Make sure initializers are
-       fully digested.
-
-Thu Apr 27 01:11:55 1995  Jason Merrill  <jason@python.cygnus.com>
-
-       * lex.c (cons_up_default_function): Always defer synthesis.
-
-Thu Apr 27 00:20:37 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl2.c (mark_inline_for_output): Don't play with pending_inline
-       stuff.
-
-Wed Apr 26 17:48:24 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (user_harshness): New function; like build_type_conversion,
-       but doesn't actually build anything.
-       (compute_conversion_costs): Use it instead of build_type_conversion.
-
-Wed Apr 26 17:11:25 1995  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (build_function_call_real): Improve error message for
-       calling a non-function.
-
-       * method.c (hack_identifier): Lose check for calling a data member.
-
-Wed Apr 26 16:59:13 1995  Mike Stump  <mrs@cygnus.com>
-
-       * typeck2.c (build_functional_cast): Remove very old cruft.
-       Seems like good code is generated without it.
-
-Wed Apr 26 00:47:16 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * method.c (do_build_assign_ref): Fix handling of anonymous unions.
-       (do_build_copy_constructor): Likewise.
-
-       * parse.y (simple_stmt, SWITCH): Call {push,pop}_switch.
-
-       * decl.c (push_switch): New function.
-       (pop_switch): Likewise.
-       (define_case_label): Check for jumping over initialization.
-
-       * call.c (build_method_call): Check for an inline function being
-       called before its definition has been seen.
-       * typeck.c (build_function_call_real): Likewise.
-
-       * decl.c (duplicate_decls): Check for a function being redeclared
-       inline after its address has been taken.
-
-       * typeck.c (build_conditional_expr): Handle related class lvalues.
-
-Tue Apr 25 13:20:45 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * pt.c (do_pending_expansions): Don't expand unused templates.
-
-       * parse.y (component_decl): Accept a lone semicolon.
-
-Tue Apr 25 00:25:56 1995  Jason Merrill  <jason@rtl.cygnus.com>
-
-       * call.c (build_method_call): Don't allow an RTL_EXPR to serve as the
-       object parameter anymore.
-
-       * expr.c (cplus_expand_expr): Don't create RTL_EXPRs with no insns.
-
-Mon Apr 24 12:35:48 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * parse.y (simple_stmt, decl case): Clear prefix_attributes.
-       (lang_extdef): Likewise.
-
-       * parse.y (maybe_parmlist): New rule for use in declarators where
-       this could either be a list of expressions or parameters.  Calls
-       suspend_momentary before deciding which.
-       (direct_after_type_declarator): Use it.
-       (complex_direct_notype_declarator): Use it.
-
-       * pt.c (tsubst): Propagate attributes const and noreturn.
-
-       * typeck.c (build_modify_expr): If warn_synth, call build_opfncall
-       before doing the default thing.
-
-Thu Apr 27 21:49:36 1995  Doug Evans  <dje@cygnus.com>
-
-       * typeck.c (common_type): Call lookup_attribute instead of
-       value_member.
-
-Tue Apr 25 18:07:43 1995  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
-
-       * Make-lang.in: Change "realclean" to "maintainer-clean".
-
-Sun Apr 23 12:32:38 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl2.c (finish_file): Fix broken linked list handling.
-
-Fri Apr 21 18:08:43 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * class.c (finish_base_struct): Don't set TYPE_HAS_COMPLEX_*_REF
-       as often.
-       (finish_struct): Likewise.
-
-       * various: Use TYPE_HAS_TRIVIAL_* instead of TYPE_HAS_COMPLEX_*.
-
-       * cp-tree.h (TYPE_HAS_TRIVIAL_INIT_REF): New macro.
-       (TYPE_HAS_TRIVIAL_ASSIGN_REF): New macro.
-
-Fri Apr 21 15:52:22 1995  Jason Merrill  <jason@python.cygnus.com>
-
-       * typeck.c (c_expand_return): Only expand a returned TARGET_EXPR if
-       it is of the same type as the return value.
-
-Fri Apr 21 03:01:46 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl2.c (finish_file): Reconsider if synthesizing a method wrote
-       out its assembly.
-
-       * typeck.c (convert_for_initialization): Don't call a trivial copy
-       constructor.
-
-       * typeck2.c (store_init_value): Only abort if the type has a
-       non-trivial copy constructor.
-
-       * typeck.c (c_expand_return): If we're returning in a register and
-       the return value is a TARGET_EXPR, expand it.  Only do
-       expand_aggr_init if we're returning in memory.
-       (expand_target_expr): Function to expand a TARGET_EXPR.
-       (build_modify_expr): Use it.
-
-       * tree.c (build_cplus_new): Layout the slot.
-
-       * expr.c (cplus_expand_expr): Use expand_call to expand the call
-       under a NEW_EXPR, so the target is not discarded.
-
-Thu Apr 20 14:59:31 1995  Mike Stump  <mrs@cygnus.com>
-
-       * gc.c (build_dynamic_cast): Tighten error checking.
-
-Thu Apr 20 11:23:54 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * expr.c (cplus_expand_expr): Only abort if the returned target is
-       different from what we expected if the type has a non-trivial copy
-       constructor.
-
-       * decl2.c (cplus_decl_attributes): Attributes applied to a template
-       really apply to the template's result.
-
-       * tree.c (lvalue_p): Check IS_AGGR_TYPE instead of TREE_ADDRESSABLE
-       to decide whether to consider a CALL_EXPR an lvalue.
-
-       * class.c (finish_struct_bits): Only set TREE_ADDRESSABLE if the
-       type has a non-trivial copy constructor.
-
-       * decl.c (start_function): If interface_known, unset
-       DECL_NOT_REALLY_EXTERN on the function.
-
-Wed Apr 19 16:53:13 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * pt.c (do_function_instantiation): Handle explicit instantiation of
-       member functions.
-       (do_type_instantiation): Handle 'inline template class foo<int>',
-       meaning just spit out the vtable.
-
-       * lex.c (cons_up_default_function): Set DECL_NOT_REALLY_EXTERN on
-       the consed functions.
-
-       * decl2.c (import_export_inline): Set DECL_INTERFACE_KNOWN.
-
-Wed Apr 19 16:28:17 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * call.c, class.c, decl2.c, gc.c, init.c, parse.y, pt.c, search.c,
-       typeck.c: Include output.h.
-
-Wed Apr 19 14:57:21 1995  Gerald Baumgartner  <gb@alexander.cs.purdue.edu>
-
-       * call.c (build_method_call): Allow a signature member functions to
-       be called from a default implementation.
-
-Wed Apr 19 10:21:17 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * repo.c (finish_repo): Remember what directory we are in.
-
-       * search.c (expand_upcast_fixups): Don't mess with abort_fndecl.
-
-       * repo.c: Use obstacks instead of fixed-size buffers.  Don't spit
-       out the second copy of the symbol name.  Don't remember COLLECT_GCC.
-
-Wed Apr 19 02:32:40 1995  Mike Stump  <mrs@cygnus.com>
-
-       * search.c (virtual_context): New function to get the virtual
-       context of a function.
-       (expand_upcast_fixups): New function to generate runtime vtables.
-       (fixup_virtual_upcast_offsets): Likewise.
-       (expand_indirect_vtbls_init): Use fixup_virtual_upcast_offsets to
-       ensure that the this offsets for upcasts from virtual bases into
-       other virtual bases or non-virtual bases are correct at construction
-       time and destruction time.
-       * class.c (fixup_vtable_deltas): Modify to fixup all offsets in all
-       vtables in all virtual bases, instead of just one vtable in each
-       virtual base.
-       (fixup_vtable_deltas1): Likewise.
-
-Tue Apr 18 03:57:35 1995  Michael Meissner  <meissner@cygnus.com>
-
-       * Makefile.in (lex.o): Add dependency on c-pragma.h.
-
-       * lex.c (handle_sysv_pragma): Use NULL_PTR and NULL_TREE as
-       appropriate, instead of 0.
-
-Mon Apr 17 12:28:42 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (pushdecl): Use decls_match, not duplicate_decls, for
-       comparing local and global decls.
-
-Fri Apr 14 01:46:52 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (convert_arguments): Only prohibit passing to ... of
-       types with non-trivial copy constructors.
-
-       * repo.c (repo_template_used): Don't try to mess with no id.
-
-Fri Apr 14 23:32:50 1995  Per Bothner  <bothner@rtl.cygnus.com>
-
-       * decl.c (duplicate_decls):  Use cp_warning_at for redundant-decls.
-
-Thu Apr 13 15:37:42 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * cp-tree.h (current_tinst_level): Delete declaration, since it's
-       static inside pt.c.
-
-       * typeck.c (build_modify_expr): Catch incompatible array assignment.
-
-       * parse.y (attribute_list, attrib): Rewrite actions to feed the
-       right stuff to decl_attributes.
-
-Thu Apr 13 11:24:10 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * search.c (dfs_debug_mark): Check for magic virtual like
-       import_export_vtable.
-
-       * typeck.c (build_binary_op_nodefault): Don't call cp_pedwarn with
-       four args.
-
-Wed Apr 12 12:02:57 1995  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl2.c (finish_file): Move prevtable pass before needs_messing_up
-       decision.
-
-Tue Apr 11 11:20:27 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (finish_decl): If we're writing out a static data member of
-       a class, we want the debug info for that class.
-
-       * gc.c (build_t_desc): Check linkage of a class properly.
-
-       * class.c (finish_struct): Set the 'headof' offset for the main
-       vtable properly.
-       (prepare_fresh_vtable): Fix typeinfo pointer here.
-       (modify_one_vtable): Instead of here.
-
-Mon Apr 10 12:15:59 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * repo.c (repo_get_id): New function to return the interesting
-       identifier for a repo entity.
-       (repo_template_used): Use it.
-       (repo_template_instantiated): Mark the id as chosen.
-       (init_repo): Record whether or not the id was chosen.
-       (finish_repo): Note if an id was newly chosen.
-
-       * pt.c (do_function_instantiation): Call repo_template_instantiated.
-       (do_type_instantiation): Likewise.  Don't diagnose multiple
-       instantiation.
-
-       * decl2.c (finish_file): Use DECL_NOT_REALLY_EXTERN when deciding
-       whether or not to synthesize a method.
-
-       Undo these changes:
-       * class.c (finish_vtbls): build more vtables if flag_rtti is on.
-       * class.c (modify_all_direct_vtables): ditto.
-       * init.c (expand_direct_vtbls_init): expand more vtables if
-       flag_rtti is on.
-
-Sat Apr  8 17:45:41 1995  Mike Stump  <mrs@cygnus.com>
-
-       * gc.c (build_headof): Use ptrdiff_type_node instead of
-       integer_type_node on pointer arithmetic.
-
-Sat Apr  8 11:57:04 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (build_modify_expr): Undo previous change.
-
-Thu Apr  6 01:23:50 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * Makefile.in (compiler): Remove ../cc1plus before rebuilding it.
-
-       * repo.c (get_base_filename): Put the .rpo file in the directory
-       with the object file, not the source.
-
-       * typeck.c (build_conditional_expr): Handle pmf's better.
-
-       * repo.c (finish_repo): Also use ASM_OUTPUT_LABELREF to print out
-       the name of the symbol.
-
-Wed Apr  5 15:24:12 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * repo.c (open_repo_file): Make repo filename DOS-compliant.
-       (*): Also write a new repo file if some previously-used
-       templates are no longer used.  Only remember the identifier.
-
-       * lex.c (cons_up_default_function): If this function belongs to a
-       template class, call repo_template_used for it.
-
-       * repo.c (repo_template_used): Using a class means using its vtable,
-       if any.
-       (finish_repo): Likewise.
-
-       * typeck.c (build_modify_expr): Only wrap TARGET_EXPRs in RTL_EXPRs
-       if the type has a complex copy constructor.
-
-       * decl2.c (lang_decode_option): -frepo implies
-       -fno-implicit-templates.
-
-       * decl.c (start_function): Clear current_{base,member}_init_list.
-
-       * lex.c (init_lex): Also unset *_eq if ! flag_operator_names.
-
-Tue Apr  4 16:11:08 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (struct cp_function): Add {base,member}_init_list.
-       (push_cp_function_context): Save current_{base,member}_init_list.
-       (pop_cp_function_context): Restore them.
-
-Mon Apr  3 16:55:08 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * repo.c (get_base_filename): Take filename parm, fix logic bug.
-
-       * typeck.c (build_compound_expr): Do not warn about a compound expr
-       in which the first expression has no side effects.
-       (build_x_compound_expr): Warn here instead.
-       (build_conditional_expr): Don't warn about a conditional expression
-       between an enum and the type it promotes to.
-
-       * init.c (build_new): Handle initialization of arrays of builtins
-       properly.
-
-Mon Apr  3 15:08:04 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * repo.c: Include config.h to get definitions of bcopy and rindex
-       on systems that don't have them (e.g., SVR4).
-
-Mon Apr  3 14:41:55 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl2.c (finish_table): Pass NULL_TREE instead of init to
-       finish_decl so that it won't try and do error checking on the
-       initializer.
-
-Mon Apr  3 10:45:50 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * repo.c (get_base_filename): Analyze COLLECT_GCC_OPTIONS to
-       determine whether this compile used -c -o.
-       (open_repo_file): Use get_base_filename.  Remove the extension.
-       (finish_repo): Spit out the values of main_input_filename,
-       COLLECT_GCC and COLLECT_GCC_OPTIONS.
-
-       * parse.y (structsp): Add TYPENAME_KEYWORD complex_type_name.
-
-Sun Apr  2 23:43:51 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * search.c (compute_access): Don't try to do access control on
-       nested types.
-
-Fri Mar 31 10:14:23 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * repo.c: New file to handle things repo.
-
-       * pt.c (instantiate_template): Call repo_template_used if the
-       definition is accessible.
-       (mark_function_instantiated): Split out from
-       do_function_instantiation.
-       (mark_class_instantiated): Split out from do_type_instantiation.
-
-       * parse.y (template_instantiate_once): Call repo_template_used.
-
-       * lex.c (lang_init): Call init_repo.
-
-       * decl2.c: Handle flag_use_repository.
-       (finish_file): Call finish_repo.
-
-       * decl.c (start_method): Call repo_template_used if this is a
-       template method.
-
-       * Makefile.in (CXX_OBJS): Add repo.o.
-       (repo.o): Add dependencies.
-
-       * Make-lang.in (CXX_SRCS): Add repo.c.
-
-       * decl.c (start_function): If DECL_INTERFACE_KNOWN and
-       DECL_NOT_REALLY_EXTERN are both set, unset DECL_EXTERNAL.
-
-       * typeck.c (build_binary_op_nodefault): Identify the invalid operand
-       types used.
-
-       * decl.c (duplicate_decls): Propagate DECL_NOT_REALLY_EXTERN.
-
-Thu Mar 30 17:54:42 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (build_binary_op_nodefault): Tidy up use of build_type
-       and result_type.  When checking for comparison between signed
-       and unsigned, use result_type rather than the (possibly shortened)
-       type of op0.  Also, don't warn about equality comparison of a
-       signed operand to an unsigned constant that fits in the signed
-       type.
-
-       * method.c (do_build_copy_constructor): Reverse
-       current_base_init_list after we've built it up.
-
-Thu Mar 30 14:35:18 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (build_throw): Never warn about the value of throw not
-       being used.
-
-Thu Mar 30 13:16:54 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_start_catch_block): Check for bad catch parameter
-       declarations.
-
-Thu Mar 30 13:06:11 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (finish_function): Only set DECL_NOT_REALLY_EXTERN if
-       DECL_EXTERNAL is not already set.
-
-Thu Mar 30 11:26:24 1995  Mike Stump  <mrs@cygnus.com>
-
-       * method.c (emit_thunk): Let poplevel know that the last level is
-       for a function so it can create a BLOCK_NODE and set DECL_INITIAL.
-
-Thu Mar 30 11:15:06 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl2.c (import_export_inline): Don't set DECL_NOT_REALLY_EXTERN
-       here.
-
-       * decl.c (grokdeclarator): OK, don't abort if we see a decl with
-       METHOD_TYPE.
-       (finish_function): Set DECL_EXTERNAL and DECL_NOT_REALLY_EXTERN on
-       all deferred inlines.
-
-Wed Mar 29 19:35:02 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * cp-tree.h (DECL_THIS_INLINE): New macro.
-       (DECL_NOT_REALLY_EXTERN): New macro.
-       (DECL_THIS_STATIC): New macro.
-
-       * decl.c: Lose all references to current_extern_inline.  Break
-       inline semantics into DECL_INLINE for actual inlining and
-       DECL_THIS_INLINE for the linkage wierdness.  Use DECL_THIS_STATIC.
-       * decl2.c: Use DECL_NOT_REALLY_EXTERN to indicate that we want to
-       emit an inline here.  Associated changes.
-       * lex.c: Likewise.
-       * pt.c: Likewise.
-       * typeck.c: Likewise.
-
-       * call.c (build_method_call): Don't bother trying to handle inlines
-       specially.
-       * cvt.c (convert_to_aggr): Likewise.
-
-       * pt.c (do_function_instantiation): Handle instantiation of
-       public inlines, too.
-
-Wed Mar 29 16:04:25 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (init_exception_processing): Change the interface for
-       __throw_type_match and add decl for new rtti matching routine
-       __throw_type_match_rtti.
-       (build_eh_type): New routine to build a run time descriptor for the
-       expression given. 
-       (expand_start_catch_block): Update to use new calling convention for
-       the matcher.
-       (expand_throw): Update to use build_eh_type.
-
-Mon Mar 27 07:14:33 1995  Warner Losh  <imp@village.org>
-
-       * g++.c: Removed __NetBSD__ from conditional.
-       Declare strerror if HAVE_STRERROR is defined; otherwise
-       declare sys_errlist and sys_nerr.
-       (my_strerror): New function.
-
-Tue Mar 28 14:16:35 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * search.c (get_binfo): Don't try to be so clever.
-
-       * tree.c (copy_to_permanent): Also suspend_momentary().
-
-       * cvt.c (cp_convert_to_pointer): Hand off to convert_fn_pointer even
-       if the types are the same.
-
-       * decl.c (start_function): Handle extern inlines more like C++ says
-       we should.
-
-       * init.c (build_member_call): Hand constructor calls off to
-       build_functional_cast.
-
-       * typeck2.c (build_functional_cast): Use DECL_NESTED_TYPENAME to get
-       the name of the type.
-
-Tue Mar 28 13:13:56 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl.c (grokdeclarator): Check for the decl returned by
-       grokfndecl to be null before using build_decl_attribute_variant.
-
-Mon Mar 27 18:04:41 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * init.c (build_new): Use build_pointer_type instead of
-       TYPE_POINTER_TO.
-
-Fri Mar 24 12:11:24 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (build_conditional_expr): Handle pmfs.
-       (convert_for_assignment): Fix pmf support.
-
-       * cvt.c (convert_fn_ptr): Support !flag_vtable_thunks.
-       (cp_convert_to_pointer): Handle pmfs.
-       (cp_convert): Pass pmfs to cp_convert_to_pointer.
-
-       * typeck.c (common_type): Handle inheritance for pmfs.
-
-       * typeck2.c (build_m_component_ref): Do access control.
-
-       * typeck.c (comp_target_types): Check for conversion to void *
-       before checking trickier conversions.
-
-       * decl.c (duplicate_decls): Propagate DECL_ABSTRACT_VIRTUAL_P.
-
-       * pt.c (push_tinst_level): Complain if template instantiation depth
-       is greater than max_tinst_depth.
-
-       * typeck.c (common_type): Assume that we can call common_type to
-       unify the target type of a pointer.
-
-Thu Mar 23 00:48:44 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl2.c (finish_file): Don't synthesize methods at
-       finish_vtable_prevardecl time.  Do synthesize methods that are not
-       used, but are public and not external.
-
-       * cvt.c (build_type_conversion): Only give an error if for_sure.
-
-       * typeck.c (comp_target_types): Only support pointer conversions if
-       nptrs > 0.
-
-Wed Mar 22 19:30:15 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * init.c (build_new): Catch use of an initializer list where it
-       shouldn't be.
-
-Wed Mar 22 16:21:07 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * init.c (build_new): Wrap alloc_expr in an RTL_EXPR if nelts is
-       non-constant.
-
-       * decl2.c: temp_name_counter is now public.
-
-       * decl.c (struct cp_function): Add temp_name_counter field.
-       (push_cp_function_context): Save it.
-       (pop_cp_function_context): Restore it.
-
-       * typeck.c (common_type): Handle unifying function types, and unify
-       unmatched things to void* with a compiler_error, rather than
-       silently like before.
-
-Wed Mar 22 15:10:34 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl2.c (finish_prevtable_vardecl, finish_vtable_vardecl): Revert
-       Brendan's last change and fix latent problem that causes TD entries
-       to not come out when the things that need them has yet to be
-       expanded.
-
-Wed Mar 22 15:12:00 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (build_binary_op_nodefault, comparison ops): Update type0
-       and type1, since we might have changed op0 or op1.
-
-Wed Mar 22 13:33:45 1995  Jason Merrill  <jason@python.cygnus.com>
-
-       * typeck.c (common_type): Don't mess up templates.
-
-Wed Mar 22 04:56:00 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (common_type): Handle ptms properly.  Also handle 
-       T* -> void*.
-       (build_binary_op_nodefault): New variable build_type controls what
-       type is given to the expression when it is created.  Set this to
-       boolean_type_node for comparison ops instead of using result_type.
-       (comp_target_types): Allow T * -> void *.
-
-       * cvt.c (cp_convert_to_pointer): Do access control when converting
-       ptms, too.
-
-Tue Mar 21 17:25:06 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * parse.y (extern_lang_string): Catch use of linkage specs that
-       aren't all naming the same language.
-
-       * class.c (finish_struct): Delete accidental duplicate code.
-
-Tue Mar 21 14:00:57 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (build_binary_op_nodefault): Disable pedwarns about
-       comparing functions and incomplete types.
-
-       * decl.c (finish_function): Only unset current_function_decl if
-       !nested.
-       (duplicate_decls): Last change went too far; we only want to stop
-       checking for value/reference ambiguity.
-
-Tue Mar 21 01:26:39 1995  Mike Stump  <mrs@cygnus.com>
-
-       * gc.c (build_generic_desc): Zap the DECL_SIZE so that we can lay it
-       out fresh, as the new type may be larger.
-
-Mon Mar 20 19:01:10 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * expr.c (extract_init): Try to expand the RTL for the
-       initialization and figure out what it will look like so we can avoid
-       run-time initialization.  Disabled for now.
-       (extract_scalar_init): Helper for scalar initialization.
-       (extract_aggr_init): Helper for aggregate initialization.
-
-       * decl.c (duplicate_decls): Don't complain about ambiguous
-       declarations.
-       (obscure_complex_init): Now returns a tree.  Call extract_init if
-       we're optimizing and this is a toplevel decl.
-       (finish_decl): Update accordingly.
-
-       * lex.c (check_newline): If we're just changing files (not pushing
-       or popping), update input_file_stack->name.
-
-Mon Mar 20 17:55:04 1995  Mike Stump  <mrs@cygnus.com>
-
-       * pt.c (type_unification): Only TEMPLATE_DECLs are handled right now
-       in the transitive unification code.
-
-Mon Mar 20 16:07:50 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl.c (shadow_tag): Don't allow inline, virtual, or explicit on
-       non-functions.
-       (grokdeclarator): Don't allow friends to be defined in local classes.
-
-Sat Mar 18 04:03:33 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl2.c (finish_prevtable_vardecl): Use DECL_DECLARED_STATIC
-       rather than DECL_SAVED_INSNS to decide whether or not this method
-       was declared inline.
-
-       * method.c (synthesize_method): Turn off DECL_INLINE if
-       function_cannot_inline_p thinks we're too large.
-
-       * typeck.c (build_indirect_ref): Use build_expr_type_conversion.
-
-Fri Mar 17 17:47:36 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * class.c (instantiate_type): Handle pmfs.
-
-       * typeck.c (convert_for_assignment): Check types when assigning one
-       pmf to another.
-
-       * decl.c (define_label): Fix logic for printing out the name of the
-       label in an error message.
-
-       * error.c (dump_expr): Support ARRAY_REF.
-
-Fri Mar 17 17:43:02 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl2.c (finish_vtable_vardecl): Call build_t_desc here.
-       (finish_prevtable_vardecl): Instead of here.
-
-Fri Mar 17 14:40:45 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (expand_static_init): Also use expand_aggr_init if the
-       initializer is a TREE_LIST.     
-       (grokdeclarator): Only pedwarn about extra qualification if -pedantic.
-
-       * pt.c (unify): Fix unification of return type.
-
-       * expr.c (fixup_result_decl): Use store_expr, rather than
-       emit_move_insn, to move the return value into the place where
-       callers will expect it.
-
-Thu Mar 16 22:05:25 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * init.c (build_offset_ref): Call assmble_external on functions.
-       * typeck.c (build_component_ref): Likewise.
-
-Thu Mar 16 20:28:16 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl.c (struct saved_scope): Add members base_init_list and
-       member_init_list.
-       (push_to_top_level): Save current_base_init_list and
-       current_member_init_list to them.
-       (pop_from_top_level): Put it back.
-
-Thu Mar 16 19:21:14 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * pt.c (instantiate_template): Call assemble_external.  
-
-Thu Mar 16 18:07:54 1995  Brendan Kehoe  <brendan@phydeaux.cygnus.com>
-
-       * class.c: Include rtl.h, to get NULL_RTX.
-       (finish_struct): Also zero out DECL_SAVED_INSNS, to avoid problems
-       on hosts with different sizes for each part of the union.
-       * tree.c: Also include rtl.h.
-       (layout_basetypes): Same change for DECL_SAVED_INSNS.
-
-Thu Mar 16 13:57:36 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * pt.c (unify): Fix array domain unification for 64-bit targets.
-
-       * decl2.c (finish_file): Push bizarre type decl before walking the
-       vtables the first time.
-       (walk_vtables): OK, don't set prev to vars if the vardecl_fn messed
-       with TREE_CHAIN (prev).
-
-       * init.c (emit_base_init): Use convert_pointer_to_real instead of
-       convert_pointer_to when converting to a direct base.
-
-Wed Mar 15 20:26:29 1995  Mike Stump  <mrs@cygnus.com>
-
-       * pt.c (type_unification): Handle transitive unification better.
-
-Wed Mar 15 13:56:16 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl2.c (walk_vtables): Always set prev to vars.
-       (mark_vtable_entries): Call assemble_external on the vtable entries.
-
-       * class.c (finish_struct): Set the vtable's size to NULL_TREE before
-       calling layout_decl, so that it gets updated properly.
-
-       Finally re-enable dynamic synthesis.  This time it works.
-       * method.c (synthesize_method): Pass decl_function_context (fndecl)
-       to {push,pop}_cp_function_context.
-       * decl.c (push_cp_function_context): Now takes a tree argument.
-       (pop_cp_function_context): Likewise.
-       * call.c (build_method_call): Enable synthesis.
-       * lex.c (cons_up_default_function): Likewise.
-
-Tue Mar 14 19:14:19 1995  Doug Evans  <dje@chestnut.cygnus.com>
-
-       * parse.y (setattrs): Chain onto prefix_attributes rather than
-       setting it.
-
-Wed Mar 15 13:00:00 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl.c (pushdecl): Check if the type of the VAR_DECL is an
-       error_mark_node before trying to read TYPE_LANG_SPECIFIC. 
-
-Mon Mar 13 21:00:28 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl.c (grokdeclarator, case ARRAY_REF): Wrap the exp with fold,
-       and convert the size and integer_one_node to the index type.
-
-Mon Mar 13 08:01:02 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (get_member_function_from_ptrfunc): Save the instance
-       argument, and tack it onto the front of the COND_EXPR to make the
-       semantics come out right.  Grab the instance argument from
-       '*instance_ptrptr', rather than having it passed in separately.
-       
-       * various: Change various consed-up comparison operations to have
-       boolean type.  Remove the instance argument in calls to
-       get_member_function_from_ptrfunc.
-
-       * error.c (dump_expr): Dump true and false as "true" and "false".
-
-       * decl2.c (finish_file): Also set DECL_STATIC_FUNCTION_P on the
-       global init function.
-
-       * decl.c (finish_function): Only set DECL_EXTERNAL here if the
-       inline function is public.
-
-Sat Mar 11 00:58:03 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * init.c (is_friend): Be more careful about checking
-       DECL_CLASS_CONTEXT on non-member functions.
-
-       * decl2.c (finish_vtable_vardecl): Don't bother calling
-       assemble_external here.
-       (prune_vtable_vardecl): New function that just splices out the
-       vtable decl from the top-level decls.
-       (import_export_inline): Unset DECL_EXTERNAL at first.
-       (finish_file): Don't bother calling assemble_external here.  Do
-       splice out all of the vtables.
-
-Fri Mar 10 14:42:29 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (finish_function): If we're not emitting the function yet,
-       call assemble_external for it.
-
-       * decl2.c (finish_prevtable_vardecl): Don't call mark_vtable_entries
-       here.
-       (finish_vtable_vardecl): Don't do the linkage deduction thing here.
-       Also don't splice out the current vtable if it is unused.
-       (finish_file): Move the second walk_vtables and the synthesis check
-       inside the 'reconsider' loop.  Move thunk emission after the
-       'reconsider' loop.
-
-Thu Mar  9 16:28:16 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * pt.c (tsubst): Don't bother calling cp_build_type_variant, since it
-       was passing bogus values for readonly and volatile from the original
-       template decl, not the resultant type of the tsubst call.
-
-       * class.c (duplicate_tag_error): Use cp_error_at to point out the
-       previous definition of the tag.
-
-Thu Mar  9 10:46:17 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (start_function): Clear base_init_insns and protect_list.
-       (struct cp_function): Add base_init_insns field.
-       (push_cp_function_context): Also save base_init_insns.
-       (pop_cp_function_context): Also restore base_init_insns.
-
-Wed Mar  8 13:31:44 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * init.c (member_init_ok_or_else): Check for initializing a static
-       member here.
-       (emit_base_init): Instead of here.
-
-Tue Mar  7 16:03:26 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (build_method_call): Disable synthesis as needed.
-       * lex.c (cons_up_default_function): Likewise.
-
-Tue Mar  7 10:14:29 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * parse.y: New rules to allow attributes in a prefix position.
-       (prefix_attributes): New variable.  Pass it into cplus_decl_attributes.
-       (setattr): New rule.
-       (reserved_declspecs, declmods): Catch attributes here.
-       * decl2.c (cplus_decl_attributes): Add PREFIX_ATTRIBUTES argument.
-       * decl.c (duplicate_decls): Pass DECL_MACHINE_ATTRIBUTES to
-       descendent typedef.
-       (grokdeclarator): Added code to support machine attributes.
-       * Makefile.in (stamp-parse): Expect 5 shift/reduce failures.
-
-Mon Mar  6 15:07:02 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (build_method_call): Don't synthesize methods outside of a
-       function.
-
-       Make base initialization more re-entrant so that synthesis on the
-       fly will work (and, eventually, template instantation on the fly).
-       * init.c (sort_member_init): Don't bother with members that can't be
-       initialized.  Reorganize a bit.  Don't initialize base members here.
-       (sort_base_init): New function, like sort_member_init, but for base
-       classes.  Steals some code from emit_base_init.
-       (emit_base_init): Simplify.  Call sort_{member,base}_init before
-       doing any initialization, so we don't have to save
-       current_{member,base}_init_list in push_cp_function_context.
-       (expand_aggr_vbase_init_1): Adjust for sort_base_init.
-       (expand_aggr_vbase_init): Simplify.
-       * decl.c (struct cp_function): Add protect_list field.
-       (push_cp_function_context): Also save protect_list.
-       (pop_cp_function_context): Also restore protect_list.
-       * call.c (build_method_call): Enable synthesis at point of call.
-       * lex.c (cons_up_default_function): Likewise.
-
-       * parse.y: Turn -ansi checks back into -pedantic checks.
-
-       * init.c (build_new): Fix -fcheck-new for array new.
-
-Sat Mar  4 15:55:42 1995  Fergus Henderson  <fjh@cs.mu.oz.au>
-
-       * typeck.c (build_compound_expr): warn if left-hand operand of
-       comma expression has no side-effects.
-
-Fri Mar  3 15:16:45 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * parse.y (primary): Change 'object qualified_id *' rules to 'object
-       overqualified_id *'.
-
-Fri Mar  3 12:48:17 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * parse.y (unary_expr): Catch doing sizeof an overloaded function.
-       Make the error look the same as the one we issue in c_sizeof.
-
-       * typeck.c (build_binary_op_nodefault): Give an error for trying
-       to compare a pointer-to-member to `void *'.
-
-Fri Mar  3 11:28:50 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (build_unary_op): Handle bool increment with smoke and
-       mirrors here, rather than in expand_increment where it belongs,
-       because Kenner doesn't agree with me.
-
-Fri Mar  3 00:08:10 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl.c (grokparms): Catch a PARM_DECL being used for a default
-       argument as well.
-
-Thu Mar  2 20:05:54 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * init.c (build_new): Don't allow new on a function type.
-
-       * parse.y (primary): Avoid a crash when seeing if the arg is of
-       the same type as that given for the typespec in an explicit dtor call.
-
-Thu Mar  2 00:49:38 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (finish_function): Change test for calling
-       mark_inline_for_output.
-
-Wed Mar  1 11:23:46 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (build_modify_expr): Complain if
-       build_default_binary_type_conversion fails.
-
-       * init.c (expand_default_init): Handle arguments of unknown type
-       properly.
-
-       * cvt.c (build_expr_type_conversion): Only complain about ambiguity
-       if 'complain'.
-       * various: Pass 'complain'.
-
-       * typeck.c (comptypes): Be more picky about comparing UPTs.
-
-Wed Mar  1 11:03:41 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl.c (grokdeclarator): If declarator is null, say that the
-       type used has an incomplete type.
-
-Wed Mar  1 10:06:20 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * pt.c (instantiate_template): Copy the template arguments to the
-       permanent_obstack.  Also use simple_cst_equal to compare them when
-       looking for a previous instantiation.
-
-       * tree.c (make_deep_copy): Support copying INTEGER_TYPEs (assuming
-       they are array domain types).
-
-Tue Feb 28 23:24:55 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * cp-tree.h: Define WANT_* constants for passing to
-       build_expr_type_conversion.
-       * cvt.c (build_expr_type_conversion): New function to build
-       conversion to one of a group of suitable types.
-       (build_default_binary_type_conversion): Use it.
-       * decl2.c (grok_array_decl): Likewise.
-       * typeck.c (build_unary_op): Likewise.
-       (build_array_ref): Tidy up a bit.
-       (build_binary_op): Likewise.
-
-Tue Feb 28 19:57:31 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl.c (grokdeclarator): Don't allow decl of an argument as `void'.
-
-Tue Feb 28 17:23:36 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * parse.y (typed_declspecs1): Add 'typespec reserved_typespecquals
-       reserved_declspecs' rule.
-
-       * parse.y (expr_or_declarator): Remove notype_qualified_id rule.
-       (direct_notype_declarator): Likewise.
-       (complex_direct_notype_declarator): Add notype_qualified_id rule.
-
-       * lex.c (real_yylex): Handle :> digraph properly.
-
-Tue Feb 28 12:26:29 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl.c (grokdeclarator): Check if it's a friend, not if it's
-       non-virtual, that's being initialized.  Move the check up to
-       before FRIENDP would get cleared.  Catch an unnamed var/field
-       being declared void.  Say just `field' instead of `structure field'
-       in the error message.  Only go for the operator name if DECLARATOR
-       is non-null.
-
-Tue Feb 28 00:08:01 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (start_function): Complain about abstract return type.
-       (grokdeclarator): Complain about declaring constructors and
-       destructors to be const or volatile.  Complain about declaring
-       destructors to be static.
-
-       * pt.c (uses_template_parms): Handle pmfs.
-
-       * decl.c (grokdeclarator): Don't call variable_size for array bounds
-       that only depend on template constant parameters.
-
-Mon Feb 27 15:38:16 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * error.c (dump_decl): Only look to see if it's a vtable if we
-       actually have a name to check out.
-
-Mon Feb 27 13:37:53 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * cvt.c (convert_to_aggr): Lose misleading shortcut.
-
-Sun Feb 26 17:27:32 1995  Doug Evans  <dje@canuck.cygnus.com>
-
-       * decl.c (set_nested_typename): Always set DECL_IGNORED_P,
-       not just for dwarf.
-
-Sun Feb 26 00:10:18 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl.c (grokdeclarator): Don't allow a static member to be
-       declared `register'.
-
-       * init.c (make_friend_class): Move up to a pedwarn for the warning
-       about a class declaring friends with itself.
-
-       * decl.c (grokdeclarator): You can't do `volatile friend class foo'
-       or `inline friend class foo'.  Only try to make a friend out of
-       TYPE if we didn't already reset it to integer_type_node.
-
-Sat Feb 25 22:32:03 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl.c (grokdeclarator): Don't allow initialization of a
-       non-virtual function.
-
-       * decl.c (start_function): Do a pedwarn if we're changing `main'
-       to have an int return type.
-
-Sat Feb 25 00:02:05 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (build_modify_expr): Handle simple assignment from
-       TARGET_EXPRs by building up an RTL_EXPR to force expansion.  Whew.
-
-Fri Feb 24 18:27:14 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl.c (grokdeclarator): Also don't allow virtual outside of a
-       class decl for a scope method definition performed at global binding.
-
-       * init.c (build_offset_ref): Don't allow creation of an OFFSET_REF
-       of a bitfield.
-
-       * decl.c (grokdeclarator): Don't allow a const to be declared mutable.
-
-       * typeck.c (build_binary_op): Return an error_mark_node if either
-       one of the args turned into an error_mark_node when we tried to
-       use default_conversion.
-
-       * typeck.c (build_unary_op): Forbid using postfix -- on a bool.
-
-       * decl.c (grokdeclarator): Allow `signed' and `unsigned' to be
-       used on `__wchar_t'.
-
-Fri Feb 24 13:59:53 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (end_protect_partials): Do it the right way.
-
-Wed Feb 22 15:42:56 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (build_binary_op_nodefault): Upgrade warning about
-       comparing distinct pointer types to pedwarn.
-
-       * typeck2.c (digest_init): Cope with extra braces.
-
-       * typeck.c (build_binary_op_nodefault): Use tree_int_cst_sgn instead
-       of INT_CST_LT (..., interger_zero_node).
-
-Wed Feb 22 14:45:52 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * except.c [!TRY_NEW_EH] (end_protect_partials): Define dummy
-       function for systems that don't have EH.
-
-Tue Feb 21 19:18:31 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (can_convert_arg): Like can_convert, but takes an arg as
-       well.
-
-       * pt.c (type_unification): Allow implicit conversions for parameters
-       that do not depend on template parameters.
-
-Tue Feb 21 18:43:48 1995  Douglas Rupp  <drupp@cs.washington.edu>
-
-       * Make-lang.in, config-lang.in: ($exeext): New macro.
-       * Make-lang.in: Try a "cp" if "ln" fails.
-       * cp-tree.h (decl_attributes): Added argument.
-       * decl2.c (cplus_decl_attribute): Add arg to decl_attributes.
-       * cp/g++.c: Added #ifdefs for sys/file.h and process.h for NT.
-       Modified spawnvp to have to correct number of arguments for OS/2, NT.
-
-Tue Feb 21 18:36:55 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (finish_function): Add calls to end_protect_partials to end
-       the exception region that protects constructors so that partially
-       constructed objects can be partially destructed when the constructor
-       throws an exception.
-       * init.c (perform_member_init, sort_member_init, emit_base_init):
-       Added support for partially constructed objects.
-       * init.c (build_partial_cleanup_for): New routine to do partial
-       cleanups of a base class.
-       * decl2.c (finish_file): Move the emitting of the exception table
-       down, after we emit all code that might have exception regions in
-       them.
-       * except.c (end_protect_partials, might_have_exceptions_p): New
-       routines.
-       (emit_exception_table): Always output table if called.
-       * cp-tree.h (protect_list, end_protect_partials,
-       might_have_exceptions_p, emit_exception_table): Added.
-
-Tue Feb 21 16:05:59 1995  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * gc.c (build_typeid): Pass a NULL_TREE, not the bogus, unused
-       address of a local variable.
-       * class.c (build_vfn_ref): Only try to build the PLUS_EXPR if we
-       were given a non-null PTR_TO_INSTPTR.
-
-Tue Feb 21 01:53:18 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (duplicate_decls): Always lay out the merged decl.
-
-       * decl2.c (finish_vtable_vardecl): Don't do vtable hack on templates.
-       (finish_prevtable_vardecl): Likewise.
-
-       * method.c (synthesize_method): Set interface_{unknown,only}
-       according to the settings for our class, not the file where it comes
-       from.
-
-Sat Feb 18 12:26:48 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c: Handle systems that define __i386__ but not __i386.
-
-Fri Feb 17 15:31:31 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl2.c (reparse_decl_as_expr): Support being called without a
-       type argument.
-
-       * parse.y (primary): Add '(' expr_or_declarator ')'.  Adds 4 r/r
-       conflicts.  Sigh.
-
-Fri Feb 17 12:02:06 1995  Mike Stump  <mrs@cygnus.com>
-
-       * parse.y (template_def, fndef, fn.def1, return_init, condition,
-       initdcl0, initdcl, notype_initdcl0, nomods_initdcl0,
-       component_decl_1, after_type_component_declarator0,
-       notype_component_declarator0, after_type_component_declarator,
-       notype_component_declarator, after_type_component_declarator,
-       full_parm, maybe_raises, exception_specification_opt): Fix up,
-       include exception_specification_opt maybeasm maybe_attribute and
-       maybe_init if missing.  Rename maybe_raises to
-       exception_specification_opt to match draft wording.  Use maybe_init
-       to simplify rules.
-
-Fri Feb 17 01:54:46 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * init.c (build_new): Set TREE_NO_UNUSED_WARNING on COMPOUND_EXPRs
-       built for news of scalar types.
-
-Thu Feb 16 17:48:28 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (build_binary_op_nodefault): Update code for warning
-       about signed/unsigned comparisons from C frontend.  Realize that the
-       code in the C frontend is, if anything, even more bogus.  Fix it.
-       (build_binary_op): Undo default_conversion if it wasn't useful.
-
-       * typeck.c (build_unary_op, ADDR_EXPR): Lose bogus special case for
-       PRE*CREMENT_EXPR.
-
-       * decl2.c (import_export_vtable): Don't try the vtable hack
-       if the class doesn't have any real non-inline virtual functions.
-       (finish_vtable_vardecl): Don't bother trying to find a non-inline
-       virtual function in a non-polymorphic class.
-       (finish_prevtable_vardecl): Likewise.
-
-       * decl2.c (import_export_vtable): Use and set DECL_INTERFACE_KNOWN.
-
-       * cp-tree.h (DECL_INTERFACE_KNOWN): Use DECL_LANG_FLAG_5.
-
-       * init.c (expand_virtual_init): Always call assemble_external.
-
-       * class.c (build_vfn_ref): Always call assemble_external.
-       (build_vtable): Always call import_export_vtable.
-       (prepare_fresh_vtable): Likewise.
-       (add_virtual_function): Don't bother setting TREE_ADDRESSABLE.
-
-Thu Feb 16 03:28:49 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * class.c (finish_struct): Use TYPE_{MIN,MAX}_VALUE to determine
-       whether an enumerated type fits in a bitfield.
-
-Wed Feb 15 15:38:12 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * class.c (grow_method): Update method_vec after growing the class
-       obstack.
-
-Wed Feb 15 13:42:59 1995  Mike Stump  <mrs@cygnus.com>
-
-       * parse.y (handler_seq): Push a level for the catch parameters.
-
-Wed Feb 15 12:42:57 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * init.c (emit_base_init): Update BINFO_INHERITANCE_CHAIN on my
-       bases, in case they've been clobbered.
-
-Wed Feb 15 12:07:29 1995  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (finish_base_struct): Set up BINFO_INHERITANCE_CHAIN here,
-       so that one day it will always be valid.
-       * tree.c (propagate_binfo_offsets, layout_vbasetypes): Likewise.
-
-       * cp-tree.h (copy_binfo): Removed, unused.
-       * tree.c (copy_binfo): Likewise.
-
-Wed Feb 15 00:05:30 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * init.c (build_new): Save the allocation before calling
-       expand_vec_init on it.
-
-       * decl.c (finish_enum): The TYPE_PRECISION of the enum type mush
-       match the TYPE_PRECISION of the underlying type for constant folding
-       to work.
-
-Tue Feb 14 15:31:25 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (push_eh_entry, expand_start_all_catch,
-       expand_leftover_cleanups, expand_end_catch_block): Keep track of
-       the context in which the exception region occurs.
-       (build_exception_table): If the region was not output, don't output
-       the entry in the eh table for it.
-
-Tue Feb 14 02:15:43 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * init.c (expand_default_init): Only use a previous constructor call
-       if it's a call to our constructor.  Does the word "Duh" mean
-       anything to you?
-
-       * decl.c (grokparms): Fine, just don't call
-       convert_for_initialization at all.  OK?  Happy now?
-
-Mon Feb 13 02:23:44 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * cp-tree.h (CLASSTYPE_FIRST_CONVERSION): Make sure that the class
-       method vector has a second element before returning it.
-
-       * decl.c (grokparms): Don't strip REFERENCE_TYPE before calling
-       convert_for_initialization.
-
-Sun Feb 12 03:57:06 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (build_modify_expr): Compare function name to
-       constructor_name (current_class_type) instead of current_class_name.
-
-       * decl.c (grokparms): Don't do anything with the return value of
-       convert_for_initialization.
-
-       * error.c (dump_decl): Also dump_readonly_or_volatile on the decl.
-
-       * decl.c (duplicate_decls): Tweak error message.
-
-       * typeck.c (build_const_cast): Implement checking.
-       (build_reinterpret_cast): Implement some checking.
-
-       * cp-tree.h (CONV_FORCE_TEMP): Require a new temporary when
-       converting to the same aggregate type.
-       (CONV_STATIC_CAST): Include it.
-       (CONV_C_CAST): Likewise.
-       * cvt.c (convert_force): Use CONV_C_CAST instead of CONV_OLD_CONVERT.
-       (cp_convert): Only force a new temporary if CONV_FORCE_TEMP.
-
-Fri Feb 10 16:18:52 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (build_c_cast): Use non_lvalue to tack something on
-       where necessary.
-
-       * decl.c (auto_function): Now a function.
-       * except.c (init_exception_processing): terminate, unexpected,
-       set_terminate, and set_unexpected have C++ linkage.
-
-       * typeck.c (build_unary_op, TRUTH_NOT_EXPR): Use convert instead of
-       truthvalue_conversion for converting to bool, as it handles
-       user-defined conversions properly.
-       (condition_conversion): Likewise.
-
-       * except.c (expand_throw): Don't call convert_to_reference.
-       Pass the correct parameters to build_new.
-
-       * method.c (do_build_assign_ref): Don't use access control when
-       converting to a base reference here.
-       (do_build_copy_constructor): Or here.
-
-       * init.c (build_new): Unset TREE_READONLY on the dereferenced
-       pointer before assigning to it.
-
-       * decl.c (maybe_build_cleanup): Don't bother stripping const here.
-
-       * decl2.c (delete_sanity): You can now delete pointer to const.
-
-Fri Feb 10 13:28:38 1995  Jason Merrill  <jason@python.cygnus.com>
-
-       * decl.c (finish_function): Don't rely on actual parameters being
-       evaluated left-to-right.
-       * except.c (expand_end_catch_block): Likewise.
-
-Fri Feb 10 00:52:04 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * tree.c (real_lvalue_p): Like lvalue_p, but class temps aren't
-       considered lvalues.
-       * cvt.c (convert_to_reference): Use real_lvalue_p instead of
-       lvalue_p.
-
-       * cvt.c (build_type_conversion_1): Don't call convert on aggregate
-       types.
-       (convert_to_reference): Fix erroneous text substitution.
-
-       * typeck2.c (initializer_constant_valid_p): Update from C frontend.
-       Add new argument to all callers.
-
-       * typeck.c (convert_arguments): Check for error_mark_node before
-       trying to do anything with the actual parameter.
-
-       * typeck.c (condition_conversion): Build up a CLEANUP_POINT_EXPR and
-       fold it.
-       (bool_truthvalue_conversion): Remove.  Fix all callers to call
-       truthvalue_conversion instead.
-       (various): Fold CLEANUP_POINT_EXPRs.
-
-       * parse.y (conditions): Call condition_conversion rather than
-       building up a CLEANUP_POINT_EXPR.
-
-       * pt.c (end_template_decl): Don't warn_if_unknown_interface here
-       under -falt-external-templates.
-
-Thu Feb  9 05:24:10 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * init.c (build_new): Complain about new of const type without
-       initializer.  Other cleanup.
-
-       * call.c (compute_conversion_costs): Don't call
-       build_type_conversion with a reference type; convert to the target
-       type and check its lvaluetude.
-       * cvt.c (convert_to_reference): Likewise.
-
-       * cvt.c (build_type_conversion_1): There will never be any need to
-       dereference references here now.
-
-Thu Feb  9 00:37:47 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_builtin_throw): Make sure we only `use' the
-       value of return_val_rtx.
-
-Wed Feb  8 15:45:55 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * parse.y (structsp): Don't complain about declaring a type being
-       defined to be a friend.
-
-       * decl2.c (warn_if_unknown_interface): Note the template in question
-       and the point of instantiation, for -falt-external-templates.
-       * lex.c (reinit_parse_for_method): Pass the decl to
-       warn_if_unknown_interface.
-       * pt.c (instantiate_template): Likewise.
-       (end_template_decl): Likewise.
-
-       * decl.c (set_nested_typename): Set IDENTIFIER_TYPE_VALUE on the
-       nested name again, to make local classes work a bit better.
-
-       * typeck.c (build_function_call_real): Dereference reference after
-       checking for incomplete type.
-
-       * init.c (build_new): Accept new of const and volatile types.
-
-Wed Feb  8 14:04:16 1995  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grokdeclarator): Fix error message.
-
-Wed Feb  8 03:16:15 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (convert_for_initialization): Do bash arrays when
-       converting to a reference to non-array.
-
-Tue Feb  7 15:50:33 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * cvt.c (cp_convert): Don't call convert_to_reference, or
-       automatically dereference references.  Do pass reference conversions
-       to cp_convert_to_pointer.
-       (cp_convert_to_pointer): Support references.
-
-       * call.c (build_method_call): Don't build up a reference to the
-       parameter here; let build_overload_call handle that.
-
-       * typeck.c (build_c_cast): Call convert_to_reference directly if
-       converting to a reference type.
-       * method.c (do_build_copy_constructor): Likewise.
-       * method.c (do_build_copy_constructor): Likewise.
-       (do_build_assign_ref): Likewise.
-
-       * call.c (build_method_call): Dereference a returned reference.
-       * typeck.c (build_function_call_real): Likewise.
-
-       * decl.c (xref_basetypes): Check for unions with basetypes here.
-       (xref_tag): Instead of here.
-
-       * pt.c (process_template_parm): Template type parm decls are
-       artificial.
-
-Mon Feb  6 04:32:09 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * parse.y (typed_declspecs): Add missing semicolon.
-       (do_xref_defn): Resurrect.
-       (named_class_head_sans_basetype): Move template specialization
-       definition cases to named_class_head_sans_basetype_defn.
-
-       * decl2.c (grokfield): Call pushdecl_class_level after setting the
-       TYPE_NAME, not before.
-
-Sun Feb  5 02:50:45 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (convert_harshness): Don't call sorry here.  Don't allow
-       conversions between function pointer types if pedantic.
-
-       * pt.c (overload_template_name): Pass globalize=1 to xref_tag.
-
-       * lex.c (cons_up_default_function): Use the full name for the return
-       type of op=.
-
-       * decl.c (set_nested_typename): Don't worry about anonymous types,
-       as they already have a unique name.
-       (pushdecl): Remove redundant set_nested_typename
-       (xref_tag): Split out base handling into xref_basetypes.
-
-       * cp-tree.h (TYPE_INCOMPLETE): New macro; TEMPLATE_TYPE_PARMs are
-       not considered incomplete even though their definition is unknown.
-
-       * decl.c (xref_defn_tag): Lose.
-       (xref_tag): xref_next_defn = ! globalize.
-       (pushdecl): Don't set DECL_NESTED_TYPENAME on artificial decls.  The
-       ones that should have it set will have it set by pushtag.
-       (pushdecl_class_level): Likewise.
-       (pushtag): Tidy up a bit.
-       (set_nested_typename): Push a decl for the nested typename from
-       here, rather than from xref_defn_tag.
-
-       * parse.y (do_xref): Lose.
-       (named_class_head): If we see 'class foo:' we know it's a
-       definition, so don't worry about base lists for non-definitions.
-
-       * pt.c (push_template_decls): Template parm decls are artificial.
-
-       * decl.c (duplicate_decls): Restore check for qualifier
-       disagreement for non-functions.
-       (decls_match): Remove check for qualifier disagreement.
-
-Fri Feb  3 14:58:58 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (grok_reference_init): Convert initializer from
-       reference.
-       * typeck.c (convert_for_initialization): Likewise.
-
-       * decl.c (duplicate_decls): Propagate DECL_NESTED_TYPENAME.
-
-       * cvt.c (cp_convert): Don't convert to the same class type by just
-       tacking on a NOP_EXPR.
-       (convert_to_reference): Use comp_target_types instead of comptypes
-       so that we don't allow conversions two levels down.
-
-Thu Feb  2 15:07:58 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * class.c (build_vbase_path): Bash types to make the backend happy.
-       * cvt.c (build_up_reference): Bash the types bashed by
-       build_vbase_path to be reference types instead of pointer types.
-       (convert_to_reference): Likewise.
-
-       * typeck.c (build_c_cast): Don't strip NOPs if we're converting to a
-       reference type.
-
-       * parse.y (structsp): Put back error for 'struct B: public A;'.
-
-Wed Feb  1 23:02:06 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c: Add support for mips systems that don't define __mips
-       but do define mips, like Ultrix.
-
-Wed Feb  1 22:39:07 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c: Add support for exception handling on the Alpha.
-
-Wed Feb  1 10:12:14 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl2.c (finish_file): Fix bug in Jan 31st change.
-
-Tue Jan 31 16:59:15 1995  Gerald Baumgartner  <gb@lorenzo.cs.purdue.edu>
-
-       * sig.c (build_signature_pointer_or_reference_type): Don't set
-       IS_AGGR_TYPE for signature pointers/reference so expand_default_init
-       doesn't expect to find a copy constructor.
-       * call.c (build_method_call): Treat signature pointers/reference
-       as if IS_AGGR_TYPE were set.
-
-Tue Jan 31 13:28:56 1995  Mike Stump  <mrs@cygnus.com>
-
-       * gc.c (get_typeid): Pawn off error messages to build_t_desc.
-       (build_t_desc): Inform the user here if they try and build
-       with -frtti and don't include <typeinfo.h>.
-
-       * decl2.c (finish_prevtable_vardecl): Support rescanning.
-       (finish_file): Move finish_prevtable_vardecl up to before the global
-       initializers are done as tdecls are initialized in the global
-       initializer.  Also Pick up any new tdecls or vtables needed by
-       synthesized methods.
-
-       * class.c (finish_struct): Simplify.  We have to do rtti scanning at
-       end, so we might as well do all of it there.
-
-Tue Jan 31 05:35:02 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (build_method_call): Fix -fthis-is-variable for 32-bit
-       targets, too.
-
-Tue Jan 31 00:11:04 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl2.c (finish_prevtable_vardecl): New routine, mostly split from
-       finish_vtable_vardecl.  It has the first half functionality from
-       that routine.
-       * decl2.c (finish_vtable_vardecl): Update to not include stuff not
-       in  finish_prevtable_vardecl.
-       * decl2.c (finish_file): Call finish_prevtable_vardecl.
-       * gc.c (build_generic_desc): Allow it to be called when not at the
-       global binding layer, but behave as if we were.
-       (build_t_desc): Rearrange a bit so that it really works and is
-       easier to follow.
-       * class.c (finish_struct): Don't decide on tdecls here, as we have
-       to wait until the end of the file in general to decide whether or
-       not they come out.
-
-Mon Jan 30 01:00:40 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * init.c (build_delete): Check access to operator delete before
-       calling the destructor.
-       * method.c (build_opfncall, DELETE_EXPR): build_method is allowed to
-       return error_mark_node.
-       * call.c (build_method_call): Use the one-argument op delete even if
-       it's an error.
-
-       * init.c (build_new): Fix -fthis-is-variable support.
-       * call.c (build_method_call): Likewise.
-
-       * call.c (convert_harshness): Make conversion from a pointer to bool
-       worse than conversion to another pointer.
-
-Sat Jan 28 16:46:10 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * init.c (build_new): Check new return value if -fcheck-new.
-
-       * lex.c (check_newline): Clear end_of_file when we're done, too.
-
-Sat Jan 28 10:38:39 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl2.c (finish_vtable_vardecl): Make rtti TD tables follow
-       vtables whereever they go.
-
-       * gc.c (build_t_desc): Remove old way of setting it up, as it wasn't
-       right.
-
-Sat Jan 28 09:10:44 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl2.c (finish_vtable_vardecl): Now set the
-       interface/implementation of vtables on the first virtual function,
-       if one exists, otherwise we use the old method.  This is a major win
-       in terms of cutting down the size of objects and executables in
-       terms of text space and data space.  Now most of the savings that
-       #pragma interface/implementation gives is automatic in a fair number
-       of cases.
-
-Sat Jan 28 04:57:33 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (grokdeclarator): Discard the template parameters in a
-       template constructor declaration so that the function is always
-       named constructor_name (ctype).
-
-       * lex.c (check_newline): Use ungetc to put back the character before
-       calling HANDLE_PRAGMA.
-
-Fri Jan 27 17:23:47 1995  Mike Stump  <mrs@cygnus.com>
-
-       * decl2.c (check_classfn): If the cname is T<int> and fn_name is T,
-       make sure we still match them.
-
-Fri Jan 27 16:32:10 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * parse.y: Add END_OF_LINE token.
-
-       * lex.c (check_newline): Set linemode when we see a # directive, and
-       unset it when we're done.  Turn all 'return's into 'goto skipline'.
-       Fix all uses of '\n', since we won't see it anymore.  Put back the
-       character we read before checking for a sysv or target pragma.
-       (real_yylex): If we see an EOF in linemode, return END_OF_LINE.
-       (handle_sysv_pragma): Don't look at the input stream; quit when we
-       see an END_OF_LINE token.
-
-       * input.c (getch): Return EOF if we're in line mode and at the end
-       of a line.
-       (put_back): Don't put back an EOF.
-
-Thu Jan 26 19:26:34 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_throw): Do the newing of the exception object
-       before we load the type descriptor or the address so that we don't
-       wipe any of the values out.
-
-Thu Jan 26 19:20:00 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (init_exception_processing): Don't use r12 on the rs6000.
-
-Tue Jan 24 16:36:31 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (grokparms): Don't try to build up a reference at this point.
-
-       * typeck2.c (build_functional_cast): Don't assume that a NOP_EXPR
-       will suffice to convert from integer_zero_node.
-
-Wed Jan 25 15:02:09 1995  David S. Miller  <davem@nadzieja.rutgers.edu>
-
-       * class.c (instantiate_type): Change error message text.
-       * typeck2.c (store_init_value): Likewise.
-
-Mon Jan 23 21:57:14 1995  Mike Stump  <mrs@cygnus.com>
-
-       * pt.c (tsubst): When we copy a node, don't forget to copy
-       TREE_CHAIN, we use it later.
-
-Mon Jan 23 03:33:47 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (convert_for_assignment): Initialize variable before use.
-
-Fri Jan 20 01:17:59 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * g++.c (main): Link with both libstdc++ and libg++ if called as
-       something ending with "g++", otherwise only libstdc++.  Move -lm to
-       the end of the line.
-
-Thu Jan 19 15:43:11 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (build_method_call): Don't mess with 'this' before calling
-       compute_conversion_costs.
-
-Wed Jan 18 15:40:55 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * search.c (get_matching_virtual): Give line number for previous
-       declaration.
-
-       * call.c (convert_harshness): Handle conversions to references
-       better.
-
-       * cvt.c (build_up_reference): OK, handle {MIN,MAX}_EXPR *properly*.
-
-Wed Jan 18 15:21:38 1995  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (instantiate_type): Use DECL_CHAIN to walk lists instead,
-       as the TREE_CHAIN for methods will take us to the next differently
-       named function, DECL_CHAIN won't.
-
-Wed Jan 18 14:26:59 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * tree.c (lvalue_p): Handle {MIN,MAX}_EXPR.
-
-       * decl2.c (lang_decode_option): -Wall implies -Wparentheses.
-       warn_parentheses defaults to 0.
-
-       * decl.c (grokparms): Put back call to require_instantiated_type.
-
-Tue Jan 17 19:56:15 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (exception_section): Use the data section on the rs6000.
-       Change calling convention for named_section.
-
-Wed Jan 17 18:20:57 1994  Fergus Henderson <fjh@munta.cs.mu.oz.au>
-
-       * cp-tree.h : Make if (x=0) warn with wall
-       * parse.y : Make if (x=0) warn with wall
-
-Tue Jan 17 14:12:00 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (BOOL_TYPE_SIZE): BITS_PER_WORD if SLOW_BYTE_ACCESS,
-       BITS_PER_UNIT otherwise.
-
-       * search.c (get_matching_virtual): Don't check the binfo if the
-       types are the same.
-
-       * cvt.c (cp_convert): Just call truthvalue_conversion to convert to
-       bool.
-
-Mon Jan 16 13:28:48 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * various: Use boolean_type_node, boolean_true_node,
-       boolean_false_node.
-
-       * search.c (get_matching_virtual): Allow covariant returns that
-       don't require pointer adjustment.
-
-       * typeck.c (build_conditional_expr): Don't call default_conversion
-       on ifexp.
-
-       * cvt.c (build_up_reference): Handle MIN_EXPR and MAX_EXPR.
-
-       * decl.c (grokdeclarator): Upgrade warning about &const to pedwarn.
-
-Sun Jan 15 22:17:32 1995  David Binderman  <dcb@lovat.fmrco.COM>
-
-       * pt.c (do_function_instantiation): Free targs once we're done.
-
-Sun Jan 15 22:17:32 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (BOOL_TYPE_SIZE): Defaults to BITS_PER_WORD.
-       (init_decl_processing): Use BOOL_TYPE_SIZE instead of CHAR_TYPE_SIZE
-       for bool.
-
-Sat Jan 14 05:33:55 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl2.c (finish_file): We need to mess up if there are any
-       variables in the list, not just if there is one with a constructor.
-
-Fri Jan 13 14:42:55 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (duplicate_decls): Propagate DECL_STATIC_{CON,DE}STRUCTOR.
-       (finish_function): Handle DECL_STATIC_{CON,DE}STRUCTOR.
-       (finish_function): Trust rest_of_compilation.
-
-       * decl2.c (finish_file): Also call functions designated as static
-       constructors/destructors.
-
-       * decl.c (grokdeclarator): Allow access decls of operator functions.
-       (grokparms): Only do convert_for_initialization if the initializer
-       has a type.
-       (duplicate_decls): Put back push_obstacks_nochange call.
-
-       * lex.c (real_yylex): Downgrade complaint about the escape sequence
-       being too large from pedwarn to warning.
-
-       * decl.c (grokdeclarator): Don't complain about long long in system
-       headers.
-
-       * lex.c (real_yylex): Handle digraphs.
-
-Thu Jan 12 12:17:24 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (init_decl_processing): -f{no-,}strict-prototype only
-       affects C linkage declarations now.
-
-       * typeck.c (comp_target_types): Grok simple contravariant conversions.
-       (common_type): t1 and t2 are interchangeable.
-
-       * various: Test return value of comp_target_types differently in
-       different places; it now returns -1 for a contravariant conversion
-       (which is fine in symmetric cases).
-
-       (common_type): Prefer long double to double even when
-       they have the same precision.
-
-       * decl.c (grokparms): Call convert_for_initialization to check
-       default arguments.
-
-       * init.c (build_new): void_type_node has a size (of 0).
-
-       * decl.c (decls_match): Also check for agreement of TREE_READONLY
-       and TREE_THIS_VOLATILE.
-       (push_class_level_binding): Properly handle shadowing of
-       nested tags by fields.
-
-       * search.c (dfs_pushdecls): Likewise.
-
-       * decl2.c (finish_file): Don't second-guess self-initialization.
-
-       * cvt.c (convert_to_reference): Work with expr directly, rather than
-       a copy.
-
-       * decl.c (push_overloaded_decl): Only shadow artificial TYPE_DECLs.
-
-       * init.c (add_friend): Downgrade duplicate friend message from
-       pedwarn to warning.
-
-       * decl.c (duplicate_decls): Push obstacks before calling common_type.
-
-Thu Jan 12 17:15:21 1995  Michael Ben-Gershon  <mybg@cs.huji.ac.il>
-
-       * except.c (push_eh_entry): set LABEL_PRESERVE_P flag for
-       exception table labels.
-       (expand_start_all_catch): Likewise.
-       (expand_leftover_cleanups): Likewise.
-       (expand_end_catch_block): Likewise.
-       * except.c (make_first_label): new function.
-       (expand_start_all_catch): add a call to make_first_label() before
-       using a label as a jump destination.
-       (expand_end_all_catch): Likewise.
-       (expand_leftover_cleanups): Likewise.
-       (expand_end_catch_block): Likewise.
-       (expand_builtin_throw): Likewise.
-       (expand_throw): Likewise.
-       * except.c: Add ARM processor support for exception handling.
-
-Thu Jan 12 12:17:24 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       (complete_array_type): Copy code from C frontend.
-
-       * lex.c (real_yylex): Don't multiply the length of a wide string
-       literal by WCHAR_BYTES.
-
-       * decl.c (pushdecl): Check for redeclaration of wchar_t here.
-       (duplicate_decls): Instead of here.
-       (define_label): Complain about a label named wchar_t.
-       (grokdeclarator): Complain about declarations of
-       operator-function-ids as non-functions.
-
-       * typeck.c (unary_complex_lvalue): Also wrap prefix -- and ++ in
-       COMPOUND_EXPRs.
-       (build_unary_op): Wrap unary plus in a NON_LVALUE_EXPR.
-
-       * lex.c (real_yylex): Don't skip whitespace when reading the next
-       character after ->.
-
-Wed Jan 11 16:32:49 1995  Mike Stump  <mrs@cygnus.com>
-
-       * except.c: Allow cc1plus to be built with native compiler on rs6000.
-       (expand_start_all_catch): Add assemble_external calls for various
-       routines we call.
-       (expand_leftover_cleanups): Likewise.
-       (expand_start_catch_block): Likewise.
-       (do_unwind): Likewise.
-       (expand_builtin_throw): Likewise.
-
-Wed Jan 11 01:05:42 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (pushtag): Only look for a previous decl in the current
-       binding level.  Use explicit global scope in DECL_NESTED_TYPENAME.
-
-       * gxx.gperf: Add __signature__ and __sigof__ keywords.
-
-       * decl2.c (lang_decode_option): -ansi does not set flag_no_asm.  It
-       does set flag_no_gnu_keywords and flag_operator_names.
-
-       * lex.c (init_lex): 'overload' is not a keyword unless -traditional.
-       Unset extension keywords if -fno-gnu-keywords.
-       Allow operator names ('bitand') if -foperator-names.
-       Never unset 'asm'; -fno-asm only affects 'typeof'.
-
-       * decl.c (lookup_name_real): The got_object special lookup only
-       applies to types.
-
-Tue Jan 10 18:07:51 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * spew.c (yylex): Also use DECL_NESTED_TYPENAME if got_object is set.
-
-       * parse.y (primary): Unset got_object after all rules that use the
-       'object' nonterminal.
-       (object): Set got_object.
-
-       * lex.h: Declare got_object.
-
-       * decl.c (lookup_name_real): Also lookup names in the context of an
-       object specified.
-
-Tue Jan 10 14:30:30 1995  Mike Stump  <mrs@cygnus.com>
-
-       * typeck.c (get_member_function_from_ptrfunc): Use ptrdiff_type_node
-       for things that have to be added to pointers, not size_type.  Cures
-       problems with pointer to members on Alphas.
-       (build_binary_op_nodefault): Likewise.
-       (get_delta_difference_: Likewise.
-       (build_ptrmemfunc): Likewise.
-
-Tue Jan 10 01:49:25 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (pushtag): Stick the new decl in TYPE_NAME before pushing
-       it.
-
-       * typeck.c (build_component_ref): Don't build up a COMPONENT_REF
-       when dealing with overloaded member functions; just act like
-       build_offset_ref.
-       (commonparms): Remove misleading comment.
-
-       * decl.c (duplicate_decls): Complain about repeated default
-       arguments here.
-       (redeclaration_error_message): Instead of here.
-       (pushdecl): Complain about missing default arguments here.
-       (grokparms): Instead of here.
-       (lookup_name_current_level): Also match on DECL_ASSEMBLER_NAME.
-       (grok_reference_init): Do not complain about missing initializer if
-       declared 'extern'.
-
-       * search.c (lookup_field): Don't return a TYPE_DECL if there is a
-       function alternative and want_type is not set.
-
-Mon Jan  9 18:16:23 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (pushtag): Don't set TYPE_NAME to an identifier.  Do push
-       the decl when the type has no TYPE_NAME.
-       (lookup_nested_type): Don't assume that type has TYPE_NAME set.
-       (lookup_name_real): Call lookup_field with want_type =
-       prefer_type.
-
-       * search.c (lookup_field): Handle want_type properly in the presence
-       of fields with the same name.
-
-       * decl.c (set_nested_typename): Set nested name for file-scope types
-       to include leading ::.
-       (pushdecl): Set the nested typename if the decl doesn't have one,
-       rather than if the type's canonical decl doesn't have one.
-
-Mon Jan  9 03:44:33 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (convert_for_assignment): Complain about contravariance
-       violation here.
-       (comp_target_types): Instead of here.
-       (build_unary_op): resolve_offset_ref before checking for a valid
-       type.
-
-       * spew.c (yylex): Decrement looking_for_typename after we see a
-       _DEFN.
-
-       * decl.c (pushdecl): Don't install an artificial TYPE_DECL in
-       IDENTIFIER_LOCAL_VALUE if we already have a decl with that name.
-
-       * typeck.c (convert_for_assignment): Converting pointers to bool
-       does not need a cast.
-
-Sun Jan  8 18:16:45 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * class.c (instantiate_type): Initialize nsubsts parm.
-
-       * pt.c (do_function_instantiation): Likewise.
-
-Sat Jan  7 14:37:05 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * pt.c (tsubst): Use TREE_STATIC instead of DECL_INLINE &&
-       DECL_SAVED_INSNS to determine whether or not we've seen a definition
-       of this function.
-       (instantiate_template): Likewise.
-
-       * call.c (convert_harshness): Allow const reference binding when
-       called from the overloading code, but not when called from
-       can_convert (since it isn't a conversion).
-       (convert_harshness): Put back some disabled code.
-
-Fri Jan  6 14:10:57 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (convert_harshness): There is no implicit conversion from
-       void* to other pointer types (unless the parameter is (void*)0).
-       (convert_harshness): Non-lvalues do not convert to reference types.
-
-       * class.c (finish_struct_methods): Still set
-       TYPE_HAS_{INT,REAL}_CONVERSION.
-
-       * call.c (can_convert): Don't use aggregate initialization.
-
-       * cp-tree.h: Declare lookup_conversions.
-
-Thu Jan  5 21:08:00 1995  Mike Stump  <mrs@cygnus.com>
-
-       * parse.y (simple_stmt): Fix duplicate case value error messages to
-       be more readable.
-
-Wed Jan  4 16:44:19 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * cvt.c (build_type_conversion): Total rewrite to use
-       convert_harshness instead of reproducing conversion logic here.  Now
-       much shorter.
-
-       * call.c (convert_harshness): Support conversions to bool.
-       (can_convert): Checks whether a conversion is less harsh
-       than USER_CODE, for build_type_conversion.
-
-       * search.c (add_conversions): Function for passing to dfs_walk which
-       adds all the type conversion operators in the current type to a list.
-       (lookup_conversions): Calls dfs_walk with add_conversions and return
-       the list.
-       (dfs_walk): Don't require a qfn.
-
-       * cp-tree.h: Lose CLASSTYPE_CONVERSIONS hackery.
-       (CLASSTYPE_FIRST_CONVERSION): Points to elt 1 of CLASSTYPE_METHOD_VEC.
-
-       * class.c (finish_struct_bits): Lose CLASSTYPE_CONVERSIONS hackery.
-       (grow_method): A separate function for building onto the growing
-       method vector.
-       (finish_struct_methods): Use it.  Put all type conversion operators
-       right after the constructors.  Perhaps we should sort the methods
-       alphabetically?
-
-Mon Jan  2 14:42:58 1995  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (build_method_call): Lose another misleading shortcut.
-
-Fri Dec 30 17:57:30 1994  Mike Stump  <mrs@cygnus.com>
-
-       * gc.c (build_bltn_desc): Handle bool as a built-in type.
-
-Fri Dec 30 14:20:21 1994  Mike Stump  <mrs@cygnus.com>
-
-       * tree.c (layout_vbasetypes): Ensure that we don't loose alignment
-       on the complete type because of small virtual bases.
-
-Fri Dec 30 12:22:29 1994  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (n_incomplete): Bump n_incomplete up to int to match C
-       front end.
-       (pushdecl): Also count decls pushed that are of a type being defined
-       as incomplete things.
-       * class.c (finish_struct): Move hack_incomplete_structures up to
-       just after we set it as not being defined, so that the decls we
-       build for RTTI don't count as incomplete.
-
-Thu Dec 29 18:20:57 1994  Mike Stump  <mrs@cygnus.com>
-
-       * pt.c (tsubst): Fix problem with defining constructors in templated
-       classes with virtual bases.
-
-Wed Dec 28 08:31:00 1994  Mike Stump  <mrs@cygnus.com>
-
-       * parse.y (TYPEID): Strip top-level cv-qualifiers on typeid
-       expressions.
-       * gc.c (build_typeid): Likewise.
-
-Thu Dec 22 17:26:33 1994  Mike Stump  <mrs@cygnus.com>
-
-       * cvt.c (build_up_reference): Fix breakage introduced on Nov 29,
-       don't assert on complex AGGR inits.
-
-Thu Dec 22 14:32:31 1994  Mike Stump  <mrs@cygnus.com>
-
-       * method.c (build_overload_value): Handle pointer to members as
-       template arguments.
-
-Thu Dec 22 13:09:07 1994  Mike Stump  <mrs@cygnus.com>
-
-       * typeck.c (unary_complex_lvalue): Don't call sorry if we know how
-       to do take the address of a data member for a pointer to data
-       member.
-
-Thu Dec 22 10:04:19 1994  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (grokdeclarator): Use the typedef name for linkage if the
-       type doesn't otherwise have a name.
-
-       * decl2.c (grokfield): Likewise.
-
-       * class.c (finish_struct): Since we reuse the TYPE_DECL for the
-       DECL_NAME of enums, structs and classes, we have to avoid trying to
-       put it in the TYPE_FIELDS again.
-
-Wed Dec 21 11:07:05 1994  Mike Stump  <mrs@cygnus.com>
-
-       * decl2.c (check_classfn): Ignore this parameter on static functions
-       when checking to see if we match.
-
-Tue Dec 20 17:47:02 1994  Mike Stump  <mrs@cygnus.com>
-
-       * typeck.c (unary_complex_lvalue): Handle address of non-left most
-       pointers to members by calling get_delta_difference.
-
-Mon Dec 19 22:40:53 1994  Mike Stump  <mrs@cygnus.com>
-
-       * decl2.c (check_classfn): Don't use decls_match yet, as it modifies
-       static functions to early.
-
-Thu Dec 19 22:37:48 1994  Mike Stump  <mrs@cygnus.com>
-
-       * method.c (make_thunk): Handle encoding of positive thunk offsets.
-
-Sat Dec 17 13:29:50 1994  Doug Evans  <dje@canuck.cygnus.com>
-
-       * Make-lang.in (.PHONY): Tell GNU make C++ and c++ are phony targets.
-
-Thu Dec 15 16:32:12 1994  Mike Stump  <mrs@cygnus.com>
-
-       * decl2.c (check_classfn): Use decls_match to check if this has
-       already been declared, as the DECL_ASSEMBLER_NAME may have been
-       changed via asm("new_name").
-       * decl.c (decls_match): Make public.
-
-Thu Dec 15 15:17:55 1994  Mike Stump  <mrs@cygnus.com>
-
-       * *.[chy] (expand_aggr_init) Add fourth argument to handle
-       distinction between = init and (init) style of initializations.
-       * *.[chy] (finish_decl): Add fifth argument to to handle
-       distinction between = init and (init) style of initializations.
-
-Tue Dec 13 19:16:05 1994  Mike Stump  <mrs@cygnus.com>
-
-       Fix some random `explicit' bugs.
-
-       * cvt.c (convert_to_reference): Add third parameter to
-       convert_force.
-       (convert_force): Likewise.
-       * call.c (build_method_call): Likewise.
-       * decl2.c (setup_vtbl_ptr): Likewise.
-       * init.c (expand_virtual_init): Likewise.
-       (build_member_call): Likewise.
-       (build_delete): Likewise.
-       (build_vbase_delete): Likewise.
-       * typeck.c (build_component_addr): Likewise.
-       (build_c_cast): Likewise.
-       (build_modify_expr): Likewise.
-       * cp-tree.h (CONV_NONCONVERTING): Likewise. Add so that we can
-       distinguish the context in which the conversion appears.  Add thrid
-       argument to build_c_cast.
-       * cvt.c (cp_convert): Pass whether or not we want to consider
-       non-converting constructors down to build_method_call.
-       * decl2.c (reparse_absdcl_as_casts): Add third argument to
-       build_c_cast.
-       * gc.c (build_m_desc): Likewise.
-       * init.c (build_new): Likewise.
-       * parse.y (expr_no_commas): Likewise.
-       (primary): Likewise.
-       * typeck.c (build_x_function_call): Likewise.
-       (build_static_cast): Likewise.
-       (build_reinterpret_cast): Likewise.
-       (build_const_cast): Likewise.
-       (build_c_cast): Likewise.
-       (build_ptrmemfunc): Likewise.
-       * typeck2.c (build_functional_cast): Likewise.
-       * init.c (expand_aggr_init): Added LOOKUP_ONLYCONVERTING to
-       expand_aggr_init_1 as inits are converted to the destination type.
-
-Tue Dec 13 16:18:57 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * Make-lang.in (cc1plus): Depends on c-pragma.o.
-
-       * Makefile.in (OBJ{DEP,}S): Add ../c-pragma.o.
-
-       * lex.c (check_newline): If the #pragma is not recognized by g++,
-       try machine-specific ones too.
-       (handle_sysv_pragma): Copied from c-lex.c.
-
-Mon Dec 12 23:53:06 1994  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_throw): Fix Dec 6th change, build_new likes a
-       reference better.
-
-Mon Dec 12 18:01:00 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (build_binary_op): Lose checks on TYPE_PTRMEMFUNC_P with
-       IS_AGGR_TYPE, since now they will not both be set on the same type.
-
-       * pt.c (do_pending_expansions): Don't clear TREE_PUBLIC on
-       instantiations controlled by -fexternal-templates.
-
-       * decl.c (duplicate_decls): Don't complain about different values of
-       __attribute__ ((const)) and ((noreturn)).
-
-Fri Dec  9 18:17:37 1994  Doug Evans  <dje@cygnus.com>
-
-       * Makefile.in (BISONFLAGS): Delete --yacc.
-       (PARSE_H): Depend on $(PARSE_C), for parallel makes.
-       (PARSE_C): Undo last patch.
-
-Fri Dec  2 10:44:36 1994  Mike Stump  <mrs@cygnus.com>
-
-       * Makefile.in (BISONFLAGS): Add --yacc so that output winds up in
-       y.tab.c.
-
-Thu Dec  8 17:39:46 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (finish_decl): Don't call obscure_complex_init for decls
-       of indeterminate size.
-
-Wed Dec  7 16:49:22 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (obscure_complex_init): Function to tweak the decl to
-       prevent expand_decl from tring to initialize it.
-       (finish_decl): Use it rather than writing the same code in three
-       different places.
-
-       * parse.y (bad_parm): Stop trying to support parms without types.
-
-Wed Dec  7 12:06:56 1994  Mike Stump  <mrs@cygnus.com>
-
-       * decl2.c (grokfield): Make asm specs on static member functions
-       work.
-
-Tue Dec  6 15:43:20 1994  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_throw): Make a copy of the thrown object.
-
-Tue Dec  6 14:16:34 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * parse.y: : has lower precedence than =.
-
-Tue Dec  6 12:46:17 1994  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (pushdecl): Use DECL_NAME of VAR_DECLs to avoid namespace
-       manglings.
-       (grokvardecl): Add namespace into variable name.
-
-Tue Dec  6 11:26:55 1994  Mike Stump  <mrs@cygnus.com>
-
-       * decl2.c (current_namespace_id): New routine to transform a simple
-       name into a name in a namespace.
-       * decl.c (grokdeclarator): Use it.
-       * decl2.c (get_namespace_id): Find the name of the current
-       namespace.
-       (push_namespace, pop_namespace): Complete out missing
-       functionality.
-
-Mon Dec  5 17:11:51 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * class.c (finish_struct): Don't use LONG_LONG_TYPE_SIZE, as it may
-       not be defined.  Fix warning message for enums and restore warning
-       for non-enums.
-
-       * decl2.c (push_namespace): Dummy function.
-       (pop_namespace): Likewise.
-       (do_namespace_alias): Likewise.
-       (do_using_decl): Likewise.
-       (do_using_directive): Likewise.
-
-       * parse.y: New token NSNAME for namespace names.
-       (extdef): Add namespace, using definitions.
-       (using_decl): New rule for using declarations.
-       (any_id): New rule for identifiers with any degree of scoping.
-       (identifier): Add NSNAME.
-       (notype_identifier): Likewise.
-       (component_decl): Add using_decl.
-       (nested_name_specifier): Add NSNAME SCOPE.
-
-       * typeck.c (convert_for_assignment): Handle conversions between
-       enums and bool.
-
-       * decl.c (duplicate_decls): Only propagate DECL_MAIN_VARIANT on
-       FUNCTION_DECLs.
-
-Mon Dec  5 13:03:16 1994  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (finish_struct): Give an error if one tries to declare a
-       bit-field's size greater than a long long, as the backend will dump.
-       It is not an error to declare an enum bit-field greater than its
-       precision.  Warn if an enum bit-field is too small to hold all
-       its values.
-
-Mon Dec  5 11:41:50 1994  Mike Stump  <mrs@cygnus.com>
-
-       * typeck.c (convert_for_assignment): Use cp_convert instead of
-       convert so that we don't get static casts.
-
-Sun Dec  4 11:59:01 1994  Mike Stump  <mrs@cygnus.com>
-
-       * cvt.c (cp_convert): Don't complain about int->enum conversion if
-       we are doing static casts.
-
-Fri Dec  2 18:32:41 1994  Mike Stump  <mrs@cygnus.com>
-
-       * error.c (dump_expr): Do something more intelligent with SAVE_EXPRs
-       when dumping expressions in error messages.
-
-Fri Dec  2 17:04:27 1994  Mike Stump  <mrs@cygnus.com>
-
-       * gc.c (build_dynamic_cast): Change interface to libg++, ensure that
-       the return type is the right type, and make references work.
-
-Fri Dec  2 16:36:43 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (poplevel): Don't be confused by function-scope
-       declarations of non-nested functions.
-       (duplicate_decls): Propagate DECL_MAIN_VARIANT.
-       (pushdecl): Use duplicate_decls to copy info from old decl into new
-       function-scope one rather than doing it here.
-
-       * decl2.c (mark_inline_for_output): Deal with the DECL_MAIN_VARIANT
-       of this decl, in case this is a function-scope declaration.
-
-       * decl.c (finish_enum): Make sure that the type has the right
-       precision when we call fixup_*_type.
-
-Tue Nov 29 19:12:07 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * cvt.c (build_up_reference): Strip superfluous NOP_EXPRs; we do
-       want to build up references to rvalues if possible.
-       (cp_convert): Stick on a NOP_EXPR when converting to the same type.
-
-Tue Nov 29 11:28:59 1994  Mike Stump  <mrs@cygnus.com>
-
-       * parse.y (maybe_raises): Handle throw ().
-       * parse.y (ansi_raise_identifier): grok type-ids in exception
-       specifications.
-       * tree.c (build_exception_variant): Use list compare to check if
-       two exception specifications match.
-       * decl.c (duplicate_decls, bad_specifiers): Enhance wording on error
-       messages.
-       * call.c (build_method_call): Remove TREE_RAISES.
-       * cvt.c (convert_to_aggr): Likewise.
-       * typeck.c (build_function_call_real, convert_arguments): Likewise.
-       * init.c (expand_aggr_init_1): Likewise.
-
-Tue Nov 29 09:50:39 1994  Mike Stump  <mrs@cygnus.com>
-
-       * except.c: Add support for m68k and mips exception handling
-       support.
-
-Tue Nov 29 08:48:33 1994  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_end_all_catch): Throw into outer context, if we
-       fall off end of catch handlers.
-
-Mon Nov 28 16:44:41 1994  Mike Stump  <mrs@cygnus.com>
-
-       * Makefile.in: Make is easier to decide where parse.[ch] will be
-       built.
-
-Thu Nov 17 20:11:24 1994  Doug Evans  <dje@cygnus.com>
-
-       * cp/Make-lang.in (CXX_INSTALL_NAME) Use program_transform_name.
-       (GXX_INSTALL_NAME) Likewise.
-       (CXX_CROSS_NAME) Use program_transform_cross_name.
-       (GXX_CROSS_NAME) Likewise.
-       (c++.install-man): Use program_transform_name on g++.1.
-       (c++.uninstall): Likewise.
-
-Mon Nov 28 13:53:03 1994  Mike Stump  <mrs@cygnus.com>
-
-       * parse.y (THROW): Fix precedence of throw expressions.
-
-Mon Nov 28 13:15:16 1994  Mike Stump  <mrs@cygnus.com>
-
-       * typeck.c (build_unary_op): Allow promotions from bool to int on
-       unary ~.
-
-Sun Nov 27 00:16:21 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * method.c (build_overload_name): Use DECL_ASSEMBLER_NAME for
-       classes when appropriate.
-       (build_overload_nested_name): When dealing with a function context,
-       use ASM_FORMAT_PRIVATE_NAME to tweak the name of the function to
-       avoid conflicts between local classes of the same name.
-
-Wed Nov 23 17:59:42 1994  Mike Stump  <mrs@cygnus.com>
-
-       * gxx.gperf, parse.y, lex.h, hash.h, lex.c (init_lex), delc.c
-       (duplicate_decls, grokdeclarator), cp-tree.h: Add support for
-       `explicit'.
-       * cvt.c (convert_to_reference, cp_convert, build_type_conversion_1,
-       build_type_conversion): Use LOOKUP_ONLYCONVERTING in
-       build_method_calls so that non-converting constructors are not used.
-       * call.c (build_method_call): If we shouldn't use a non-converting
-       constructor, then don't.
-
-Wed Nov 23 14:46:56 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (build_method_call): Don't try to synthesize methods yet.
-
-Tue Nov 22 12:45:21 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * pt.c (push_template_decls): Create CONST_DECLs for template
-       constant parameters, not VAR_DECLs.
-
-Sat Nov 19 15:28:31 1994  Jim Wilson  <wilson@chestnut.cygnus.com>
-
-       * typeck.c (build_binary_op_nodefault): Can shorten shift only if
-       shift count is less than size in bits of arg0.
-
-Thu Nov 17 15:30:50 1994  Mike Stump  <mrs@cygnus.com>
-
-       * gxx.gperf, hash.h, lex.c (init_lex, real_yylex), parse.y: Add new
-       ANSI keywords and, and_eq, bitand, bitor, explicit, namespace, not,
-       not_eq, or, or_eq, typename, using, xor, xor_eq to g++.  Still need
-       to add support for explicit, namespace, typename, and using, support
-       for the rest is already in.
-
-Fri Nov  4 19:04:18 1994  Mike Stump  <mrs@cygnus.com>
-
-       * gc.c (get_bad_cast_node): New routine to support compile time
-       throws of bad_cast.
-       * gc.c (build_dynamic_cast): Support throwing of bad_cast at compile
-       time.
-
-Fri Nov  4 11:12:00 1994  Mike Stump  <mrs@cygnus.com>
-
-       * except.c: Add hppa support.
-
-Fri Nov  4 10:50:50 1994  Mike Stump  <mrs@cygnus.com>
-
-       * except.c: Add rs6000 support.
-
-Thu Nov  3 14:24:23 1994  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (do_unwind): Add i[34]86 support.
-
-Thu Nov  3 00:10:46 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * pt.c (do_pending_expansions): Unset TREE_PUBLIC on implicit
-       instantiations.
-
-Wed Nov  2 15:08:24 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * decl.c (finish_function): Emit types used in method parameters
-       into symbol table.
-
-Wed Nov  2 15:05:47 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * pt.c (process_template_parm): Allow pointer to member function
-       template parameter types.
-       (uses_template_parms): Handle pointer to member function
-       CONSTRUCTORs.
-
-       * g++.c (main): Cast first argument of bzero to (char *).
-       Pass -lstdc++ instead of -lg++ unless we are invoked as 'g++'.
-
-Mon Oct 31 14:50:48 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * gc.c (build_dynamic_cast): rewrite to make it work.
-       * class.c (finish_vtbls): build more vtables if flag_rtti is on.
-       * class.c (modify_all_direct_vtables): ditto.
-       * init.c (expand_direct_vtbls_init): expand more vtables if
-       flag_rtti is on.
-       * decl.c (init_type_desc): add default return.
-
-Tue Oct 25 17:13:09 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * tree.c (debug_binfo): get rid of the initial size entry of
-       vtable.
-       * cp-tree.h: change flag_dossier to flag rtti, define type
-       descriptor type nodes.
-       * decl.c (init_type_desc): new function to initialize type
-       descriptor type nodes.
-       * decl.c (record_builtin_type): change flag_dossier to flag_rtti.
-       * lex.c (init_lex): ditto.
-       * decl.c : change variable flag_dossier to flag_rtti.
-       * decl.c (duplicate_decls): get rid initial size entry of vtable.
-       * decl.c (hack_incomplete_structures): take out assert 164.
-       * search.c (get_abstract_virtuals_1): ditto.
-       * search.c (dfs_init_vbase_pointers): change CLASSTYPE_DOSSIER to
-       CLASSTYPE_RTTI.
-       * parse.y: ditto.
-       * class.c (prepare_fresh_vtable): for virtual bases, get right
-       offset.
-       * class.c (add_virtual_function): change flag_dossier to
-       flag_rtti.
-       * class.c (modify_one_vtable): modify the right rtti entry.
-       * class.c (override_one_vtable): get rid of size entry.
-       * class.c (finish_struct): change flag_dossier to flag_rtti, and
-       build extra vtables, build type descriptors for polymorphic
-       classes.
-       * gc.c (build_headof): make headof() works correctly with new
-       rtti.
-       * gc.c (build_typeid): make this function work with new rtti.
-       * gc.c (get_typeid): make this function work with new rtti.
-       * gc.c (build_bltn_desc): new function for new rtti.
-       * gc.c (build_user_desc): ditto.
-       * gc.c (build_class_desc): ditto.
-       * gc.c (build_ptr_desc): ditto.
-       * gc.c (build_attr_desc): ditto.
-       * gc.c (build_func_desc): ditto.
-       * gc.c (build_ptmf_desc): ditto.
-       * gc.c (build_ptmd_desc): ditto.
-       * gc.c (build_t_desc): ditto.
-       * gc.c : comment out old build_t_desc, build_i_desc, build_m_desc.
-
-Tue Oct 25 13:37:41 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (convert_harshness): Check for TREE_UNSIGNED differences
-       after checking for integral conversions.
-
-Wed Nov 30 19:13:50 1994  Mike Stump  <mrs@cygnus.com>
-
-       * Version 2.6.3 released.
-
-Thu Nov 17 10:56:50 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck2.c (build_m_component_ref): Check the basetype of the
-       member pointer against the main variant of the object type.
-
-Mon Nov 14 14:21:52 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * cvt.c (convert_to_reference): Make sure that the original expr
-       gets its type back when converting a reference.
-
-       * method.c (build_overload_name): Clear numeric_outputed_need_bar here.
-       (build_decl_overload): Instead of here.
-
-Tue Nov  8 17:11:24 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * cvt.c (cp_convert): Don't build a TARGET_EXPR if we're not in a
-       function.
-
-       * typeck.c (convert_for_initialization): Handle initialization from
-       a TARGET_EXPR.
-
-Sun Nov  6 01:34:24 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * pt.c (lookup_nested_type_by_name): Fix list-walking logic.
-       (tsubst): When replacing a TEMPLATE_TYPE_PARM, propagate
-       TYPE_READONLY and TYPE_VOLATILE from the argument.
-       (unify): When unifying with a TEMPLATE_TYPE_PARM, remove cv-quals
-       present in parm from arg.
-       (type_unification): Strip REFERENCE_TYPE from the argument type.
-       (unify): Don't strip REFERENCE_TYPE from the argument type.
-
-Sat Nov  5 22:42:15 1994  Greg McGary  <gkm@magilla.cichlid.com>
-
-       * pt.c (do_type_instantiation): Check to see if there's a
-       IDENTIFIER_TEMPLATE on a class before calling
-       instantiate_member_templates().
-
-Sat Nov 12 06:35:42 1994  Mike Stump  <mrs@cygnus.com>
-
-       * Version 2.6.2 released.
-
-Thu Nov  3 18:48:19 1994  Paul Eggert  <eggert@twinsun.com>
-
-       * Makefile.in (spew.o, lex.o, pt.o):
-       Depend on $(srcdir)/parse.h, not parse.h.
-
-Tue Nov  1 19:19:41 1994  Mike Stump  <mrs@cygnus.com>
-
-       * Version 2.6.1 released.
-
-Sun Oct 23 13:19:55 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl2.c: Declare flag_access_control.
-       (struct lang_f_options): Add access-control.
-       * expr.c (cplus_expand_expr, NEW_EXPR): Unset flag_access_control
-       for the call to expand_aggr_init to copy the object out of the
-       pcc_struct_return slot.
-       * search.c (compute_access): if (!flag_access_control) return
-       access_public.
-
-Fri Oct 21 00:32:54 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * lex.c (cons_up_default_function): Don't try to defer method
-       synthesis now.
-
-       * decl.c (init_decl_processing): Use __pure_virtual for abort_fndecl
-       instead of abort, since the OSF/1 dynamic linker doesn't like to see
-       relocation entries for abort.
-
-       * tree.c (array_type_nelts_total): Use sizetype, not
-       integer_type_node.
-       (array_type_nelts_top): Likewise.
-
-Thu Oct 20 15:48:27 1994  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (grokdeclarator): Added handling for catch parameters
-       (CATCHPARM).
-       * except.c (expand_start_catch_block): Use the new CATCHPARM context
-       instead of NORMAL.
-       * except.c (expand_throw): Don't let convert_to_reference complain
-       about what we are doing.
-
-Thu Oct 20 12:55:24 1994  Jim Wilson  <wilson@cygnus.com>
-
-       * method.c (emit_thunk): Call instantiate_virtual_regs.
-
-Wed Oct 19 14:15:33 1994  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_exception_blocks): Make sure throw code doesn't
-       get put in function that won't be output.
-
-Mon Oct 17 18:03:15 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (init_decl_processing): Make alloca a builtin.
-
-Thu Oct 27 21:10:25 1994  Craig Burley  <craig@burley>
-
-       * g++.c (main): Only decrement "added" and set "library" to
-       NULL when "library" != NULL (just like 940829 fix).
-
-Mon Oct 17 15:56:11 1994  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (expand_start_catch_block): Make sure the false label
-       gets onto the permanent obstack, as it is used for the exception
-       table.
-
-Fri Oct 14 18:54:48 1994  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (modify_one_vtable): Since the DECL_CONTEXT of fndecl can
-       be set just below, use current_fndecl instead.
-
-Fri Oct 14 15:12:22 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * init.c (expand_aggr_vbase_init_1): Don't call expand_aggr_init_1
-       with LOOKUP_SPECULATIVELY.
-       (expand_default_init): Abort if build_method_call returns NULL_TREE.
-
-       * typeck.c (build_modify_expr): Don't just build a MODIFY_EXPR if
-       the rhs is a TARGET_EXPR.
-
-       * parse.y (left_curly): Anonymous types are not affected by #pragma
-       interface/implementation.
-
-       * method.c (synthesize_method): Don't call setup_vtbl_ptr for the
-       default constructor if it isn't needed.
-
-       * lex.c (cons_up_default_function): Do synthesize methods for
-       anonymous types if necessary.
-
-Thu Oct 13 17:44:55 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * method.c (build_decl_overload): Set numeric_outputed_need_bar to 0.
-
-Wed Oct 12 13:27:57 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * typeck.c (build_modify_expr): Understand how to copy an aggregate.
-
-       * init.c (expand_default_init): Likewise.  Also remove some of the
-       crufty code that assumes methods will not be synthesized properly.
-
-       * lex.c (cons_up_default_function): If the containing type has no
-       name, these functions should never need to be called, so just
-       declare them.
-
-       * lex.c (real_yylex): Use HOST_BITS_PER_WIDE_INT to determine the
-       bitmask for lexing character constants.
-
-       * call.c (build_method_call): Disable code that tries to do tricky
-       stuff with a default parameter that is a constructor call, but
-       actually does other tricky stuff that breaks things.
-
-Wed Oct 12 16:14:01 1994  Benoit Belley  <belley@cae.ca>
-
-       * decl.c (finish_enum): Disable code which forces enums to be signed,
-       since this conflicts with their use as bitfields. type_promotes_to
-       handles promotion of enums of underlying unsigned types to signed
-       integer types.
-
-Wed Oct 12 13:24:03 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * cvt.c (type_promotes_to): Also promote enums to long if
-       appropriate.
-
-       * typeck.c (default_conversion): Don't expect type_promotes_to to
-       return a main variant.
-
-Wed Oct 12 12:19:45 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (build_scoped_method_call): Don't lose side effects in the
-       object expression when calling a non-existent destructor.
-
-Fri Sep  2 19:05:21 1994  Rohan Lenard  <rjl@iassf.easams.com.au>
-
-       * call.c (build_scoped_method_call): Remove erroneous error message
-       when destructor call is written as a scoped call.
-
-Tue Oct 11 23:48:31 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * various: Cast pointer arguments to bzero and bcopy to char *.
-
-Tue Oct 11 19:34:32 1994  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (get_derived_offset): Added a type parameter to limit how
-       far up the CLASSTYPE_VFIELD_PARENT chain we search.
-       * class.c (modify_one_vtable, fixup_vtable_deltas): When forming the
-       offset to put into the vtable for the this parameter, make sure we
-       don't offset from a parent of the DECL_CONTEXT of the function.
-
-Tue Oct 11 16:10:52 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * pt.c (do_function_instantiation): Set DECL_EXTERNAL and
-       TREE_STATIC when setting DECL_INTERFACE_KNOWN.
-       (do_type_instantiation): Likewise.
-
-       * lex.c (cons_up_default_function): Set DECL_INTERFACE_KNOWN,
-       DECL_EXTERNAL and TREE_STATIC as appropriate.
-
-       * decl2.c (finish_file): Also synthesize methods that don't have
-       DECL_EXTERNAL set.  Set interface_unknown before doing so.
-
-       * decl.c (start_function): If DECL_INTERFACE_KNOWN is set on the
-       function decl, don't muck with TREE_PUBLIC and DECL_EXTERNAL.
-
-Mon Oct 10 00:56:53 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * lex.c (cons_up_default_function): Mark methods in a template class
-       as template instances.  Store the values of interface_unknown and
-       interface_only for do_pending_inlines.
-       (do_pending_inlines): Use them.
-
-       * decl2.c (finish_file): If we haven't seen a definition of a
-       function declared static, make the decl non-PUBLIC so compile_file
-       can give an error.
-
-Sun Oct  9 02:42:29 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * method.c (do_build_copy_constructor): Handle anonymous unions.
-       (do_build_assign_ref): Likewise.
-       (largest_union_member): Move from lex.c.
-
-Sat Oct  8 14:59:43 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       Re-implement g++'s vague linkage independent of TREE_PUBLIC.
-       * pt.c (instantiate_member_templates): Lose redundant
-       -fexternal-templates handling.
-       (tsubst): Set TREE_PUBLIC and DECL_EXTERNAL on new decls.  Don't set
-       TREE_STATIC or DECL_INTERFACE_KNOWN.
-       (do_pending_expansions): Predicate on DECL_INTERFACE_KNOWN instead
-       of DECL_EXTERNAL for explicit instantiations.
-       (do_function_instantiation): Do the new thing.
-       (do_type_instantiation): Likewise.
-       (instantiate_template): Deal with member templates defined in a .cc
-       file with -fexternal-templates.
-       * except.c (expand_exception_blocks): Use DECL_LINKAGE_KNOWN to
-       decide whether to stick builtin_throw here.
-       * decl2.c (import_export_inline): Predicate on DECL_INTERFACE_KNOWN
-       rather than TREE_PUBLIC.  Generally fix rules.
-       (finish_file): Use DECL_INITIAL to determine whether or not a method
-       has been synthesized, rather than TREE_ASM_WRITTEN.
-       * decl.c (warn_extern_redeclared_static): Use DECL_PUBLIC instead of
-       TREE_PUBLIC.
-       (pushdecl): Likewise.
-       (duplicate_decls): Likewise.  Deal with DECL_DECLARED_STATIC and
-       DECL_INTERFACE_KNOWN. 
-       (redeclaration_error_message): Fix checking for conflicting linkage.
-       (define_function): Set DECL_INTERFACE_KNOWN.
-       (grokfndecl): Function decls are PUBLIC until we are sure about
-       their linkage.  Set DECL_DECLARED_STATIC as needed.
-       (start_function): Deal with linkage.  Move pushdecl after linkage
-       magic.
-       (finish_function): Don't set TREE_ASM_WRITTEN on discarded inlines.
-       * cp-tree.h (lang_decl_flags): Add interface_known and
-       declared_static.
-       (DECL_INTERFACE_KNOWN): New macro.
-       (DECL_DECLARED_STATIC): New macro.
-       (DECL_PUBLIC): New macro.
-
-       Clean up bogus use of TREE_PUBLIC.
-       * class.c (alter_access): Fix mistaken use of TREE_PUBLIC (it
-       doesn't correspond to TREE_PROTECTED and TREE_PRIVATE).
-       * init.c (do_friend): Don't arbitrarily set TREE_PUBLIC.
-
-Wed Oct  5 13:44:41 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * call.c (build_overload_call_real): Don't immediately do
-       array->pointer conversion.
-
-       * pt.c (type_unification): If not passing to a reference, strip
-       cv-quals.  Also handle array->pointer conversion.
-
-Tue Oct  4 17:45:37 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (grokdeclarator): Don't warn about applying const to a
-       const typedef or template type parameter.
-
-       * decl2.c (finish_file): Also synthesize methods after walking the
-       vtables.  Ugly ugly ugly.
-
-Mon Oct  3 15:02:41 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * various: Remove lingering remnants of old exception handling code.
-
-       * decl2.c (finish_file): Synthesize methods before walking the
-       vtables, so that the vtables get emitted as needed.
-
-       * decl.c (shadow_tag): Remove obsolete code for pushing tags and
-       dealing with exceptions.
-
-Mon Oct  3 13:05:27 1994  Ian Lance Taylor  <ian@sanguine.cygnus.com>
-
-       * Make-lang.in (g++-cross): Depend upon version.o and $(LIBDEPS).
-
-Mon Oct  3 02:59:28 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl2.c (finish_file): Fix inline handling.
-
-Sun Oct  2 00:21:56 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       * decl.c (grokdeclarator): Handle redundant scope even better.
-       ({push,pop}_cp_function_context): Take toplev parameter.
-
-       * method.c (synthesize_method): Pass toplev parameter to
-       {push,pop}_cp_function_context depending on decl_function_context
-       (fndecl).
-
-       * typeck.c (build_x_unary_op): Unary & on OFFSET_REFs is always the
-       built-in version.
-
-       * method.c (synthesize_method): Don't be confused by __in_chrg
-       parameter.
-
-       * class.c (popclass): Set C_C_D like start_function does.
-
-       * decl.c (grokdeclarator): Handle redundant scope better.
-
-       * parse.y (expr_or_declarator): Add '(' expr_or_declarator ')' rule.
-       (direct_notype_declarator): Likewise.
-       (complex_direct_notype_declarator): Remove it here.
-
-Sat Oct  1 21:42:18 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * init.c (resolve_offset_ref): Fix types used in resolving .*
-       expressions.
-
-Sat Oct  1 15:18:49 1994  Jason Merrill  <jason@phydeaux.cygnus.com>
-
-       Beginnings of work to synthesize methods only when needed.
-       * call.c (build_method_call): Synthesize methods as necessary
-       (currently never necessary).
-       * class.c (popclass): Don't try to set C_C_D here, as it'll end up
-       on the wrong obstack.
-       * decl.c (push_cp_function_context): Mostly copied from
-       push_c_function_context.
-       (pop_cp_function_context): Similarly.
-       (finish_function): Reverse order of poplevel and pop_nested_class so
-       that current_class_decl is restored properly.  
-       (start_function): Likewise.
-       (finish_function): Add parameter 'nested'.  Don't call
-       permanent_allocation if (nested).
-       * various: Pass extra parameter to finish_function.     
-       * decl2.c (finish_file): Reorganize end-of-file inline handling,
-       synthesizing methods as necessary.
-       * lex.c (cons_up_default_function): Call mark_inline_for_output.
-       Only synthesize methods immediately if #pragma implementation
-       (currently disabled).
-       (do_pending_inlines): Call synthesize_method.
-       * method.c (synthesize_method): New function; all method synthesis
-       goes through here.  Calls do_build_assign_ref and
-       do_build_copy_constructor.
-       (build_default_constructor): Remove.
-       (build_dtor): Likewise.
-       (build_assign_ref): Rename to do_build_assign_ref and remove stuff
-       done by synthesize_method.
-       (build_copy_constructor): Similarly.
-
-Thu Sep 29 16:58:52 1994  Mike Stump  <mrs@cygnus.com>
-
-       * typeck.c (c_expand_return): Use magic so the backend can fixup the
-       assignment into the return register, so cleanups won't clobber it.
-
-Thu Sep 29 13:08:50 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * method.c (hack_identifier): Don't call assemble_external for
-       template decls.
-
-       * decl.c (finish_decl): Also end temporary allocation if the decl in
-       question has a type of error_mark_node.
-
-Wed Sep 28 21:45:00 1994  Mike Stump  <mrs@cygnus.com>
-
-       * typeck.c (build_modify_expr): When optimizing ?: on lhs, make sure
-       that if the ?: was a reference type, that the subparts will be also.
-
-Wed Sep 28 16:14:04 1994  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * except.c (register_exception_table): Use Pmode, not PTRmode.
-
-Fri Sep 23 13:54:27 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * lex.c (do_pending_inlines): Do method synthesis after the
-       pending_inlines have been reversed.
-
-Thu Sep 22 12:53:03 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * decl2.c (finish_file):  Fix Brendan's fix:  Only call
-       register_exception_table if there is a non-empty exception table.
-
-Thu Sep 22 12:03:46 1994  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl2.c (finish_file): Only do register_exception_table if
-       -fhandle-exceptions is being used.
-
-Wed Sep 21 19:01:51 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * except.c (output_exception_table_entry):  Simplify
-       by using assemble_integer.
-       (build_exception_table):  Change to return a count.
-       Cleanup to use standard macros, instead of hard-wired
-       sparc asm format.  Don't make __EXCEPTION_TABLE__ global.
-       (register_exception_table):  New function.  Generate call to builtin.
-       * decl2.c (finish_file):  Call register_exception_table.
-       * cp-tree.h (build_exception_table):  Fix prototype.
-
-Wed Sep 21 13:20:42 1994  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * tree.c (break_out_calls): Don't try to duplicate the DECL_INITIAL.
-
-       * decl2.c (delete_sanity): Give an error at trying to delete a
-       function.
-
-Wed Sep 21 11:47:10 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * lex.c (cons_up_default_function): Mark synthesized destructors
-       inline.
-
-       * decl.c (duplicate_decls): Ignore redeclarations of wchar_t as
-       something other than __wchar_t, complaining if -pedantic and not in
-       a system header.
-
-Tue Sep 20 09:43:28 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (xref_tag): Set up BINFO_INHERITANCE_CHAIN on base binfos
-       here.
-
-       * typeck.c (build_modify_expr): Require complete type after checking
-       for error_mark_node.
-
-       * call.c (build_method_call): Print parmtypes when complaining of
-       ambiguous call.
-
-       * typeck.c (build_modify_expr): Handle assignment to array from
-       non-array.
-
-       * decl.c (lookup_name_real): Deal with got_scope == error_mark_node.
-
-       * call.c (build_method_call): Don't bother with the exact match.
-
-Mon Sep 19 00:51:39 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * init.c (expand_aggr_init): If we munge the type of the variable,
-       also munge the type of the initializer.
-
-       * decl.c (grokdeclarator): Use <= when comparing to RID_LAST_MODIFIER.
-       (init_decl_processing): Push artificial declaration of wchar_t so
-       people don't have to declare it before they can use it.
-
-       * error.c (cp_line_of): return lineno in lieu of 0.
-
-       * typeck.c (convert_for_assignment): Handle conversion of pmfs to
-       int and bool.
-       (build_component_ref): Fold the COMPONENT_REF in case it can be
-       reduced.
-
-       * typeck2.c (store_init_value): Don't pedwarn about non-constant
-       bracketed initializers for automatic variables.
-
-Sun Sep 18 10:12:12 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * error.c (dump_decl): Don't say `typedef enum foo foo'.
-
-       * decl.c (start_decl): Don't set TREE_PUBLIC on template decls just
-       because they're affected by #pragma i/i.  We'll deal with that when
-       they get instantiated.
-
-       * typeck.c (build_unary_op): Clean up cruft in ADDR_EXPR case.
-
-       * class.c (instantiate_type): Set TREE_CONSTANT on instantiated
-       ADDR_EXPRs if appropriate.
-
-       * decl.c (build_ptrmemfunc_type): Unset IS_AGGR_TYPE on pmf types.
-
-       * typeck.c (build_ptrmemfunc): Handle &overloaded_method as an
-       initializer properly.
-       * typeck2.c (digest_init): Likewise.
-
-       * tree.c (cp_build_type_variant): Like c_build_type_variant, except
-       it uses build_cplus_array_type.
-       * *.c: Use cp_build_type_variant instead of c_build_type_variant.
-
-       * pt.c (do_type_instantiation): Don't try to instantiate nested
-       enums.
-
-Tue Sep 13 10:56:58 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cvt.c (build_up_reference): Handle preincrement and predecrement
-       properly.
-
-Tue Sep 13 09:51:59 1994  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl.c (finish_decl): Only lay out the rtl for DECL if it is, in
-       fact, static.
-
-Mon Sep 12 14:40:30 1994  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl.c (finish_decl): Lay out the rtl for DECL before doing
-       grok_reference_init, in case it's static.
-
-Mon Sep 12 12:45:38 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * class.c (finish_struct): Don't synthesize constructors if the
-       class has a field with the same name as the class.  Don't die on
-       classes with no constructors or destructors.  Don't die if the head
-       and tail of the class are in different files.
-
-       * decl.c (grokdeclarator): Don't treat a function pointer field
-       with the same name as the class as a constructor.
-
-Fri Sep  9 13:17:00 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (build_c_cast): Pull constant values out of their
-       variables here.
-
-       * decl.c (duplicate_decls): Only propagate DECL_CHAIN in
-       FUNCTION_DECLs and TEMPLATE_DECLs.
-
-Thu Sep  8 10:07:48 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (duplicate_decls): Propagate DECL_CHAIN in all DECLs that
-       have it.
-
-       * pt.c (unify): REALs and INTEGERs only unify with their own genus.
-       (instantiate_member_templates): Don't muck with DECL_EXTERNAL and
-       TREE_PUBLIC unless -fexternal-templates.
-
-Wed Sep  7 13:17:10 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * pt.c (do_type_instantiation): Call instantiate_member_templates.
-       Deal with specializations.
-       (tsubst): Don't stick the mangled name in DECL_NAME for function
-       instantiations.  Don't push them, either.
-
-       * decl2.c (grokfield): Move code for generating the
-       DECL_ASSEMBLER_NAME for static members from here.
-       * method.c (build_static_name): To here.
-       * decl.c (grokvardecl): Call build_static_name.
-       (duplicate_decls): Keep old DECL_ASSEMBLER_NAME.
-
-Mon Sep  5 12:49:18 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * call.c (build_method_call): if -Wsynth, warn when selecting
-       synthesized op= over user-supplied one cfront would select.
-       * decl2.c (lang_decode_option): Handle -Wsynth.
-
-Fri Sep  2 15:11:59 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (finish_enum): Overhaul to fix several bugs.
-       (start_enum): Disable useless code.
-
-Thu Sep  1 16:04:54 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (c_expand_return): Warn about returning a reference to a
-       temporary.
-       (convert_arguments): Increment argument counter when using default
-       arguments, too.
-
-Wed Aug 31 14:29:22 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (finish_decl): If the type of decl is error_mark_node,
-       don't bother trying to do anything.
-
-       * typeck.c (convert_for_initialization): If the rhs contains a
-       constructor call, pretend the lhs type needs to be constructed.
-
-       * init.c (expand_default_init): If we stick the object inside the
-       initializer, mark the initializer used.
-
-Tue Aug 30 13:50:18 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * method.c (build_assign_ref): return *this;
-       (build_assign_ref): Fix base assignment order.
-       (build_copy_constructor): Fix member init order.
-
-Mon Aug 29 13:54:39 1994  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * g++.c (main): Remember to clear out SAW_SPECLANG after we see
-       its argument.
-
-Sat Aug 27 09:36:03 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * method.c (build_copy_constructor): Also copy virtual bases.
-
-Fri Aug 26 17:05:15 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * lex.c (do_pending_inlines): Clear out pending_inlines before doing
-       any synthesis.  Also first set deja_vu on all pending_inlines.
-
-       * method.c (build_assign_ref): Use build_member_call to invoke base
-       operator=, rather than build_modify_expr.  And use
-       build_reference_type instead of TYPE_REFERENCE_TO.
-       (build_copy_constructor): Use TYPE_NESTED_NAME to identify the
-       basetype.
-
-       * decl2.c (grokfield): Don't complain about undefined local class
-       methods.
-
-       * class.c (finish_struct): Don't try to synthesize methods here.
-       * lex.c (do_pending_inlines): Instead, synthesize them here.
-       (init_lex): Initialize synth_obstack.
-       (cons_up_default_function): Stick synthesis request on
-       pending_inlines.
-
-Fri Aug 26 12:24:14 1994  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * call.c (build_method_call) [PCC_STATIC_STRUCT_RETURN]: Also
-       accept an RTL_EXPR in what we're about to use for the instance,
-       since anything which would end up with pcc_struct_return set
-       inside cplus_expand_expr.
-
-       * cp-tree.h (cons_up_default_function): Note change of prototype.
-
-Thu Aug 25 23:05:30 1994  Gerald Baumgartner  <gb@cs.purdue.edu>
-
-       * class.c (finish_struct): Undid change from Aug 21 testing
-       CLASSTYPE_INTERFACE and CLASSTYPE_VTABLE_NEEDS_WRITING.
-       * parse.y (left_curly): Likewise, undid change from Aug 21.
-       * decl.c (xref_tag): Undid change from Aug 21, set
-       CLASSTYPE_INTERFACE correctly, and added comments.
-
-Thu Aug 25 00:36:31 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       Rework approach to synthesized methods; don't go through the parser
-       anymore.
-       * class.c (finish_struct): Use new synthesis approach.
-       * lex.c (cons_up_default_function): Now just creates declaration,
-       not code.
-       (largest_union_member): #if 0 out.
-       (default_assign_ref_body): Likewise.
-       (default_copy_constructor_body): Likewise.
-       * method.c (build_default_constructor): New function to synthesize X().
-       (build_copy_constructor): Synthesize X(X&).
-       (build_assign_ref): Synthesize X::operator=(X&).
-       (build_dtor): Synthesize ~X().
-
-       * error.c (cp_line_of): If we're dealing with an artificial
-       TYPE_DECL, look at the type instead.
-
-Wed Aug 24 11:11:50 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * init.c (sort_member_init): Check warn_reorder.
-       * decl2.c (lang_decode_option): Handle -W{no-,}reorder.
-
-       * cp-tree.h (CLASSTYPE_SOURCE_LINE): New macro.
-       * error.c (cp_line_of): Use CLASSTYPE_SOURCE_LINE for aggregates.
-       * class.c (finish_struct): Set CLASSTYPE_SOURCE_LINE.
-
-Tue Aug 23 09:28:35 1994  Mike Stump  <mrs@cygnus.com>
-
-       * error.c (dump_decl): Improve wording, so that error messages
-       dont't read template<, class foo>...
-
-Mon Aug 22 15:30:51 1994  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * parse.y (label_colon): Also match a TYPENAME as a label name,
-       since they may have declared a class by that name but have also
-       tried to have a local label under the same name.
-
-       * pt.c (coerce_template_parms): Call cp_error, not cp_error_at,
-       for the message so they know at what point it was instantiated.
-
-Sun Aug 21 23:07:35 1994  Gerald Baumgartner  <gb@cs.purdue.edu>
-
-       * class.c (finish_struct): Move setting of CLASSTYPE_INTERFACE and
-       CLASSTYPE_VTABLE_NEEDS_WRITING for signatures up to left_curly time.
-       * decl.c (xref_tag): Move setting of CLASSTYPE_INTERFACE and
-       CLASSTYPE_VTABLE_NEEDS_WRITING for signatures down to left_curly time.
-       * parse.y (left_curly): New final resting place for setting
-       CLASSTYPE_INTERFACE and CLASSTYPE_VTABLE_NEEDS_WRITING for signatures.
-
-       * class.c (finish_struct): Don't test for function/field name
-       conflicts in signatures, since all the fields are compiler-constructed.
-
-Fri Aug 19 14:04:47 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * method.c (build_overload_nested_name): in qualified name
-       mangling, the template with value instantiation will have numeric
-       at end and may mixed with the name length of next nested level.
-       Add a '_' in between.
-       * method.c (build_overload_name): ditto.
-       * method.c (build_overload_identifier): ditto.
-
-Thu Aug 18 16:24:43 1994  Mike Stump  <mrs@cygnus.com>
-
-       * error.c (dump_decl): Handle NULL args.
-
-Thu Sep 29 16:15:36 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>
-
-       * g++.c: Rework last change so it's done like collect.c (and 
-       gcc.c).
-
-Wed Sep 14 10:17:27 1994  Michael I Bushnell  <mib@churchy.gnu.ai.mit.edu>
-
-       * g++.c: Include <sys/errno.h> in case `errno' is a macro
-       as permitted by ANSI C.
-
-Thu Aug 18 12:48:09 1994  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (finish_struct): Move setting of CLASSTYPE_INTERFACE and
-       CLASSTYPE_VTABLE_NEEDS_WRITING up to left_curly time.
-       * decl.c (xref_tag): Move setting of CLASSTYPE_INTERFACE and
-       CLASSTYPE_VTABLE_NEEDS_WRITING down to left_curly time.
-       * parse.y (left_curly): New final resting place for setting
-       CLASSTYPE_INTERFACE and CLASSTYPE_VTABLE_NEEDS_WRITING.
-
-Thu Aug 11 11:32:42 1994  H.J. Lu  <hjl@nynexst.com>
-
-       * g++.c (main): Only decrement "added" and set "library" to
-         NULL when "library" != NULL.
-
-Sat Aug 13 00:14:52 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grokdeclarator): Don't set TREE_PUBLIC on a function decl
-       just because its class has a known interface.
-       (decls_match): Deal with new format of template parms.
-
-       * lex.c (cons_up_default_function): Don't play with TREE_PUBLIC and
-       DECL_EXTERNAL here.
-
-Fri Aug 12 01:55:15 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (pushtag): SET_DECL_ARTIFICIAL on gratuitous typedefs.
-       (xref_defn_tag): Likewise.
-       (pushdecl): Only allow artificial typedefs to be shadowed.
-
-       * init.c (emit_base_init): Pass the right binfos to
-       expand_aggr_init_1.
-
-       * class.c (delete_duplicate_fields_1): Make it work right.
-       (finish_struct): Catch function/field name conflict.
-
-       * decl2.c (check_classfn): Pass the function to cp_error, not just
-       the name.
-
-       * init.c (sort_member_init): Warn when order of member initializers
-       does not match order of member declarations.
-       (emit_base_init): Call expand_aggr_init_1 with LOOKUP_PROTECT.
-
-       * error.c (dump_expr): Handle lists of functions.
-
-       * decl.c (start_function): #pragma interface only affects functions
-       that would otherwise be static.
-       (finish_decl): Don't warn about an unused variable if it has both
-       constructor and destructor, since the 'resource allocation is
-       initialization' idiom is relatively common.
-
-       * typeck.c (comp_target_types): Don't handle TEMPLATE_TYPE_PARMs.
-       (comp_target_parms): Likewise.
-       (compparms): Never consider default parms.
-       (common_base_type): Don't choose a virtual baseclass if there is a
-       more derived class in common.
-       (build_conditional_expr): If pedantic, pedwarn about conversion to
-       common base in conditional expr.
-
-       * class.c (instantiate_type): Handle template instantiation better.
-
-       * typeck.c (convert_arguments): Don't try to get tricky and convert
-       to int directly when PROMOTE_PROTOTYPES is set, as it breaks
-       user-defined conversions.
-
-       * lex.c (check_for_missing_semicolon): Also give error at end of
-       file.
-
-       * call.c (build_method_call): Don't promote arrays to pointers here.
-
-       * typeck.c (convert_arguments): Don't require the actual parameter
-       to be of a complete type if the formal parameter is a reference.
-
-Thu Aug 11 15:21:40 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grokdeclarator): Soften 'static' on member function error
-       to pedwarn.
-
-       * init.c (build_new): Don't automatically save rval.
-       (build_offset_ref): Do field lookup with proper basetype_path.
-
-Thu Aug 11 12:46:54 1994  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * errfn.c (cp_silent): Declare to mark when we should avoid
-       emitting warnings and errors.
-       (cp_error): Check it.
-       (cp_warning): Likewise.
-       (cp_pedwarn): Likewise.
-       (cp_compiler_error): Likewise.
-       (cp_error_at): Likewise.
-       (cp_warning_at): Likewise.
-       (cp_pedwarn_at): Likewise.
-       * call.c (compute_conversion_costs): Set CP_SILENT when we start
-       out, and make sure we turn it off before we leave.
-
-Thu Aug 11 00:02:54 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl2.c (grok_array_decl): Try computing *(A+B) if neither
-       argument is obviously an array.
-
-Wed Aug 10 15:32:04 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (c_expand_start_case): Do cleanups here.
-
-       * parse.y (xcond): Do bool conversion here, too.
-       (simple_stmt, SWITCH case): Don't do cleanups here.
-
-       * decl.c (duplicate_decls): Don't treat builtins that have been
-       explicitly declared specially.
-
-Tue Aug  9 01:16:09 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * tree.c (make_deep_copy): Support copying pointer, reference,
-       function, array, offset and method types.
-
-       * decl.c (init_decl_processing): Mark exit and abort as
-       BUILT_IN_NONANSI so that duplicate_decls is kinder about
-       redeclaration.
-       (duplicate_decls): Don't give two errors for redeclaring a C
-       function with the same parms but a different return type.
-
-       * parse.y (paren_cond_or_null): Do cleanup and bool conversion here.
-       (condition): Instead of here.
-       (simple_stmt, SWITCH case): Also do cleanup here.
-
-       * decl2.c (finish_anon_union): Only break out FIELD_DECLs.
-
-       * call.c (build_method_call): Don't throw away the side effects of
-       the object in a call to a non-existent constructor.
-       * parse.y (primary): Likewise.
-
-       * method.c (build_decl_overload): Oop.
-
-       * decl2.c (lang_decode_option): Deal with flag_no_nonansi_builtin,
-       warn about uselessness of specifying -fansi-overloading.
-
-       * method.c (build_decl_overload): Treat any non-member new with one
-       parameter as __builtin_new.
-
-       * decl.c (init_decl_processing): Setup built-in meanings of exit,
-       _exit and abort.
-
-Mon Aug  8 15:03:30 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * error.c (dump_readonly_or_volatile): Put a space between const and
-       volatile if both apply.
-
-       * init.c (perform_member_init): Clean up after this initialization.
-       (emit_base_init): Clean up after each base init, not after all have
-       been done.
-       (expand_aggr_vbase_init_1): Clean up after this init.
-
-Sun Aug  7 14:55:05 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * call.c (build_method_call): Deal with destroying references.
-
-       * parse.y (condition): Do bool_truthvalue_conversion here.
-       (paren_expr_or_null): And here.
-       (simple_if): Not here.
-       (simple_stmt): Or here.
-
-Sat Aug  6 22:29:45 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (paren_expr_or_null): Wrap the expression in a
-       CLEANUP_POINT_EXPR.
-       (condition): Likewise.
-
-Sat Aug  6 19:46:37 1994  Rohan Lenard  <rjl@easams.com.au>
-
-       * call.c (build_scoped_method_call): Fix error message when
-       destructor call refers to a nonexistent type.
-
-Sat Apr 16 22:43:30 1993  Gerald Baumgartner  <gb@cs.purdue.edu>
-
-       * lex.h (rid): Deleted RID_RAISES, it's never used.
-       Moved RID_PUBLIC, RID_PRIVATE, RID_PROTECTED, RID_EXCEPTION,
-       RID_TEMPLATE and RID_SIGNATURE to the end of the enumeration,
-       they don't need to be touched in `grokdeclarator.'
-       (RID_LAST_MODIFIER): Defined macro to be RID_MUTABLE.
-
-       * decl.c (grokdeclarator): Use RID_LAST_MODIFIER instead of
-       RID_MAX as loop limit for finding declaration specifiers.
-
-Sat Apr  3 21:59:07 1993  Gerald Baumgartner  <gb@cs.purdue.edu>
-
-       * lex.c (debug_yytranslate): Moved to parse.y since it needs to
-       access `yytname,' which is static in parse.c.
-
-Fri Apr  2 23:36:57 1993  Gerald Baumgarnter  <gb@cs.purdue.edu>
-
-       * cp-tree.h (GNU_xref_ref): Fixed typo in extern declaration, it
-       was `GNU_xref_def' instead of `GNU_xref_ref.'
-
-Fri Aug  5 14:20:16 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * pt.c (do_function_instantiation): Don't set TREE_PUBLIC and
-       DECL_EXTERNAL on 'extern' instantiations; wait until EOF to do that.
-       (do_type_instantiation): Likewise.
-
-       * decl2.c (import_export_inline): Decides at EOF what an inline's
-       linkage should be.
-       (finish_file): Call it.
-
-       * decl.c (start_function): Don't rely on the settings of TREE_PUBLIC
-       and DECL_EXTERNAL from do_*_instantiation.  Only set
-       DECL_DEFER_OUTPUT on inlines whose linkage might actually change.
-       (finish_function): Use DECL_DEFER_OUTPUT to decide which inlines to
-       mark for later consideration, rather than DECL_FUNCTION_MEMBER_P.
-
-Fri Aug  5 01:12:20 1994  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (get_class_offset_1, get_class_offset): New routine to
-       find the offset of the class where a virtual function is defined,
-       from the complete type.
-       * class.c (modify_one_vtable, fixup_vtable_deltas): Use
-       get_class_offset instead of virtual_offset as get_class_offset will
-       always provide the right answer.
-       * tree.c (virtual_offset): Remove.  It only ever worked some of the
-       time.
-
-Tue Aug  2 12:44:21 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * call.c (build_method_call): Put back unary_complex_lvalue call
-       that I thought was redundant.
-
-       * typeck.c (c_expand_return): Fix a case I missed before.
-
-Sun Jul 31 17:54:02 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * pt.c (unify): Strip cv-quals from template type arguments (when
-       'const T*' is matched to 'const char*', that does not mean that T is
-       'const char').
-
-Fri Jul 29 01:03:06 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * pt.c (do_type_instantiation): Instantiate nested TAGS, not
-       typedefs.  Third time's the charm?
-
-       * parse.y (template_parm): Support default template parms.
-       * pt.c (process_template_parm): Likewise.
-       (end_template_parm_list): Likewise.
-       (coerce_template_parms): Likewise.
-       (mangle_class_name_for_template): Likewise.
-       (push_template_decls): Likewise.
-       (unify): Likewise.
-       * method.c (build_overload_identifier): Likewise.
-       * error.c (dump_decl): Likewise.
-
-Wed Jul 27 17:47:00 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * pt.c (do_type_instantiation): Only instantiate nested *classes*.
-
-Tue Jul 26 13:22:40 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * search.c (note_debug_info_needed): Also emit debugging information
-       for the types of fields.
-
-Mon Jul 25 00:34:44 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * pt.c (lookup_template_class): Pass 'template' to
-       coerce_template_parms instead of 'in_decl', since it's a more
-       meaningful context.
-
-       * typeck.c (c_expand_return): Make sure any cleanups for the return
-       expression get run.
-       (build_c_cast): Use CONVERT_EXPR for conversion to void.
-
-       * pt.c (do_type_instantiation): Also instantiate nested types.
-
-       * typeck.c (convert_for_assignment): Don't die when comparing
-       pointers with different levels of indirection.
-
-       * decl.c (grokdeclarator): The sub-call to grokdeclarator for
-       class-local typedefs sets DECL_ARGUMENTS, so we need to clear it
-       out.
-
-       * decl2.c (finish_anon_union): Don't die if the union has no
-       members.
-
-       * decl.c (grokdeclarator): Undo changes to declspecs when we're done
-       so that 'typedef int foo, bar;' will work.
-
-       * decl2.c (finish_file): Don't call expand_aggr_init for
-       non-aggregates.
-
-Mon Jul 25 00:03:10 1994  Teemu Torma  <tot@trema.fi>
-
-       * decl.c (finish_function): We can't inline constructors and
-       destructors under some conditions with -fpic, but don't unset
-       DECL_INLINE.
-
-Mon Jul 25 00:03:10 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (build_object_ref): Make sure 'datum' is a valid object.
-
-Sun Jul 24 14:19:31 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * class.c (finish_struct): Don't set DECL_FIELD_BITPOS on
-       non-fields.
-       (finish_struct_methods): Use copy_assignment_arg_p.
-
-       * cvt.c (cp_convert): If expr is an OFFSET_REF, resolve it instead
-       of giving an error.
-
-       * typeck.c (build_binary_op_nodefault): Don't set result_type if we
-       don't know how to compare the operands.
-
-       * decl.c (grokdeclarator): Avoid seg fault when someone uses '__op'
-       as a declarator-id in their program.  Like the Linux headers do.
-       Arrgh.
-
-       * tree.c (lvalue_p): Treat calls to functions returning objects by
-       value as lvalues again.
-
-       * typeck.c (build_component_addr): Use convert_force to convert the
-       pointer in case the component type is also a private base class.
-
-       * search.c (get_matching_virtual): Fix bogus warning of overloaded
-       virtual.
-
-       * pt.c (overload_template_name): Set DECL_ARTIFICIAL on the created
-       TYPE_DECL to fix bogus shadowing warnings.
-
-Fri Jul 22 01:15:32 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * init.c (expand_aggr_init_1): const and volatile mismatches do not
-       prevent a TARGET_EXPR from initializing an object directly.
-
-Tue Jul 19 17:55:37 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cvt.c (build_up_reference): Allow building up references to
-       `this', don't warn about making references to artificial variables
-       (like `this').
-
-       * tree.c (lvalue_p): `this' is not an lvalue.
-
-       * call.c (build_method_call): Accept using a typedef name (or
-       template type parameter) for explicit destructor calls.
-
-Thu Jul 14 09:42:23 1994  Mike Stump  <mrs@cygnus.com>
-
-       * Version 2.6.0 released.
-
-Wed Jul 13 03:57:54 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * method.c (hack_identifier): Put back old code so lists of
-       non-functions will be handled properly.
-
-       * cp-tree.h (TYPE_NEEDS_CONSTRUCTING): #if 0 out; this macro is now
-       defined in the language-independent tree.h.
-
-       * tree.c (count_functions): Avoid bogus warning when compiling this
-       function.
-
-Mon Jul 11 18:37:20 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grok_reference_init): Always save the initializer of a
-       reference.
-
-Fri Jul  8 17:41:46 1994  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (cplus_expand_expr_stmt): Wrap statement expressions inside
-       CLEANUP_POINT_EXPRs so that the stack slots can be reused.
-       (disabled for now)
-
-Fri Jul  8 12:59:38 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * method.c (hack_identifier): Fix for new overloading.
-
-       * typeck.c (build_binary_op_nodefault): Don't mess with division by
-       zero.
-
-Fri Jul  8 13:20:28 1994  Gerald Baumgartner  <gb@cs.purdue.edu>
-
-       * decl2.c (finish_file): Only call walk_sigtables, if
-       flag_handle_signatures is turned on, don't waste time otherwise.
-
-Fri Jul  8 02:27:41 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (push_overloaded_decl): Don't create overloads of one when
-       shadowing a class type.
-       * typeck.c (build_x_function_call): Complain about overloads of one.
-
-       * decl.c (grokdeclarator): Don't try to treat a char* as a tree.
-       (grokdeclarator): Fix setting of TREE_STATIC.
-       (start_decl): Clear DECL_IN_AGGR_P after calling duplicate_decls.
-
-Thu Jul  7 22:20:46 1994  Gerald Baumgartner  <gb@andros.cygnus.com>
-
-       * cp-tree.h (walk_sigtables): Created extern declaration.
-       * decl2.c (walk_sigtables): Created function, patterned after
-       walk_vtables, even though we only need it to write out sigtables.
-       (finish_sigtable_vardecl): Created function.
-       (finish_vtable_vardecl): Changed 0 to NULL_PTR.
-       (finish_file): Call walk_sigtables.
-
-       * sig.c (build_signature_table_constructor): Mark class member
-       function pointed to from signature table entry as addressable.
-
-Thu Jul  7 13:39:37 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (start_decl): Check new decl of static member variable
-       against the declaration in the class here.
-       (grokvardecl): Instead of here.
-
-       * class.c (prepare_fresh_vtable): Call import_export_vtable if not
-       -fvtable-thunks.
-       (build_vtable): Likewise.
-
-       * decl2.c (import_export_vtable): Move logic for deciding the
-       interface of a template class from here.
-       (import_export_template): To here.
-       (finish_vtable_vardecl): Call import_export_template before
-       import_export_vtable.
-
-Wed Jul  6 20:25:48 1994  Mike Stump  <mrs@cygnus.com>
-
-       * except.c (init_exception_processing): Setup interim_eh_hook to
-       call lang_interim_eh. 
-       * except.c (do_unwind): Propagate throw object value across
-       stack unwinding.
-       * except.c (saved_throw_value): Used to hold the value of the object
-       being thrown.  It is always a reference to the real value.
-       * except.c (expand_start_catch_block): Add handling for the
-       value of the exception object.
-       * except.c (expand_start_catch_block): Add handler for the handler,
-       so that throws inside the handler go to the outer block.
-       * except.c (expand_end_catch_block): Likewise.
-       * parse.y (handler_args): Use parm instead, as the other doesn't yet
-       handle references correctly.
-
-Wed Jul  6 17:55:32 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * decl2.c (mark_vtable_entries):  If -ftable-thunks, set the
-       vtable entry properly to abort.
-
-Tue Jul  5 14:07:54 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (build_binary_op_nodefault): Downgrade division by zero
-       errors to warnings.
-
-       * call.c (build_overload_call_real): Handle fnname being a list of
-       functions.
-       * typeck.c (build_x_function_call): Pass list of functions to
-       build_overload_call, not just the name.
-       * tree.c (count_functions): Complain when called for invalid
-       argument.
-
-       * decl.c (grokdeclarator): Fix settings of TREE_STATIC, TREE_PUBLIC
-       and DECL_EXTERNAL on static members and initialized const members.
-       * decl2.c (grokfield): Reflect this change.
-
-Fri Jul  1 09:35:51 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (init): ANSI C++ does not forbid { }.
-
-Thu Jun 30 00:35:22 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl2.c (lang_decode_option): Set warn_nonvdtor along with -Wall.
-       warn_nonvdtor defaults to off.
-
-       * class.c (instantiate_type): Use comptypes rather than relying on 
-       types to satisfy ==.
-
-       * decl.c (start_function): Set DECL_DEFER_OUTPUT on all inlines that
-       might be static.
-
-       * tree.c (build_cplus_new): Never build WITH_CLEANUP_EXPRs.
-
-       * decl.c (grok_reference_init): Deal with ADDR_EXPRs of TARGET_EXPRs.
-
-       * cvt.c (cp_convert): Pass 0 to with_cleanup_p arg of
-       build_cplus_new.
-
-Wed Jun 29 22:31:09 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl2.c (finish_file): Maybe consider static inlines multiple
-       times, in case they reference each other.
-
-Tue Jun 28 11:58:38 1994  Gerald Baumgartner  <gb@cs.purdue.edu>
-
-       * class.c (finish_struct): Don't `cons_up_default_function's
-       for signatures.
-       (finish_struct): Handle an empty method_vec correctly.
-
-       * decl.c (grokdeclarator): Don't warn about a signature being
-       empty in a signature pointer declaration if we only saw a
-       forward declaration of the signature.  Changed `warning's into
-       `cp_warning's.
-
-       * sig.c (build_sigtable): Don't die if a null signature table
-       constructor is returned.
-       (build_signature_pointer_constructor): If the signature table
-       constructor is null, the _sptr field is set to a null pointer
-       and cast to the appropriate type.  Make copies of all null
-       pointers so that the type null_pointer_node doesn't get changed.
-       (build_signature_table_constructor): Added comments.
-
-       * sig.c (build_signature_pointer_constructor): Complain if we
-       try to assign to/initialize a signature pointer/reference of
-       an undefined signature.
-
-Mon Jun 27 14:05:16 1994  Gerald Baumgartner  <gb@cs.purdue.edu>
-
-       * typeck2.c (store_init_value): Don't be pedantic about
-       non-constant initializers of signature tables/pointers/references.
-
-Fri Jun 24 16:49:41 1994  Gerald Baumgartner  <gb@cs.purdue.edu>
-
-       * decl.c (grokdeclarator): If we are grokking an opaque typedef
-       in a signature, don't complain about it begin static.
-
-Wed Jun 29 16:44:45 1994  Mike Stump  <mrs@cygnus.com>
-
-       Fixes a problem of the this pointer being wrong in virtual calls to
-       methods that are not overridden in more derived classes.
-
-       * class.c (fixup_vtable_delta): New routine.  It will fixup the
-       delta entries in vtables, wheever they need updating.
-       * class.c (finish_struct): Call the new routine for all virtual
-       bases, as they can have different offsets, than those used in base
-       classes that we derive our vtable from.
-
-Tue Jun 28 23:49:28 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (build_binary_op): Use the types before default
-       conversions in the error message.
-
-       * *.c: Use c_build_type_variant instead of build_type_variant where
-       the type might be an array.
-
-       * call.c (build_method_call): Call build_type_variant and
-       build_reference_type in the right order.
-       * decl.c (record_builtin_type): Likewise.
-
-Wed Jun 29 16:58:53 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * call.c (build_method_call): Call build_type_variant and
-       build_reference_type in the right order.
-       * decl.c (record_builtin_type): Likewise.
-
-Tue Jun 28 23:49:28 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (build_binary_op): Use the types before default
-       conversions in the error message.
-
-       * *.c: Use c_build_type_variant instead of build_type_variant where
-       the type might be an array.
-
-Sat Jun 25 11:50:54 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cvt.c (convert_to_reference): Try UDC's before doing the
-       reinterpret_cast thang, though.
-
-Fri Jun 24 01:24:01 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (c_expand_return): Don't USE the return value location
-       after we've expanded the jump.
-
-       * decl2.c (finish_file): Make sure DECL_SAVED_INSNS is not 0 before
-       trying to write out an inline.
-
-       * cvt.c (build_up_reference): Also do address adjustment when the
-       target type uses MI.
-       (convert_to_reference): Try UDCs only after built-in conversions.
-       (build_type_conversion_1): Don't play games with the argument to the
-       method.
-       (build_type_conversion): #if 0 out code for binding to reference.
-
-Thu Jun 23 00:22:28 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl2.c (finish_file): Use TREE_SYMBOL_REFERENCED to decide
-       whether to emit inlines.
-
-       * decl.c (grokdeclarator): Set explicit_int for decls that just
-       specify, say, 'long'.
-
-       * init.c (do_friend): Do overload C functions (or call pushdecl,
-       anyaway).
-
-Wed Jun 22 13:40:49 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cvt.c (build_up_reference): Don't call readonly_error.
-       (convert_to_reference): Propagate const and volatile from expr to
-       its type.
-
-       * tree.c (lvalue_p): Random CALL_EXPRs are not lvalues.
-
-       * cvt.c (build_up_reference): Break out WITH_CLEANUP_EXPR when
-       creating a temporary.
-       (convert_to_reference): Lose excessive and incorrect trickiness.
-       (cp_convert): Call build_cplus_new with with_cleanup_p set.
-
-       * typeck2.c (build_functional_cast): Likewise.
-
-Tue Jun 21 17:38:38 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grokdeclarator): signed, unsigned, long and short all
-       imply 'int'.
-
-       * decl.c (grokdeclarator): Allow "this is a type" syntax.
-       (grok_reference_init): Simplify and fix.
-
-Sun Jun 19 17:08:48 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grokdeclarator): pedwarn about a typedef that specifies no
-       type.
-
-Sat Jun 18 04:16:50 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (start_function): Move TREE_PUBLIC and DECL_EXTERNAL
-       tinkering to after call to pushdecl.
-
-Fri Jun 17 14:48:28 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * call.c (build_method_call): Handle destructors for non-aggregate
-       types properly.
-
-Thu Jun 16 16:48:05 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * call.c (build_method_call): Make sure that the name given for the
-       destructor matches the constructor_name of the instance.
-
-       * pt.c (do_function_instantiation): A non-extern instantiation
-       overrides a later extern one.
-       (do_type_instantiation): Likewise.
-
-Wed Jun 15 19:34:54 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * init.c (expand_aggr_init): Use TYPE_MAIN_VARIANT to get the
-       unqualified array type.
-
-       * cp-tree.h (EMPTY_CONSTRUCTOR_P): Tests whether NODE is a
-       CONSTRUCTOR with no elements.
-
-       * decl.c (various): Lose empty_init_node.
-       (finish_decl): Use EMPTY_CONSTRUCTOR_P, do the empty CONSTRUCTOR
-       thing depending on the value of DECL_COMMON instead of
-       flag_conserve_space, do the empty CONSTRUCTOR thing for types that
-       don't have constructors, don't treat a real empty CONSTRUCTOR
-       specially.
-
-       * typeck2.c (process_init_constructor): Don't treat empty_init_node
-       specially.
-
-Wed Jun 15 19:05:25 1994  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (override_one_vtable): Don't forget to merge in an old
-       overrider when we wanted to reuse a vtable, but couldn't.
-
-Wed Jun 15 15:03:16 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (start_decl): Put statics in common again.
-
-       * decl.c (grokdeclarator): Return NULL_TREE for an error rather than
-       setting the type to error_mark_node.
-
-       * typeck.c (build_modify_expr): Build up a COMPOUND_EXPR for enum
-       bitfield assignments.
-
-Tue Jun 14 12:23:38 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grok_op_properties): Const objects can be passed by value.
-
-Mon Jun 13 03:10:59 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl2.c (import_export_vtable): Force implicit instantiations to
-       be interface_only when -fno-implicit-templates.
-
-       * decl.c (duplicate_decls): Redeclaring a class template name is an
-       error.
-
-       * pt.c (end_template_decl): Call GNU_xref_decl for class templates.
-       * xref.c (GNU_xref_decl): Support templates.
-
-Sat Jun 11 17:09:05 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grok_op_properties): Split out checking for whether this
-       function should suppress the default assignment operator.
-       * decl2.c (grok_function_init): Likewise.
-       (copy_assignment_arg_p): New function do do just that.
-       Now considers virtual assignment operators that take a base as an
-       argument to count as copy assignment operators.
-
-       * search.c (dfs_debug_mark): Lose checks for DWARF_DEBUG and
-       TREE_ASM_WRITTEN, as they are redundant.
-
-       * pt.c (end_template_decl): Don't try to set DECL_CLASS_CONTEXT on a
-       decl that has no LANG_SPECIFIC part.
-       (do_type_instantiation): Force the debugging information for this
-       type to be emitted.
-
-       * decl.c (start_decl): Clear up uses of various types of templates
-       (say sorry for static data members, rather than "invalid template"). 
-       (expand_static_init): Fix initialization of static data members of
-       template classes.
-
-Fri Jun 10 00:41:19 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grokdeclarator): Set DECL_CONTEXT on static data members.
-
-       * g++.c (main): Use -xc++-cpp-output for .i files.
-
-       * pt.c (tsubst): Give meaningful error about declaring template for
-       a copy constructor which was not declared in the class template.
-       (do_type_instantiation): Explicit instantiation before the class
-       template is an error.
-       (instantiate_template): Don't die if tsubst returns error_mark_node.
-
-Thu Jun  9 19:04:59 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       Don't synthesize the copy assignment operator if the one in a base
-       class is pure virtual.
-       * cp-tree.h (TYPE_HAS_ABSTRACT_ASSIGN_REF): New macro to indicate
-       whether the type has a pure virtual copy assignment operator.
-       * class.c (finish_base_struct): Don't generate the copy assignment
-       operator if a base class has a pure virtual one.
-       * decl.c (grok_op_properties): Add disabled code to set
-       TYPE_HAS_ABSTRACT_ASSIGN_REF with comment pointing to where it is
-       actually set.
-       * decl2.c (grok_function_init): Set TYPE_HAS_ABSTRACT_ASSIGN_REF.
-
-       * decl2.c (import_export_vtable): Always treat template
-       instantiations as if write_virtuals >= 2, and treat implicit
-       instantiations as external if -fno-implicit-templates.
-       (finish_file): Output all pending inlines if
-       flag_keep_inline_functions.
-
-Wed Jun  8 20:48:02 1994  Mike Stump  <mrs@cygnus.com>
-
-       * tree.c (layout_vbasetypes): Align virtual base classes inside
-       complete objects, so that we don't core dump on machines such as
-       SPARCs when we access members that require larger than normal
-       alignments, such as a double.  Also, we bump up the total alignment
-       on the complete type, as necessary.
-
-Wed Jun  8 16:18:14 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * gxxint.texi (Free Store): New section with code for examining
-       cookie.
-       (Limitations of g++): Remove operator delete entry, since it is no
-       longer accurate.  Fix access control entry.
-
-       * typeck.c (build_unary_op): Pedwarn about taking the address of or
-       incrementing a cast to non-reference type.
-       (build_modify_expr): Use convert instead of convert_force again.
-
-       * search.c (get_base_distance): Use IS_AGGR_TYPE_CODE to check for
-       class type, not == RECORD_TYPE.
-
-       * decl.c (grokdeclarator): Cope with grokfndecl returning NULL_TREE.
-
-       * typeck2.c (report_case_error): #if 0 out.
-       * lex.c (real_yylex): Lose RANGE.
-       * parse.y: Likewise.
-
-Tue Jun  7 18:17:35 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (simple_stmt, case ranges): Use ELLIPSIS instead of RANGE.
-
-Mon Jun  6 19:39:57 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (build_c_cast): Don't shortcut conversions to the same
-       type.  Don't replace consts with their values here, since that's now
-       done in cp_convert.
-
-       * cvt.c (cp_convert): When converting to bool, take
-       integer_zero_node to false_node and all other INTEGER_CSTs to
-       true_node.
-       (build_type_conversion): Don't complain about multiple conversions
-       to float if we're not really converting.
-
-Fri Jun  3 02:10:56 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       Implement 'extern template class A<int>;' syntax for suppressing
-       specific implicit instantiations.
-       * cp-tree.h: Update prototypes for do_*_instantiation.
-       * pt.c (do_pending_expansions): Don't compile 'extern' explicit
-       instantiations.
-       (do_function_instantiation): Set DECL_EXTERNAL on 'extern' explicit
-       instantiations.
-       (do_type_instantiation): Likewise.
-       * parse.y (explicit_instantiation): Support 'extern template class
-       A<int>;' syntax.
-       * decl.c (start_function): Don't modify the settings of TREE_PUBLIC
-       and DECL_EXTERNAL on explicit instantiations.
-
-       * cvt.c (cp_convert): Replace constants with their values before
-       converting.
-       (cp_convert): Consistently use 'e' instead of 'expr'.
-
-Thu Jun  2 03:53:30 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck2.c (build_x_arrow): Resolve OFFSET_REFs first.
-
-Wed Jun  1 18:57:35 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck2.c (digest_init): Handle initializing a pmf with an
-       overloaded method.
-       * typeck.c (build_ptrmemfunc): Handle overloaded methods.
-
-       * decl.c (pushtag): Use build_decl to make TYPE_DECLs.
-       (xref_defn_tag): Likewise.
-       * pt.c (process_template_parm): Likewise.
-       (lookup_template_class): Likewise.
-       (push_template_decls): Likewise.
-       (instantiate_class_template): Likewise.
-       (create_nested_upt): Likewise.
-       * class.c (finish_struct): Don't try to set DECL_CLASS_CONTEXT on
-       TYPE_DECLs.
-
-       * typeck.c (convert_arguments): Make sure type is not NULL before
-       checking its TREE_CODE.
-
-Wed Jun  1 17:40:39 1994  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (get_derived_offset): New routine.
-       * class.c (finish_base_struct): Make sure we set BINFO_VTABLE and
-       BINFO_VIRTUALS when we choose a new base class to inherit from.
-       * class.c (modify_one_vtable): Use get_derived_offset to get the
-       offset to the most base class subobject that we derived this binfo
-       from.
-       * class.c (finish_struct): Move code to calculate the
-       DECL_FIELD_BITPOS of the vfield up, as we need might need it for
-       new calls to get_derived_offset in modify_one_vtable.
-
-Wed Jun  1 16:50:59 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * init.c (build_member_call): Use build_pointer_type instead of
-       TYPE_POINTER_TO.
-
-Wed Jun  1 11:11:15 1994  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl.c (grokdeclarator): Make sure we have a DNAME set before we
-       try to use it in an error.
-
-Wed Jun  1 09:48:49 1994  Mike Stump  <mrs@cygnus.com>
-
-       * typeck.c (convert_arguments, convert_for_initialization): Don't
-       strip NOP_EXPRs, when we are converting to a reference.
-
-Wed Jun  1 01:11:38 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (build_modify_expr): Don't dereference references when
-       initializing them.
-
-       * decl2.c (grokfield): Don't check for grokdeclarator returning
-       error_mark_node any more.
-
-       * decl.c (grokfndecl): Return NULL_TREE instead of error_mark_node.
-       (start_method): Return void_type_node instead of error_mark_node.
-
-       * typeck.c (build_modify_expr): Resolve offset refs earlier.
-
-Tue May 31 16:06:58 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * call.c (build_method_call): Resolve OFFSET_REFs in the object.
-
-       * typeck.c (build_modify_expr): Dereference references before trying
-       to assign to them.
-
-       * call.c (build_method_call): Don't confuse type conversion
-       operators with constructors.
-       * typeck2.c (build_functional_cast): Just call build_c_cast if there
-       was only one parameter.
-       * method.c (build_typename_overload): Don't set
-       IDENTIFIER_GLOBAL_VALUE on these identifiers.
-       * decl.c (grok_op_properties): Warn about defining a type conversion
-       operator that converts to a base class (or reference to it).
-       * cvt.c (cp_convert): Don't try to use a type conversion operator
-       when converting to a base class.
-       (build_type_conversion_1): Don't call constructor_name_full on an
-       identifier.
-       * cp-tree.h (DERIVED_FROM_P): Should be self-explanatory.
-
-       * decl.c (start_decl): Don't complain that error_mark_node is an
-       incomplete type.
-       (finish_decl): Check for type == error_mark_node.
-
-Mon May 30 23:38:55 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (start_function): Set DECL_DEFER_OUTPUT on implicit
-       instantiations and inline members.
-
-       * spew.c (yylex): Set looking_for_template if the next token is a '<'.
-
-       * lex.h: Declare looking_for_template.
-
-       * decl.c (lookup_name_real): Use looking_for_template to arbitrate
-       between type and template interpretations of an identifier.
-
-Sat May 28 04:07:40 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * pt.c (instantiate_template): Zero out p if we found a
-       specialization.
-
-       * decl.c (grokdeclarator): Elucidate warning.
-       (grokdeclarator): If pedantic AND -ansi, complain about long long.
-
-       Make explicit instantiation work reasonably.  It is now appropriate
-       to deprecate the use of -fexternal-templates.
-       * pt.c (instantiate_template): Set DECL_TEMPLATE_SPECIALIZATION or
-       DECL_IMPLICIT_INSTANTIATION on fndecl as appropriate.
-       (end_template_instantiation): Reflect changes in USE_TEMPLATE
-       semantics.
-       (do_pending_expansions): if (!flag_implicit_templates) DECIDE(0);
-       (do_function_instantiation): Don't set EXPLICIT_INST if
-       flag_external_templates is set.  Do set TREE_PUBLIC and DECL_EXTERN
-       appropriately otherwise.
-       (do_type_instantiation): Set interface info for class.  Set
-       TREE_PUBLIC and DECL_EXTERN for methods.  Do none of this if
-       flag_external_templates is set.
-       * parse.y: Reflect changes in USE_TEMPLATE semantics.
-       * decl2.c: New flag flag_implicit_templates determines whether or
-       not implicit instantiations get emitted.  This flag currently
-       defaults to true, and must be true for -fexternal-templates to work.
-       (finish_file): Consider flag_implement_inlines when
-       setting DECL_EXTERNAL.  Consider flag_implicit_templates when
-       deciding whether or not to emit a static copy.
-       * decl.c (start_function): Set TREE_PUBLIC and DECL_EXTERNAL
-       properly for template instantiations.
-       (start_method): Set DECL_IMPLICIT_INSTANTIATION on methods of a
-       template class.
-       * cp-tree.h (CLASSTYPE_USE_TEMPLATE): Change semantics.
-       (DECL_USE_TEMPLATE): Parallel macro for FUNCTION and VAR_DECLs.
-       (various others): Accessor macros for the above.
-
-Fri May 27 13:57:40 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (build_binary_op_nodefault): Division by constant zero is
-       an error.
-
-Fri May 27 13:50:15 1994  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (override_one_vtable): Don't modify things we don't own.
-
-Fri May 27 01:42:58 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (finish_decl): Don't postpone processing the initializer of
-       a decl with DECL_EXTERNAL set, and do call rest_of_compilation for a
-       PUBLIC const at toplevel.
-       (grokdeclarator): pedwarn about initializing non-const or
-       non-integral statics in the class body.
-
-       * decl.c (pushtag): Don't try to set DECL_CLASS_CONTEXT on a
-       TYPE_DECL.
-
-       * call.c (convert_harshness): Dereference reference on rhs before
-       proceeding, properly grok passing const things to non-const
-       references.
-
-       * typeck.c (build_unary_op): Soften error about taking the address
-       of main() to a pedwarn.
-
-       * lex.c (default_copy_constructor_body): Unambiguously specify base
-       classes (i.e. A((const class ::A&)_ctor_arg) ).
-       (default_assign_ref_body): Likewise.
-
-Thu May 26 13:13:55 1994  Gerald Baumgartner  <gb@mexican.cygnus.com>
-
-       * decl2.c (grokfield): Don't complain about local signature
-       method declaration without definition.
-
-       * call.c (convert_harshness): If `type' is a signature pointer
-       and `parmtype' is a pointer to a signature, just return 0.  We
-       don't really convert in this case; it's a result of making the
-       `this' parameter of a signature method a signature pointer.
-
-       * call.c (build_method_call): Distinguish calling the default copy
-       constructor of a signature pointer/reference from a signature
-       member function call.
-
-Thu May 26 12:56:25 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl2.c (grokfield): Don't set TREE_PUBLIC on member function
-       declarations.
-
-       * decl.c (duplicate_decls): A previous function declaration as
-       static overrides a subsequent non-static definition.
-       (grokdeclarator): Don't set TREE_PUBLIC on inline method
-       declarations.
-
-Wed May 25 14:36:38 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grokdeclarator): Handle initialization of static const
-       members.
-       (finish_decl): Likewise.
-
-       * decl2.c (grokfield): Allow initialization of static const members
-       even when pedantic.
-
-       * decl2.c (grokfield): Deal with grokdeclarator returning
-       error_mark_node.
-
-       * decl.c (grok_ctor_properties): Return 0 for A(A) constructor.
-       (grokfndecl): Check the return value of grok_ctor_properties.
-       (start_method): Likewise.
-
-       * parse.y (absdcl): Expand type_quals inline.
-
-Tue May 24 19:10:32 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (pushtag): Use IS_AGGR_TYPE rather than checking for a
-       RECORD_TYPE.
-
-Tue May 24 18:09:16 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * cp-tree.h (VTABLE_NAME_FORMAT):  If flag_vtable_thunks,
-       always use "__vt_%s".
-       * decl2.c (finish_vtable_vardecl):  Don't consider abstract virtuals
-       when looking for a "sentinal" method (to decide on emitting vtables).
-       * decl2.c (finish_file):  Scan all decls for thunks that need
-       to be emitted.
-       * decl2.c (finish_vtable_vardecl):  Don't bother calling emit_thunk.
-       * method.c (make_thunk):  Use a more meaningful label.  If there
-       exists a matching top-level THUNK_DECL re-use it;  otherwise
-       create a new THUNK_DECL (and declare it).
-       * method.c (emit_thunk):  Make thunk external/public depending
-       on the underlying method.
-
-Tue May 24 00:22:04 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * pt.c (tsubst): Use lookup_name_nonclass to find guiding decls, not
-       lookup_name.
-
-       * call.c (build_overload_call_real): Don't immediately pick a
-       function which matches perfectly.
-
-       * decl.c (grokdeclarator): Use c_build_type_variant for arrays.
-       (grokdeclarator): Warn about, and throw away, cv-quals attached to a
-       reference (like 'int &const j').
-
-       * typeck.c (convert_arguments): Don't mess with i for methods.
-       * call.c (build_method_call): Pass the function decl to
-       convert_arguments.
-
-       * typeck.c (comp_ptr_ttypes_real): New function.  Implements the
-       checking for which multi-level pointer conversions are allowed.
-       (comp_target_types): Call it.
-       (convert_for_assignment): Check const parity on the ultimate target
-       type, too.  And make those warnings pedwarns.
-
-Mon May 23 14:11:24 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * error.c (dump_char): Use TARGET_* for character constants.
-
-Mon May 23 13:03:03 1994  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * tree.c (debug_no_list_hash): Make static.
-
-       * decl.c (decls_match): Say the types don't match if newdecl ends up
-       with a null type, after we've checked if olddecl does.
-       (pushdecl): Check if the decls themselves match before looking for
-       an extern redeclared as static, to avoid inappropriate and incorrect
-       warnings.
-
-Fri May 20 14:04:34 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grokdeclarator): Make warning about duplicate short, etc.
-       a pedwarn.
-
-       * typeck.c (build_c_cast): Casting to function or method type is an
-       error.
-
-       * class.c (finish_struct): Make warning for anonymous class with no
-       instances a pedwarn.
-
-       * Makefile.in (stamp-parse): Expect a s/r conflict.
-
-       * typeck.c (build_modify_expr): pedwarn about using a non-lvalue
-       cast as an lvalue.
-
-Thu May 19 12:08:48 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cvt.c (type_promotes_to): Make sure bool promotes to int rather
-       than unsigned on platforms where sizeof(char)==sizeof(int).
-
-Wed May 18 14:27:06 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (build_c_cast): Tack on a NOP_EXPR when casting to
-       another variant.
-       (build_modify_expr): Don't strip NOP_EXPRs, and don't get tricky
-       and treat them as lvalues.
-
-       * decl.c (shadow_tag): Do complain about forward declarations of
-       enums and empty declarations.
-       * parse.y: Don't complain about forward declarations of enums and
-       empty declarations.
-
-       * typeck.c (convert_for_assignment): Complain about changing
-       the signedness of a pointer's target type.
-
-       * parse.y (stmt): Move duplicated code for checking case values from
-       here.
-       * decl2.c (check_cp_case_value): To here.  And add a call to
-       constant_expression_warning.
-
-       * typeck.c (convert_for_assignment): Don't complain about assigning
-       a negative value to bool.
-
-       * decl.c (init_decl_processing): Make bool unsigned.
-
-       * class.c (finish_struct): Allow bool bitfields.
-
-Wed May 18 12:35:27 1994  Ian Lance Taylor  <ian@tweedledumb.cygnus.com>
-
-       * Make-lang.in (c++.install-man): Get g++.1 from $(srcdir)/cp.
-
-Wed May 18 03:28:35 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cvt.c (build_type_conversion): Lose special handling of
-       truthvalues.
-
-       * search.c (dfs_pushdecls): Improve shadowing warning.
-
-Tue May 17 13:34:46 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * init.c (build_delete): Throw away const and volatile on `this'.
-
-       * decl.c (finish_enum): Put the constants in TYPE_VALUES again,
-       rather than the enumerators.
-       (pushtag): s/cdecl/c_decl/g
-
-Mon May 16 23:04:01 1994  Stephen R. van den Berg  <berg@pool.informatik.rwth-aachen.de>
-
-       * cp/typeck.c (common_type): Attribute merging.
-       (comp_types): Utilise COMP_TYPE_ATTRIBUTES macro.
-
-       * cp/parse.y: Revamp attribute parsing.
-
-Mon May 16 01:40:34 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (shadow_tag): Also check for inappropriate use of auto and
-       register.
-
-       * method.c (build_overload_name): Clarify that the illegal case is a
-       pointer or reference to array of unknown bound.
-
-       * error.c (dump_type_prefix): Print references to arrays properly.
-
-       * typeck.c (various): Be more helpful in pointer
-       comparison diagnostics.
-
-       * tree.c (lvalue_p): MODIFY_EXPRs are lvalues again.  Isn't this
-       fun?
-
-       * parse.y: Also catch an error after valid stmts.
-
-       * search.c (dfs_init_vbase_pointers): Don't abort because `this' is
-       const.
-
-       * typeck.c (convert_for_initialization): If call to
-       convert_to_reference generated a diagnostic, print out the parm
-       number and function decl if any.
-
-       * errfn.c (cp_thing): Check atarg1 to determine whether or not we're
-       specifying a line, not atarg.
-
-       * tree.c (build_cplus_method_type): Always make `this' const.
-
-       * decl2.c (grokclassfn): If -fthis-is-variable and this function is
-       a constructor or destructor, make `this' non-const.
-
-       * typeck.c (build_modify_expr): Don't warn specially about
-       assignment to `this' here anymore, since it will be caught by the
-       usual machinery.
-
-       * various: Disallow specific GNU extensions (variable-size arrays,
-       etc.) when flag_ansi is set, not necessarily when pedantic is set,
-       so that people can compile with -pedantic-errors for tighter const
-       checking and such without losing desirable extensions.
-
-       * typeck2.c (build_functional_cast): Call build_method_call with
-       LOOKUP_PROTECT.
-       (process_init_constructor): Only process FIELD_DECLs.
-
-       * decl.c (finish_decl): Also force static consts with no explicit
-       initializer that need constructing into the data segment.
-
-       * init.c (build_delete): Undo last patch, as it interferes with
-       automatic cleanups.
-
-Sat May 14 01:59:31 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * call.c, class.h, cp-tree.h, cvt.c, decl2.c: Lose old overloading
-       code.
-
-       * init.c (build_delete): pedwarn about using plain delete to delete
-       an array.
-
-Fri May 13 16:45:07 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (comp_target_types): Be more helpful in contravariance
-       warnings, and make them pedwarns.
-
-       * decl.c (grokdeclarator): Use decl_context to decide whether or not
-       this is an access declaration.
-
-       * class.c (finish_struct_bits): Set TYPE_HAS_INT_CONVERSION if it
-       has a conversion to enum or bool, too.
-
-Fri May 13 16:31:27 1994  Mike Stump  <mrs@cygnus.com>
-
-       * method.c (emit_thunk):  Make declaration for
-       current_call_is_indirect local (needed for hppa).
-
-Fri May 13 16:16:37 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * pt.c (uses_template_parms): Grok BOOLEAN_TYPE.
-       (tsubst): Likewise.
-
-Fri May 13 16:23:32 1994  Mike Stump  <mrs@cygnus.com>
-
-       * pt.c (tsubst): If there is already a function for this expansion,
-       use it.
-       * pt.c (instantiate_template): Likewise.
-
-Fri May 13 10:30:42 1994  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * parse.y (implicitly_scoped_stmt, simple_stmt case): Use
-       kept_level_p for MARK_ENDS argument to expand_end_bindings, to avoid
-       generating debug info for unemitted symbols on some systems.
-
-       * cp-tree.h (build_static_cast, build_reinterpret_cast,
-       build_const_cast): Add declarations.
-
-Fri May 13 09:50:31 1994  Mike Stump  <mrs@cygnus.com>
-
-       * search.c (expand_indirect_vtbls_init): Fix breakage from Apr 27
-       fix.  We now try get_binfo, and if that doesn't find what we want,
-       we go back to the old method, which still sometimes fails.
-
-Fri May 13 01:43:18 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (initdcl): Call cplus_decl_attributes on the right
-       variable.
-       * decl2.c (cplus_decl_attributes): Don't call decl_attributes for
-       void_type_node.
-
-       * typeck.c (build_binary_op_nodefault): Change result_type for
-       comparison ops to bool.
-       (build_binary_op): Convert args of && and || to bool.
-       * cvt.c (build_default_binary_type_conversion): Convert args of &&
-       and || to bool.
-       (build_default_unary_type_conversion): Convert arg of ! to bool.
-       (type_promotes_to): bool promotes to int.
-
-Fri May 13 01:43:18 1994  Mike Stump  <mrs@cygnus.com>
-
-       Implement the new builtin `bool' type.
-       * typeck.c (build_binary_op_nodefault): Convert args of && and || to
-       bool.
-       (build_unary_op): Convert arg of ! to bool.
-       * parse.y: Know true and false.  Use bool_truthvalue_conversion.
-       * method.c (build_overload_value): Know bool.
-       (build_overload_name): Likewise.
-       * lex.c (init_lex): Set up RID_BOOL.
-       * gxx.gperf: Add bool, true, false.
-       * error.c (*): Know bool.
-       * decl.c (init_decl_processing): Set up bool, true, false.
-       * cvt.c (cp_convert): Handle conversion to bool.
-       (build_type_conversion): Likewise.
-       * *.c: Accept bool where integers and enums are accepted (use
-       INTEGRAL_CODE_P macro).
-
-Thu May 12 19:13:54 1994  Richard Earnshaw  <rwe11@cl.cam.ac.uk>
-
-       * g++.c: Use #ifdef for __MSDOS__, not #if.
-
-Thu May 12 18:05:18 1994  Mike Stump  <mrs@cygnus.com>
-
-       * decl2.c (lang_f_options): Handle -fshort-temps.  -fshort-temps
-       gives old behavior , and destroys temporaries earlier.  Default
-       behavior now conforms to the ANSI working paper.
-
-Thu May 12 14:45:35 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (build_modify_expr): Understand MODIFY_EXPR as an lvalue.
-       Use convert_force to convert the result of a recursive call when we
-       are dealing with a NOP_EXPR.  Don't automatically wrap MODIFY_EXPRs
-       in COMPOUND_EXPRs any more.
-       (various): Lose pedantic_lvalue_warning.
-       (unary_complex_lvalue): Understand MODIFY_EXPR.
-
-       * cvt.c (convert_to_reference): Allow DECL to be error_mark_node if
-       we don't know what we're initializing.
-
-Wed May 11 01:59:36 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cvt.c (convert_to_reference): Modify to use convtype parameter.
-       Only create temporaries when initializing a reference, not when
-       casting.
-       (cp_convert): New main function.
-       (convert): Call cp_convert.
-       * cvt.c, decl.c, typeck.c: Fix calls to convert_to_reference.
-       * cp-tree.h (CONV_*): New constants used by conversion code for
-       selecting conversions to perform.
-
-       * tree.c (lvalue_p): MODIFY_EXPRs are no longer lvalues.
-
-       * typeck.c (build_{static,reinterpret,const_cast): Stubs that just
-       call build_c_cast.
-       * parse.y: Add {static,reinterpret,const}_cast.
-       * gxx.gperf: Likewise.
-
-       * typeck.c (common_type): Allow methods with basetypes of different
-       UPTs.
-       (comptypes): Deal with UPTs.
-       (build_modify_expr): Wrap all MODIFY_EXPRs in a COMPOUND_EXPR.
-
-       * pt.c (end_template_decl): Check for multiple definitions of member
-       templates.
-
-       * call.c (build_method_call): Complain about calling an abstract
-       virtual from a constructor.
-
-       * typeck.c (pointer_int_sum): Check for the integer operand being 0
-       after checking the validity of the pointer operand.
-
-       * typeck2.c (digest_init): Pedwarn about string initializer being
-       too long.
-
-Tue May 10 12:10:28 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (push_overloaded_decl): Only throw away a builtin if the
-       decl in question is the artificial one.
-
-       * parse.y (simple_stmt, switch): Use implicitly_scoped_stmt because
-       expand_{start,end}_case cannot happen in the middle of a block.
-
-       * cvt.c (build_type_conversion_1): Use convert again.
-
-Tue May 10 11:52:04 1994  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * typeck2.c (digest_init): Make sure we check for signed and
-       unsigned chars as well when warning about string initializers.
-
-       * init.c (emit_base_init): Check if there's a DECL_NAME on the
-       member before trying to do an initialization for it.
-
-Tue May 10 11:34:37 1994  Mike Stump  <mrs@cygnus.com>
-
-       * except.c: Don't do anything useful when cross compiling.
-
-Tue May 10 03:04:13 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (duplicate_decls): Fix up handling of builtins yet again.
-       (push_overloaded_decl): Likewise.
-
-       * cvt.c (convert): Don't look for void type conversion.
-
-Mon May  9 18:05:41 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * init.c (do_friend): Only do a pushdecl for friends, not
-       pushdecl_top_level.
-
-Mon May  9 13:36:34 1994  Jim Wilson  <wilson@sphagnum.cygnus.com>
-
-       * decl.c (lookup_name_current_level): Put empty statement after
-       the label OUT to make the code valid C.
-
-Mon May  9 12:20:57 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (build_binary_op_nodefault): Only complain about
-       comparing void * and a function pointer if void * is smaller.
-
-Sun May  8 01:29:13 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (lookup_name_current_level): Move through temporary binding
-       levels.
-
-       * parse.y (already_scoped_stmt): Revive.
-       (simple_stmt): Use it again.
-
-       * decl.c (poplevel): Always call poplevel recursively if we're
-       dealing with a temporary binding level.
-
-Sat May  7 10:52:28 1994  Mike Stump  <mrs@cygnus.com>
-
-       * decl.c (finish_decl): Make sure we run cleanups for initial values
-       of decls.  Cures memory leak.
-       * decl.c (expand_static_init): Likewise for static variables.
-       * decl2.c (finish_file): Likewise for globals.
-
-Sat May  7 03:57:44 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (commonparms): Don't complain about redefining default
-       args.
-
-       * decl.c (duplicate_decls): Don't complain twice about conflicting
-       function decls.
-       (decls_match): Don't look at default args.
-       (redeclaration_error_message): Complain about redefining default
-       args.
-
-       * call.c (build_overload_call_real): Also deal with guiding
-       declarations coming BEFORE the template decl.
-
-       * pt.c (unify): Allow different parms to have different
-       cv-qualifiers.
-       (unify): Allow trivial conversions on non-template parms.
-
-Fri May  6 03:53:23 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * pt.c (tsubst): Support OFFSET_TYPEs.
-       (unify): Likewise.
-
-       * decl2.c (finish_decl_parsing): Call push_nested_class with a type.
-
-       * init.c (build_offset_ref): Fix error message.
-       * search.c (lookup_field): Likewise.
-
-       * call.c (build_scoped_method_call): Pass binfo to
-       build_method_call.
-       * typeck.c (build_object_ref): Likewise.
-
-       * typeck2.c (binfo_or_else): Don't return a _TYPE.
-
-       * class.c (finish_struct): Don't complain about re-use of inherited
-       names or shadowing of type decls.
-       * decl.c (pushdecl_class_level): Likewise.
-
-       * decl.c (finish_enum): Set the type of all the enums.
-
-       * class.c (finish_struct): Don't get confused by access decls.
-
-       * cp-tree.h (TYPE_MAIN_DECL): New macro to get the _DECL for a
-       _TYPE.  You can stop using TYPE_NAME for that now.
-
-       * parse.y: Lose doing_explicit (check $0 instead).
-       * gxx.gperf: 'template' now has a RID.
-       * lex.h (rid): Likewise.
-       * lex.c (init_lex): Set up the RID for 'template'.
-
-       * parse.y (type_specifier_seq): typed_typespecs or
-       nonempty_type_quals.  Use it.
-       (handler_args): Fix bogus syntax.
-       (raise_identifier{,s}, optional_identifier): Lose.
-       * except.c (expand_start_catch_block): Use grokdeclarator to parse
-       the catch variable.
-       (init_exception_processing): The second argument to
-       __throw_type_match is ptr_type_node.
-
-       Fri May  6 07:18:54 1994  Chip Salzenberg  <chip@fin.uucp>
-
-       [ change propagated from c-decl.c of snapshot 940429 ]
-       * cp/decl.c (finish_decl): Setting asmspec_tree should not
-       zero out the old RTL.
-
-Fri May  6 01:25:38 1994  Mike Stump  <mrs@cygnus.com>
-
-       Add alpha exception handling support to the compiler.
-       Quick and dirty backend in except.c.
-
-       * cp/*:  Remove most remnants of old exception handling support.
-       * decl.c (finish_function): Call expand_exception_blocks to put
-       the exception hanlding blocks at the end of the function.
-       * dec.c (hack_incomplete_structures): Make sure expand_decl_cleanup
-       comes after expand_decl_init.
-       * except.c: Reimplementation.
-       * expr.c (cplus_expand_expr): Handle THROW_EXPRs.
-       * lex.c (init_lex): Always have catch, try and throw be reserved
-       words, so that we may always parse exception handling.
-       * parse.y: Cleanup to support new interface into exception handling.
-       * tree.def (THROW_EXPR): Add.
-
-Thu May  5 17:35:37 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (simple_stmt, for loops): Use implicitly_scoped_stmt.
-       (various): Lose .kindof_pushlevel and partially_scoped_stmt.
-
-Thu May  5 16:17:27 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * parse.y (already_scoped_stmt): move expand_end_binding() to
-       fix the unmatched LBB/LBE in stabs.
-
-Thu May  5 14:36:17 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (set_nested_typename): Set TREE_MANGLED on the new
-       identifiers.
-       (pushdecl): Check TREE_MANGLED.
-       (xref_tag): Likewise.
-       * cp-tree.h (TREE_MANGLED): This identifier is a
-       DECL_NESTED_TYPENAME (named to allow for future use to denote
-       mangled function names as well).
-
-       Implement inconsistency checking specified in [class.scope0].
-       * decl.c (lookup_name_real): Don't set ICV here after all.
-       (finish_enum): Also set the type of the enumerators themselves.
-       (build_enumerator): Put the CONST_DECL in the list instead of its
-       initial value.
-       (pushdecl_class_level): Check inconsistent use of a name in the
-       class body.
-       * class.c (finish_struct): Check inconsistent use of a name in the
-       class body.  Don't set DECL_CONTEXT on types here anymore.
-       * parse.y (qualified_type_name): Note that the identifier has now
-       been used (as a type) in the class body.
-       * lex.c (do_identifier): Note that the identifier has now been used
-       (as a constant) in the class body.
-       * error.c (dump_decl): Print type and enum decls better.
-
-Thu May  5 09:35:35 1994  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * typeck.c (build_modify_expr): Warn about assignment to `this'.
-
-Wed May  4 15:55:49 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * init.c (build_delete): Use the global operator delete when
-       requested.
-
-       * decl.c (lookup_name_real): If we find the type we're looking in a
-       base class while defining a class, set IDENTIFIER_CLASS_VALUE for
-       the type.
-
-       * class.c (finish_struct): Remove a couple of dependencies on
-       language linkage.
-
-       * decl.c (pushtag): Classes do nest in extern "C" blocks.
-       (pushdecl): Only set DECL_NESTED_TYPENAME on the canonical one for
-       the type.
-       (pushtag): Remove another dependency on the language linkage.
-
-       * lex.c (cons_up_default_function): Don't set DECL_CLASS_CONTEXT to
-       a const-qualified type.
-
-       * decl.c (push_overloaded_decl): Throw away built-in decls here.
-       (duplicate_decls): Instead of here.
-
-Wed May  4 15:27:40 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * typeck.c (get_member_function_from_ptrfunc):  Do The Right
-       Thing (I hope) if we're using thunks.
-
-Wed May  4 13:52:38 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (specialization): aggr template_type_name ';'.
-       (named_class_head_sans_basetype): Use it.
-       (explicit_instantiation): Likewise.
-       (tmpl.2): Revert.
-
-       * cvt.c (build_type_conversion_1): Use convert_for_initialization,
-       rather than convert, to do conversions after the UDC.
-
-       * cp-tree.h (SHARED_MEMBER_P): This member is shared between all
-       instances of the class.
-
-       * search.c (lookup_field): If the entity found by two routes is the
-       same, it's not ambiguous.
-
-Wed May  4 12:10:00 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * decl.c (lookup_name_real):  Check for a NULL TREE_VALUE,
-       to prevent the compiler from crashing ...
-
-Wed May  4 11:19:45 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * call.c (build_method_call): If we don't have an object, check
-       basetype_path to figure out where to look up the function.
-
-       * typeck.c (convert_for_initialization): Pass TYPE_BINFO (type) to
-       build_method_call in case exp is NULL_TREE.
-
-Tue May  3 16:02:53 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       Give a vtable entries a unique named type, for the sake of gdb.
-       * class.c (build_vtable_entry):  The addres of a thunk now has
-       type vtable_entry_type, not ptr_type_node.
-       * method.c (make_thunk):  Fix type of THUNK_DECL.
-       * class.c (add_virtual_function, override_one_vtable):  Use
-       vfunc_ptr_type_node, instead of ptr_type_node.
-       * cp-tree.h (vfunc_ptr_type_node):  New macro.
-       * decl.c (init_decl_processing):  Make vtable_entry_type
-       be a unique type of pointer to a unique function type.
-
-Tue May  3 09:20:44 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (do_explicit): Sets doing_explicit to 1.
-       (explicit_instantiation): Use do_explicit rather than TEMPLATE
-       directly, add "do_explicit error" rule.
-       (datadef): Set doing_explicit to 0 after an explicit instantiation.
-       (tmpl.2): Don't instantiate if we see a ';' unless we're doing an
-       explicit instantiation.
-       (named_class_head_sans_basetype): Remove aggr template_type_name
-       ';' again.
-
-Mon May  2 23:17:21 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * search.c (lookup_nested_tag): Lose.
-
-       * decl2.c (grokfield): Set DECL_CONTEXT on TYPE_DECLs.
-       (lookup_name_nonclass): Lose.
-
-       * decl.c (poplevel_class): Add force parameter.
-       (lookup_name_real): Fix handling of explicit scoping which specifies
-       a class currently being defined.  Add 'nonclass' argument.
-       (lookup_name, lookup_name_nonclass): Shells for lookup_name_real.
-
-       * class.c (finish_struct): Don't unset IDENTIFIER_CLASS_VALUEs here.
-       (popclass): Force clearing of IDENTIFIER_CLASS_VALUEs if we're being
-       called from finish_struct.
-
-Mon May  2 19:06:21 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * decl.c (init_decl_processing), cp-tree.h:  Removed memptr_type.
-       (It seeems redundant, given build_ptrmemfunc_type.)
-       * typeck.c (get_member_function_from_ptrfunc), gc.c (build_headof,
-       build_classof):  Use vtable_entry_type instead of memptr_type.
-       * method.c (emit_thunk):  Call poplevel with functionbody==0
-       to prevent DECL_INITIAL being set to a BLOCK.
-
-Mon May  2 15:02:11 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (named_class_head_sans_basetype): Add "aggr
-       template_type_name ';'" rule for forward declaration of
-       specializations.
-
-Mon May  2 15:02:11 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * class.c (instantiate_type): Deal with pmf's.
-
-       * Make-lang.in (cc1plus): Don't depend on OBJS or BC_OBJS, since
-       stamp-objlist does.
-
-       * Makefile.in (../cc1plus): Depend on OBJDEPS.
-       (OBJDEPS): Dependency version of OBJS.
-
-Mon May  2 12:51:31 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * search.c (dfs_debug_mark): unmark TYPE_DECL_SUPPRESS_DEBUG, not
-       DECL_IGNORED_P.
-
-Fri Apr 29 12:29:56 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * class.c (finish_struct): Clear out memory of local tags.  And
-       typedefs.
-
-       * decl2.c (grokclassfn): Don't set DECL_CONTEXT to a cv-qualified
-       type.
-       * search.c (get_matching_virtual): Be more helpful in error message.
-
-       * *: Use DECL_ARTIFICIAL (renamed from DECL_SYNTHESIZED).
-
-       * lex.c (default_assign_ref_body): Expect TYPE_NESTED_NAME to work.
-       (default_copy_constructor_body): Likewise.
-
-       * class.c (finish_struct): Don't gratuitously create multiple decls
-       for nested classes.
-
-Thu Apr 28 23:39:38 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       Avoid clobbering the arg types of other functions when reverting
-       static member functions.
-       * decl.c (revert_static_member_fn): Rearrange arguments, don't
-       require values for 'fn' and 'argtypes', add warning to comment
-       above.
-       (decls_match): Rearrange arguments in call to rsmf.
-       (grok_op_properties): Don't pass values for fn and argtypes.
-       * pt.c (instantiate_template): Don't pass values for fn and argtypes.
-
-Thu Apr 28 16:29:11 1994  Doug Evans  <dje@canuck.cygnus.com>
-
-       * Make-lang.in (cc1plus): Depend on stamp-objlist.
-       * Makefile.in (BC_OBJS): Delete.
-       (OBJS): Cat ../stamp-objlist to get language independent files.
-       Include ../c-common.o.
-       (../cc1plus): Delete reference to BC_OBJS.
-
-Thu Apr 28 02:12:08 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * search.c (compute_access): No really, deal with static members
-       properly.  Would I lie to you?
-
-       Implement lexical hiding of function declarations.
-       * pt.c (tsubst): Use lookup_name to look for function decls to guide
-       instantiation.
-       * method.c (build_opfncall): Use lookup_name_nonclass to look for
-       non-member functions.
-       * init.c (do_friend): Use lookup_name_nonclass to look for
-       functions.
-       * error.c (ident_fndecl): Use lookup_name to look for functions.
-       * decl2.c (lookup_name_nonclass): New function, skips over
-       CLASS_VALUE.
-       * decl.c (struct binding_level): Lose overloads_shadowed field.
-       (poplevel): Don't deal with overloads_shadowed.
-       (push_overloaded_decl): Do lexical hiding for functions.
-       * class.c (instantiate_type): Don't check non-members if we have
-       members with the same name.
-       * call.c (build_method_call): Use lookup_name_nonclass instead of
-       IDENTIFIER_GLOBAL_VALUE to check for non-member functions.
-       (build_overload_call_real): Likewise.
-
-       * decl.c (duplicate_decls): Check for ambiguous overloads here.
-       (push_overloaded_decl): Instead of here.
-       
-       * decl.c (pushdecl): Back out Chip's last change.
-
-       * decl.c (grok_op_properties): operators cannot be static members.
-
-       * cp-tree.h (DECL_SYNTHESIZED): DECL_SOURCE_LINE == 0
-       (SET_DECL_SYNTHESIZED): DECL_SOURCE_LINE = 0
-       * lex.c (cons_up_default_function): Use SET_DECL_SYNTHESIZED.
-
-       * method.c (do_inline_function_hair): Don't put friends of local
-       classes into global scope, either.
-
-       * typeck2.c (build_functional_cast): Don't look for a function call
-       interpretation.
-
-Thu Apr 28 15:19:46 1994  Mike Stump  <mrs@cygnus.com>
-
-       * cp-tree.h: disable use of backend EH.
-
-Wed Apr 27 21:01:24 1994  Doug Evans  <dje@canuck.cygnus.com>
-
-       * Make-lang.in (c++.distdir): mkdir tmp/cp first.
-       * Makefile.in (INCLUDES): Move definition to same place as
-       parent makefile.
-       (ALLOCA): Define.
-       (OLDAR_FLAGS): Delete.
-       (OLDCC): Define.
-       (DIR): Delete.
-       (CLIB): Define.
-       (####site): Delete.
-       (SUBDIR_USE_ALLOCA): Don't use ALLOCA if compiling with gcc.
-
-Wed Apr 27 19:10:04 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * decl.c (xref_tag): not to use strstr(), it's not available on
-       all platforms.
-
-Wed Apr 27 18:10:12 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * class.c (finish_struct): Resolve yet another class/pmf confusion.
-
-       * call.c (build_overload_call_real): Don't take the single-function
-       shortcut if we're dealing with an overloaded operator.
-
-Wed Apr 27 17:35:37 1994  Mike Stump  <mrs@cygnus.com>
-
-       * search.c (get_base_distance): Search the virtual base class
-       binfos, incase someone wants to convert to a real virtual base
-       class.
-       * search.c (expand_indirect_vtbls_init): Use convert_pointer_to_real
-       instead of convert_pointer_to, as it now will work.
-
-Wed Apr 27 15:36:49 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cvt.c (convert_to_reference): Don't complain about casting away
-       const and volatile.
-
-       * typeck.c (build_unary_op): References are too lvalues.
-
-Wed Apr 27 13:58:05 1994  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (override_one_vtable): We have to prepare_fresh_vtable
-       before we modify it, not after, also, we cannot reuse an old vtable,
-       once we commit to a new vtable.  Implement ambiguous overrides in
-       virtual bases as abstract.  Hack until we make the class
-       ill-formed.
-
-Wed Apr 27 01:17:08 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (unary_expr): Expand new_placement[opt] and
-       new_initializer[opt] inline.
-
-       * search.c (lookup_fnfields): Don't throw away the inheritance
-       information here, either.
-       (compute_access): Handle static members properly.
-
-       * init.c (build_member_call): Always set basetype_path, and pass it
-       to lookup_fnfields.
-
-       * search.c (lookup_field): Deal properly with the case where
-       xbasetype is a chain of binfos; don't throw away the inheritance
-       information.
-       (compute_access): protected_ok always starts out at 0.
-
-       * init.c (resolve_offset_ref): Don't cast `this' to the base type
-       until we've got our basetype_path.
-
-       * cp-tree.h (IS_OVERLOAD_TYPE): aggregate or enum.
-
-       * cvt.c (build_up_reference): Use build_pointer_type rather than
-       TYPE_POINTER_TO.
-
-       * call.c (convert_harshness_ansi): Call type_promotes_to for reals
-       as well.
-
-       * cvt.c (type_promotes_to): Retain const and volatile, add
-       float->double promotion.
-
-       * decl.c (grokdeclarator): Don't bash references to arrays into
-       references to pointers in function parms.  Use type_promotes_to.
-
-Tue Apr 26 23:44:36 1994  Mike Stump  <mrs@cygnus.com>
-
-       Finish off Apr 19th work.
-
-       * class.c (finish_struct_bits): Rename has_abstract_virtuals to
-       might_have_abstract_virtuals.
-       * class.c (strictly_overrides, override_one_vtable,
-       merge_overrides): New routines to handle virtual base overrides.
-       * class.c (finish_struct): Call merge_overrides to handle overrides
-       in virtual bases.
-
-Tue Apr 26 12:45:53 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (build_function_call): Call build_function_call_real with
-       LOOKUP_NORMAL.
-
-       * *: Don't deal with TYPE_EXPRs.
-
-       * tree.c (lvalue_p): If the type of the expression is a reference,
-       it's an lvalue.
-
-       * cvt.c (convert_to_reference): Complain about passing const
-       lvalues to non-const references.
-       (convert_from_reference): Don't arbitrarily throw away const and
-       volatile on the target type.
-
-       * parse.y: Simplify and fix rules for `new'.
-
-       * decl.c (grok_op_properties): operator void is illegal.
-
-Mon Apr 25 02:36:28 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (components): Anonymous bitfields can still have declspecs.
-
-       * decl.c (pushdecl): Postpone handling of function templates like we
-       do C functions.
-
-       * search.c (expand_indirect_vtbls_init): Fix infinite loop when
-       convert_pointer_to fails.
-
-       * call.c (compute_conversion_costs_ansi): A user-defined conversion
-       by itself is better than that UDC followed by standard conversions.
-       Don't treat integers and reals specially.
-
-       * cp-tree.h: Declare flag_ansi.
-
-       * typeck.c (c_expand_return): pedwarn on return in void function
-       even if the expression is of type void.
-       (build_c_cast): Don't do as much checking for casts to void.
-       (build_modify_expr): pedwarn about array assignment if this code
-       wasn't generated by the compiler.
-
-       * tree.c (lvalue_p): A comma expression is an lvalue if its second
-       operand is.
-
-       * typeck.c (default_conversion): Move code for promoting enums and
-       ints from here.
-       * cvt.c (type_promotes_to): To here.
-       * call.c (convert_harshness_ansi): Use type_promotes_to.  Also fix
-       promotion semantics for reals.
-
-Sun Apr 24 16:52:51 1994  Doug Evans  <dje@canuck.cygnus.com>
-
-       * Make-lang.in (c++.install-common): Check for g++-cross.
-       * Makefile.in: Remove Cygnus cruft.
-       (config.status): Delete.
-       (RTL_H): Define.
-       (TREE_H): Use complete pathname, some native makes have minimal
-       VPATH support.
-       (*.o): Use complete pathname to headers in parent dir.
-       (doc, info, dvi): Delete.
-
-Sun Apr 24 16:52:51 1994  Doug Evans  <dje@canuck.cygnus.com>
-
-       * Make-lang.in (c++.install-common): Check for g++-cross.
-       * Makefile.in: Remove Cygnus cruft.
-       (config.status): Delete.
-       (RTL_H): Define.
-       (TREE_H): Use complete pathname, some native makes have minimal
-       VPATH support.
-       (*.o): Use complete pathname to headers in parent dir.
-       (doc, info, dvi): Delete.
-
-Sun Apr 24 00:47:49 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (pushdecl): Avoid redundant warning on redeclaring function
-       with different return type.
-       (decls_match): Compare return types strictly.
-
-Fri Apr 22 12:55:42 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cvt.c (build_type_conversion): Do try to convert through other
-       pointers.  This will fail if the class defines multiple pointer
-       conversions.
-
-       * error.c (dump_type_prefix): Print out pointers to arrays properly.
-       (dump_type_suffix): Likewise.  (was 'int *[]', now 'int (*)[]')
-
-       * typeck.c (build_unary_op): Disallow ++/-- on pointers to
-       incomplete type.
-
-       * decl.c (duplicate_decls): Check mismatched TREE_CODES after
-       checking for shadowing a builtin.  If we're redeclaring a builtin
-       function, bash the old decl to avoid an ambiguous overload.
-
-       * cvt.c (convert_to_reference): Don't force arrays to decay here.
-
-       * tree.c (lvalue_p): A MODIFY_EXPR is an lvalue.
-
-       * decl.c (duplicate_decls): Don't assume that the decls will have
-       types.
-
-       Mon Apr 18 11:35:32 1994  Chip Salzenberg  <chip@fin.uucp>
-
-       [ cp/* changes propagated from c-* changes in 940318 snapshot ]
-       * c-decl.c (pushdecl): Warn if type mismatch with another external decl
-       in a global scope.
-
-       Fri Apr 22 06:38:56 1994  Chip Salzenberg  <chip@fin.uucp>
-
-       * cp/typeck2.c (signature_error): Use cp_error for "%T".
-
-       Mon Apr 18 11:59:59 1994  Chip Salzenberg  <chip@fin.uucp>
-
-       [ cp/* changes propagated from c-* changes in 940415 snapshot ]
-       * cp/decl.c (duplicate_decls, pushdecl, builtin_function):
-       Use DECL_FUNCTION_CODE instead of DECL_SET_FUNCTION_CODE.
-
-       Mon Apr 18 11:55:18 1994  Chip Salzenberg  <chip@fin.uucp>
-
-       [ cp/* changes propagated from c-* changes in 940409 snapshot ]
-       * cp/decl.c (duplicate_decls): Put new type in same obstack as
-       old ones, or permanent if old ones in different obstacks.
-
-       Mon Apr 18 11:48:49 1994  Chip Salzenberg  <chip@fin.uucp>
-
-       [ cp/* changes propagated from c-* changes in 940401 snapshot ]
-       * cp/parse.y (attrib): Handle string args as expressions,
-       merging the two rules.  `mode' attribute now takes a string arg.
-       Delete the rule for an identifier as arg.
-
-       Mon Apr 18 11:24:00 1994  Chip Salzenberg  <chip@fin.uucp>
-
-       [ cp/* changes propagated from c-* changes in 940312 snapshot ]
-       * cp/typeck.c (pointer_int_sum): Multiplication should be done signed.
-       (pointer_diff): Likewise the division.
-
-       Sun Mar  6 19:43:39 1994  Chip Salzenberg  <chip@fin.uucp>
-
-       [ cp/* changes propagated from c-* changes in 940304 snapshot ]
-       * cp/decl.c (finish_decl): Issue warning for large objects,
-       if requested.
-
-       Sat Feb 19 22:20:32 1994  Chip Salzenberg  <chip@fin.uucp>
-
-       [ cp/* changes propagated from c-* changes in 940218 snapshot ]
-       * cp/parse.y (attrib): Handle attribute ((section ("string"))).
-       * cp/decl.c (duplicate_decls): Merge section name into new decl.
-
-       Tue Feb  8 09:49:17 1994  Chip Salzenberg  <chip@fin.uucp>
-
-       [ cp/* changes propagated from c-* changes in 940206 snapshot ]
-       * cp/typeck.c (signed_or_unsigned_type): Check for any
-       INTEGRAL_TYPE_P not just INTEGER_TYPE.
-
-       Mon Dec  6 13:35:31 1993  Norbert Kiesel  (norbert@i3.INformatik.rwth-aachen.DE)
-
-       * cp/decl.c (finish_enum): Start from 0 when determining precision
-       for short enums.
-
-       Fri Dec  3 17:07:58 1993  Ralph Campbell  (ralphc@pyramid.COM)
-
-       * cp/parse.y (unary_expr): Look at $1 for tree_code rather than
-       casting $$.
-
-       Wed Nov 17 19:22:09 1993  Chip Salzenberg  <chip@fin.uucp>
-
-       * cp/typeck.c (build_binary_op_nodefault): Propagate code
-       from C front-end to optimize unsigned short division.
-       (build_conditional_expr): Fix bug in "1 ? 42 : (void *) 8".
-
-       Wed Nov 17 19:17:18 1993  Chip Salzenberg  <chip@fin.uucp>
-
-       * cp/call.c (convert_harshness_ansi): Given an (e.g.) char
-       constant, prefer 'const char &' to 'int'.
-
-       Wed Feb  3 13:11:48 1993  Chip Salzenberg  <chip@fin.uucp>
-
-       * cp/class.c (finish_struct_methods):  Handle multiple
-       constructors in fn_fields list.
-
-Fri Apr 22 12:48:10 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * class.c (finish_struct): use TYPE_DECL_SUPPRESS_DEBUG to flag
-       types not to be dumped in stabs, like types in #pragma interface.
-       * decl.c (init_decl_processing): use TYPE_DECL_SUPPRESS_DEBUG to
-       mark unknown type.
-
-Fri Apr 22 03:27:26 1994  Doug Evans  <dje@cygnus.com>
-
-       * Language directory reorganization.
-       See parent makefile.
-
-Thu Apr 21 18:27:57 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * cp-tree.h (THUNK_DELTA):  It is normally negative, so
-       use signed .i variant of frame_size rather than unsigned .u.
-       * cp-tree.h (VTABLE_NAME_FORMAT):  If flag_vtable_thunks,
-       use "VT" rather than "vt" due to binary incompatibility.
-       * class.c (get_vtable_name):  Use strlen of VTABLE_NAME_FORMAT,
-       rather than sizeof, since it is now an expression.
-       * class.c (modify_one_vtable):  Modify to skip initial element
-       containing a count of the vtable.
-
-Thu Apr 21 00:09:02 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * lex.c (check_newline): Force interface_unknown on main input file.
-
-       * pt.c (do_pending_expansions): Always emit functions that have been
-       explicitly instantiated.
-       (do_function_instantiation): Set DECL_EXPLICITLY_INSTANTIATED.
-       (do_type_instantiation): Set CLASSTYPE_VTABLE_NEEDS_WRITING and
-       DECL_EXPLICITLY_INSTANTIATED on all my methods.
-       * parse.y (explicit_instantiation): Call do_type_instantiation for
-       types.
-       * decl2.c (finish_vtable_vardecl): Call import_export_vtable.
-       * decl.c (start_function): Don't set DECL_EXTERNAL on a function
-       that has been explicitly instantiated.
-       * cp-tree.h (DECL_EXPLICITLY_INSTANTIATED): Alias for
-       DECL_LANG_FLAG_4.
-       * class.c: Move import_export_vtable to decl2.c, and comment out all
-       uses.
-
-Wed Apr 20 16:51:06 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * lex.c (process_next_inline): Don't muck with DECL_INLINE.
-       (do_pending_inlines): Likewise.
-
-Tue Apr 19 22:25:41 1994  Mike Stump  <mrs@cygnus.com>
-
-       Reimplement vtable building, and most vtable pointer setting.
-       Allows for earier maintenance, easier understandability, and most
-       importantly, correct semantics.
-
-       * class.c (build_vtable): Removed unneeded
-       SET_BINFO_VTABLE_PATH_MARKED.
-       * class.c (prepare_fresh_vtable): Likewise.  Added argument.
-       * class.c (modify_vtable_entry): General cleanup.
-       * class.c (related_vslot, is_normal, modify_other_vtable_entries,
-       modify_vtable_entries): Removed.
-       * class.c (add_virtual_function): General cleanup.
-       * class.c (finish_base_struct): Setup BINFO_VTABLE and
-       BINFO_VIRTUALS as early as we can, so that modify_all_vtables can
-       work.
-       * class.c (finish_vtbls): New routine, mostly from
-       unmark_finished_struct.
-       * class.c (overrides): New routine.
-       * class.c (modify_one_vtable): New routine, mostly from
-       modify_other_vtable_entries and modify_vtable_entries.
-       * class.c (modify_all_direct_vtables, modify_all_indirect_vtables,
-       modify_all_vtables): New routines.
-       * class.c (finish_struct): Added arguemnt to prepare_fresh_vtable
-       call.  General cleanup on how pending_hard_virtuals are handled.
-       General cleanup on modifying vtables.  Use finish_vtbls, instead of
-       unmark_finished_struct.
-       * cp-tree.h (init_vtbl_ptrs, expand_direct_vtbls_init,
-       get_first_matching_virtual, get_matching_virtual,
-       expand_vbase_vtables_init,  expand_indirect_vtbls_init): Update.
-       * cvt.c (convert_pointer_to_real): cleanup error message.
-       * decl.c (grokfndecl): General cleanup.
-       * decl.c (finish_function): Change init_vtbl_ptrs call to
-       expand_direct_vtbls_init.  Change expand_vbase_vtables_init call to
-       expand_indirect_vtbls_init.
-       * init.c (expand_virtual_init): Remove unneeded argument.
-       * init.c (init_vtbl_ptrs): Rename to expand_direct_vtbls_init, added
-       two arguments to make more general.  Made more general.  Now can be
-       used for vtable pointer initialization from virtual bases.
-       * init.c (emit_base_init): Change expand_vbase_vtables_init call to
-       expand_indirect_vtbls_init.  Change init_vtbl_ptrs call to
-       expand_direct_vtbls_init.
-       * init.c (expand_virtual_init): General cleanup.
-       * init.c (expand_default_init): Change expand_vbase_vtables_init
-       call to expand_indirect_vtbls_init.
-       * init.c (expand_recursive_init_1): Change expand_vbase_vtables_init
-       call to expand_indirect_vtbls_init.
-       * init.c (expand_recursive_init): Change expand_vbase_vtables_init
-       call to expand_indirect_vtbls_init.
-       * search.c (get_first_matching_virtual): Rename to
-       get_matching_virtual.  General cleanup and remove setting of
-       DECL_CONTEXT.  That is now done in a cleaner way in
-       modify_vtable_entry and add_virtual_function.
-       * search.c (expand_vbase_vtables_init): Rename to
-       expand_indirect_vtbls_init.  General cleanup.  Use
-       expand_direct_vtbls_init to do hard work.  Ensures that _all_ vtable
-       pointers from virtual bases are set up.
-       * search.c (bfs_unmark_finished_struct, unmark_finished_struct):
-       Removed.
-
-       * *.[chy]: Remove support for VTABLE_USES_MASK.
-
-Tue Apr 19 12:51:59 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cvt.c (convert_to_reference): Use NOP_EXPRs to switch between
-       reference and pointer types instead of bashing the types directly.
-
-       * call.c (build_overload_call_real): Use the TREE_CODE to determine
-       whether the function is overloaded or not, rather than
-       TREE_OVERLOADED.
-       * *: Remove all uses of TREE_OVERLOADED.
-
-       * decl.c (grokdeclarator): Only complain about initializing const
-       fields when -ansi or -pedantic.
-
-Tue Apr 19 12:42:42 1994  Doug Evans  <dje@canuck.cygnus.com>
-
-       * cp-tree.h (THUNK_DELTA): frame_size is now a union.
-
-Mon Apr 18 00:17:13 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       Do overloading on a block-by-block basis, not function-by-function.
-       * decl.c: Lose overloads_to_forget.
-       (struct binding_level): Add overloads_shadowed field.
-       (poplevel): Restore overloads_shadowed.
-       (push_overloaded_decl): Use overloads_shadowed instead of
-       overloads_to_forget.
-       (finish_function): Don't look at overloads_to_forget.
-
-       Copy enum_overflow logic from c-decl.c.
-       * decl.c (start_enum): Initialize enum_overflow.
-       (build_enumerator): Use enum_overflow.  Also use current_scope().
-
-       * search.c (current_scope): Move Brendan's comment from
-       build_enumerator here.
-
-       * typeck.c (convert_for_assignment): Change warnings to pedwarns for
-       discarding const/volatile.
-
-Sat Apr 16 01:18:21 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (comp_target_parms): Accept TEMPLATE_TYPE_PARMs on the rhs.
-       (comp_target_types): Likewise.
-
-       * decl.c (lookup_name): Don't unset got_scope here.
-
-       * spew.c (yylex): Only replace yylval with the TYPE_NESTED_NAME if
-       got_scope != NULL_TREE.
-
-Fri Apr 15 16:36:33 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       Horrible kludge to prevent templates from being instantiated by
-       their base classes.
-       * parse.y (template_instantiate_once): Unset TYPE_BEING_DEFINED
-       before we get to left_curly.
-       * pt.c (instantiate_class_template): Set TYPE_BEING_DEFINED.
-
-       * error.c (dump_decl): If it's a typedef, print out the name of the
-       decl, not just the underlying type.
-
-       * decl.c (pushdecl): If the old duplicate decl was a TYPE_DECL,
-       update the IDENTIFIER_TYPE_VALUE of its name.
-
-       * decl2.c (finish_file): When processing the initializer for a
-       static member, pretend that the dummy function is a member of the
-       same class.
-
-Fri Apr 15 15:56:35 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * class.c (build_vtable_entry): revert Apr 4 change.
-       * decl2.c (mark_vtable_entries): replace pure virtual function
-       decl with abort's.
-
-Fri Apr 15 13:49:33 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (build_conditional_expr): Pedwarn on pointer/integer
-       mismatch, and don't pedwarn on 0/function pointer mismatch.
-
-       * typeck2.c (digest_init): Lose code for special handling of unions.
-       (process_init_constructor): Since they're handled just fine here.
-       Pedwarn on excess elements.
-
-       * decl2.c (grokfield): Complain about local class method declaration
-       without definition.
-
-Fri Apr 15 13:19:40 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * method.c (emit_thunk):  Add extern declaration for
-       current_call_is_indirect (needed for hppa).
-
-Thu Apr 14 16:12:31 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       Improve local class support; allow classes in different blocks to
-       have the same name.
-       * decl.c (pushtag): Support local classes better.
-       (pushdecl_nonclass_level): New function for pushing mangled decls of
-       nested types into the appropriate scope.
-       (xref_defn_tag): Use pushdecl_nonclass_level instead of
-       pushdecl_top_level. 
-       (grokfndecl): Don't mess with IDENTIFIER_GLOBAL_VALUE for local
-       class methods.
-       * method.c (do_inline_function_hair): Likewise.
-
-       * class.c (finish_struct): It is legal for a class with no
-       constructors to have nonstatic const and reference members.
-
-Thu Apr 14 07:15:11 1994  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * decl.c (push_overloaded_decl): Avoid giving errors about
-       built-ins, since duplicate_decls will have given warnings/errors
-       for them.
-
-Thu Apr 14 03:45:12 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cvt.c (convert_to_reference): Warn about casting pointer type to
-       reference type when this is probably not what they wanted.
-
-Wed Apr 13 13:12:35 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * decl.c (finish_decl):  Don't mindlessly set TREE_USED for
-       static consts any more (toplev.c has now been modified to
-       not emit warnings if they are unused).
-
-Wed Apr 13 00:22:35 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grok_op_properties): If op new/delete get here with
-       METHOD_TYPEs, do a revert_static_member_fn.
-
-       * cp-tree.h (IDENTIFIER_CLASS_TYPE_VALUE): Lose.
-       * init.c (is_aggr_typedef): Don't look at
-       IDENTIFIER_CLASS_TYPE_VALUE.
-       (get_aggr_from_typedef): Likewise.
-       (get_type_value): Likewise.
-       * call.c (build_scoped_method_call): Don't rely on overloaded
-       template names having IDENTIFIER_CLASS_VALUE set.
-
-       * parse.y (component_decl_1, fn.def2): Revert rules for
-       constructors.
-       (component_decl_1, fn.def2): Use $1 instead of $$, since $$ is being
-       clobbered.
-
-       * decl.c (start_function): Only warn about `void main()' if pedantic
-       || warn_return_type.
-
-Tue Apr 12 02:14:17 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       Clean up overloading of the template name.
-       * class.c (pushclass): overload the template name whenever pushing
-       into the scope of a template class, not just if it is
-       uninstantiated.
-       (popclass): Correspondingly.
-       * search.c (push_class_decls): Don't overload_template_name.
-       * pt.c (overload_template_name): Don't set IDENTIFIER_LOCAL_VALUE or
-       DECL_CONTEXT on things.
-       * parse.y (left_curly): Don't overload_template_name.
-       * class.c (finish_struct): Don't undo_template_name_overload.
-
-       * method.c (build_opfncall): Only pass one argument to global op
-       delete.
-
-       * call.c (build_method_call): Use TYPE_VEC_DELETE_TAKES_SIZE to
-       decide how many arguments to use for vec delete.
-
-       * decl.c (grok_op_properties): Be consistent in modifying
-       current_class_type.
-       (grokdeclarator): Only complain about function decls with no return
-       type if we're being pedantic.
-
-Mon Apr 11 00:10:53 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       Add support for operator new [] and operator delete [].
-
-       * tree.def: Add VEC_NEW_EXPR and VEC_DELETE_EXPR.
-       * ptree.c (print_lang_type): Indicate vec new/delete.
-       * parse.y: Support vec new/delete.
-       * method.c (build_decl_overload): Deal with vec new/delete.
-       (build_opfncall): Likewise.
-       * lex.c (init_lex): Set up values of ansi_opname and opname_tab for
-       vec new/delete.  vec new uses "__vn", and vec delete uses "__vd".
-       * init.c (init_init_processing): Set up BIVN and BIVD.
-       (do_friend): Don't clean up after mistaken setting of TREE_GETS_NEW,
-       since it doesn't happen any more.
-       (build_new): Support vec new.  Always call something.
-       (build_x_delete): Support vec delete.
-       (build_vec_delete): Lose dtor_dummy argument, add use_global_delete,
-       and pass it to build_x_delete.
-       * decl2.c (delete_sanity): Don't change behavior by whether or not
-       the type has a destructor.  Pass use_global_delete to
-       build_vec_delete.
-       (coerce_delete_type): Make sure that the type returned has a first
-       argument of ptr_type_node.
-       * decl.c (init_decl_processing): Also declare the global vec
-       new/delete.
-       (grokdeclarator): Also force vec new/delete to be static.
-       (grok_op_properties): Note presence of vec new/delete, and play with
-       their args.  If vec delete takes the optional size_t argument, set
-       TYPE_VEC_DELETE_TAKES_SIZE.
-       * cp-tree.h (TYPE_GETS_{REG,VEC}_DELETE): New macros to simplify
-       checking for one delete or the other.
-       (lang_type): gets_new and gets_delete are now two bits long.  The
-       low bit is for the non-array version.  Lose gets_placed_new.
-       (TYPE_VEC_DELETE_TAKES_SIZE): New macro indicating that the vec
-       delete defined by this class wants to know how much space it is
-       deleting.
-       (TYPE_VEC_NEW_USES_COOKIE): New macro to indicate when vec new must
-       add a header containing the number of elements in the vector; i.e.
-       when the elements need to be destroyed or vec delete wants to know
-       the size.
-       * class.c (finish_struct_methods): Also check for overloading vec
-       delete.
-       * call.c (build_method_call): Also delete second argument for vec
-       delete.
-
-       * decl.c (grokdeclarator): Correct complaints again.
-       (grokdeclarator): Fix segfault on null declarator.
-       (decls_match): Also accept redeclaration with no arguments if both
-       declarations were in C context.  Bash TREE_TYPE (newdecl) here.
-       (duplicate_decls): Instead of here.
-
-       * parse.y (nested_name_specifier_1): Lose rules for dealing with
-       syntax errors nicely, since they break parsing of 'const i;'.
-
-       * decl.c (lookup_name): if (got_scope == current_class_type)
-       val = IDENTIFIER_CLASS_VALUE (name).
-
-       * search.c (lookup_nested_tag): Look in enclosing classes, too.
-
-       * spew.c (yylex): Only look one character ahead when checking for a
-       SCOPE.
-
-       * lex.c (check_newline): Read first nonwhite char before
-       incrementing lineno.
-
-       * decl.c (grokdeclarator): Don't claim that typedefs are variables
-       in warning.
-
-       * parse.y: Divide up uses of unqualified_id into
-       notype_unqualified_id and unqualified_id, so that TYPENAME can be
-       used as an identifier after an object.
-
-       * class.c (push_nested_class): Don't push into non-class scope.
-
-       * decl.c (grokdeclarator): If an identifier could be a type
-       conversion operator, but has no associated type, it's not a type
-       conversion operator.
-
-       * pt.c (unify): Check for equality of constants better.
-
-       * decl.c (grokdeclarator): Don't complain about access decls.
-
-Sun Apr 10 02:39:55 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grokdeclarator): pedwarn about data definitions without
-       types here.
-
-       * parse.y (datadef): Don't pedwarn about decls without types here,
-       since that is valid for functions.
-       (fn.def2, component_decl): Support constructors with declmods again.
-       (nomods_initdecls): For decls without any mods, so that we don't try
-       to get declspecs from some arbitrary $0.
-
-       * search.c (lookup_field): Use cp_error.
-
-       * parse.y (nested_name_specifier_1): Don't check aggr/non-aggr type
-       here; it breaks destructors for non-aggr types.
-
-       * decl.c (lookup_name): Only look for TYPE_DECLs in base classes of
-       a type being defined, like the comment says.
-       If got_scope is not an aggregate, just return NULL_TREE.
-
-       * pt.c (create_nested_upt): Kung's code for creating types nested
-       within uninstantiated templates now lives here (it used to live in
-       hack_more_ids).  It needs to be expanded.
-
-       * parse.y: Stop calling see_typename so much.
-
-       * decl.c (lookup_name): Deal with TTPs and UPTs.
-
-       * lex.c (real_yylex): Don't set looking_for_typename just because we
-       saw a 'new'.
-       (dont_see_typename): #if 0 out.
-
-       * spew.c (yylex): Increment looking_for_typename if the next
-       character is SCOPE, rather than setting it to 1; this way, the value
-       from seeing an aggr specifier will not be lost.  This kinda relies
-       on looking_for_typename never being < 0, which is now true.
-
-       * parse.y (nested_name_specifier_1): Accept TEMPLATE_TYPE_PARMs,
-       too.
-       (named_class_head_sans_basetype): Accept template types, too.  Oops.
-
-Fri Apr  8 16:39:35 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl2.c (reparse_decl_as_expr1): Handle SCOPE_REFs.
-
-       * parse.y: Lose START_DECLARATOR.
-
-       * search.c (lookup_nested_tag): New function to scan CLASSTYPE_TAGS
-       for a class.
-
-       * parse.y: Simplify fn.def2 and component_decl.  Support 'enum
-       A::foo' syntax.  Catch invalid scopes better.
-
-       * parse.y, lex.c: lose TYPENAME_COLON.
-
-       * decl2.c (groktypefield): #if 0 out.
-
-       * decl.c (lookup_name): If the type denoted by got_scope is
-       currently being defined, look in CLASSTYPE_TAGS rather than FIELDS.
-
-       * class.c (push_nested_class): Don't try to push into
-       error_mark_node.
-
-Fri Apr  8 07:26:36 1994  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * Makefile.in (stamp-parse): Update count of conflicts to 33.
-
-Thu Apr  7 17:47:53 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       A saner implementation of nested types that treats template types
-       no differently from non-template types.  There are still some
-       shortcomings of our system; most notably, it is difficult to look
-       for a nested type that is hidden by another name, because of the way
-       we keep track of hidden types.  But this shouldn't be a problem for
-       just about anyone.  Perhaps lookup_field should be fixed up a bit.
-
-       * spew.c: Moved handling of nested types/scoping from the lexer
-       into the parser.  Removed variable template_type_seen_before_scope.
-       Removed functions frob_identifier, hack_more_ids, and various cruft
-       that was #if 0'd out in the past, reducing the size of the file from
-       1146 lines to 450 lines.  We can't quite do away with spew.c yet,
-       though; we still need it for do_aggr () and checking for SCOPE after
-       the current identifier.  And setting lastiddecl.
-
-       * parse.y: Moved handling of nested types/scoping from the lexer
-       into the parser, using a new global variable `got_scope'.  Reduced
-       the number of states by 53.  Implemented all uses of explicit global
-       scope.  Removed terminals SCOPED_TYPENAME and SCOPED_NAME.  Removed
-       nonterminals tmpl.1, scoped_base_class, id_scope, typename_scope,
-       scoped_typename.  Added nonterminals nested_type,
-       qualified_type_name, complete_type_name, qualified_id, ptr_to_mem,
-       nested_name_specifier, global_scope, overqualified_id, type_name.
-       Changed many others.  Added 9 new reduce/reduce conflicts, which are
-       nested type parallels of 9 that were already in the grammar for
-       non-nested types.  Eight of the now 33 conflicts should be removed
-       in the process of resolving the late binding between variable and
-       function decls.
-
-       * gxxint.texi (Parser): Update.
-
-       * cp-tree.h (IS_AGGR_TYPE_CODE): Add UNINSTANTIATED_P_TYPE.
-
-       * lex.h: Add decl for got_scope.
-
-       * lex.c (see_typename): Claim to be the lexer when calling
-       lookup_name.
-
-       * decl.c (lookup_name): When called from the lexer, look at
-       got_scope and looking_at_typename; otherwise don't.
-
-Thu Apr  7 22:05:47 1994  Mike Stump  <mrs@cygnus.com>
-
-       31th Cygnus<->FSF merge.
-
-Thu Apr  7 17:47:53 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl2.c (mark_vtable_entries): Call this to mark all the
-       entries in the vtable addressable.
-       (finish_decl_parsing): Handle SCOPE_REFs.
-
-       * decl.c (decls_match): Always call compparms with strict == 1.
-       Handle the special case of C function redecl here.
-       (duplicate_decls): Only keep the old type if the new decl takes no
-       arguments.
-
-       * typeck.c (compparms): Also allow t1 to be ... if strict == 0.
-
-Thu Apr  7 16:17:50 1994  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (build_vtable_entry): Fix breakage introduced Apr 5
-       17:48:41.
-
-Wed Apr  6 16:05:10 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * init.c (build_virtual_init), search.c (build_vbase_vtables_init),
-       ch-tree.h:  Every place these functions were called, the result was
-       immediately passed to expand_expr_stmt.  Reduce redundancy by
-       calling expand_expr_init *inside* these functions.  These
-       makes for a simpler interface, and we don't have to build
-       compound expressions.  Hence, rename these function to:
-       expand_virtual_init and expand_vbase_vtables_init respectively.
-       * init.c, decl.c:  Change callers of these functions.
-       * init.c, cp-tree.h (expand_virtual_init):  Make static.
-
-       * decl2.c (finish_file): Check TREE_PUBLIC||TREE_ADDRESSABLE
-       rather than DECL_SAVED_INSNS before emitting inlines.
-
-Wed Apr  6 13:06:39 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * spew.c (init_spew): #if 0 out stuff used by arbitrate_lookup.
-
-       * decl.c (duplicate_decls): If this is a new declaration of an
-       extern "C" function, keep the type (for the argtypes).
-       (redeclaration_error_message): Don't check DECL_LANGUAGE here.
-       (decls_match): Call compparms with a value of strict dependent on
-       the value of strict_prototypes for DECL_LANGUAGE (oldecl).
-
-       * typeck.c (compparms): ... is only equivalent to non-promoting
-       parms if we're not being strict.
-
-       * parse.y (empty_parms): Don't check flag_ansi || pedantic here.
-
-       * decl.c (init_decl_processing): if (flag_ansi || pedantic)
-       strict_prototypes_lang_c = strict_prototypes_lang_cplusplus;
-
-       * decl2.c (grok_function_init): Don't set DECL_INITIAL on pure
-       virtuals.
-
-Tue Apr  5 17:48:41 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       Support for implementing vtables with thunks.
-       * tree.def (THUNK_DECL):  New TREE_CODE.
-       * cp-tree.h (FNADDR_FROM_VTABLE_ENTRY), tree.c
-       (fnaddr_from_vtable_entry):  Handle flag_vtable_thunks case.
-       * cp-tree.h (memptr_type):  New variable.
-       * class.c (build_vtable_entry):  Build thunk if necessary.
-       * class.c (build_vfn_ref):  If using thunks, don't need
-       to add delta field from vtable (there is none!).
-       * decl.c: Add memptr_type as well as vtable_entry_type.
-       If using thunks, the latter is just ptr_type_node.
-       * gc.c, typeck.c:  Use memptr_typeChange, not vtable_entry_type.
-       * decl2.c (finish_vtable_vardecl):  Handle thunks.
-       * expr.c (cplus_expand_expr):  Support THUNK_DECL.
-
-       * decl.c (grokdeclarator):  Set DECL_THIS_EXTERN if "extern".
-       * decl.c (start_function):  Set current_extern_inline based on
-       DECL_THIS_EXTERN, not TREE_PUBLIC.
-       * decl.c (finish_function):  Call mark_inline_for_output if needed,
-
-       Improve intelligence about when to emit inlines.
-       * cp-tree.h (lang_decl_flags):  New field saved_inline.
-       * cp-tree.h (DECL_SAVED_INLINE):  New macro.
-       * class.c (add_virtual_function):  Don't set TREE_ADDRESSABLE.
-       * decl.h, decl.c (pending_addressable_inlines):  Removed.
-       * decl2.c (pending_addressable_inlines):  Renamed to saved_inlines.
-       * decl2.c (mark_inline_for_output):  Do nothing if
-       DECL_SAVED_INLINE;  otherwise set it (and add to saved_inlines list).
-       * decl2.c (finish_vtable_vardecl):  SET_CLASSTYPE_INTERFACE_KNOWN
-       and set CLASSTYPE_INTERFACE_ONLY if there is a non-inline virtual.
-       * decl2.c (finish_file):  Writing out inlines later, so we can
-       also handle the ones needed for vtbales.
-       * decl2.c (write_vtable_entries, finish_vtable_typedecl):  Removed.
-
-       * cp-tree.h, class.c, decl2.c, search.c:  Remove -fvtable-hack
-       and flag_vtable_hack.  Use -fvtable-thunks and flag_vtable_thunks
-       instead.  (The rationale is that these optimizations both break binary
-       compatibility, but should become the default in a future release.)
-
-Wed Apr  6 10:53:56 1994  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (modify_vtable_entries): Never reset the DECL_CONTEXT
-       of a fndecl, as we might not be from that vfield.
-
-Tue Apr  5 17:43:35 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * class.c (add_virtual_function): fix bug for pure virtual, so
-       that DECL_VINDEX of the dummy decl copied won't be error.
-       (see also Apr 4 change)
-
-Tue Apr  5 17:23:45 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * typeck.c (c_expand_return):  Before checking that we're not
-       returning the address of a local, make sure it's a VAR_DECL.
-       (And don't worry about it being a TREE_LIST.)
-
-Tue Apr  5 13:26:42 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (YYDEBUG): Always define.
-       * lex.c (YYDEBUG): Likewise.
-
-Mon Apr  4 11:28:17 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * class.c (finish_struct): backup out the change below, put the
-       new change for the same purpose. The change below breaks code.
-
-       * class.c (finish_struct): if pure virtual, copy node and make
-       RTL point to abort, then put in virtual table.
-       * decl2.c (grok_function_iit): reinstate Mar 31 change.
-
-Sat Apr  2 03:12:58 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * init.c (build_new): pedwarn about newing const and volatile
-       types.
-
-       * tree.c (get_identifier_list): Only do the special handling
-       thing if we're dealing with the main variant of the record type.
-
-       * cvt.c (convert_to_reference): When converting between
-       compatible reference types, use the pointer conversion machinery.
-       Don't just blindly overwrite the old type.
-
-Fri Apr  1 17:14:42 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * call.c (build_method_call): When looking at global functions,
-       be sure to use instance_ptr for the first argument, not some version
-       of it that has been cast to a base class.  Also do this before
-       comparing candidates.
-
-Thu Mar 31 19:50:35 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * call.c (build_method_call): Constructors can be called for
-       const objects.
-
-Thu Mar 31 16:20:16 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * decl2.c (grok_func_init): do not abort as rtl for pur virtual
-       fucntions. They can be defined somewhere else.
-
-Sat Jan 23 23:23:26 1994  Stephen R. van den Berg  (berg@pool.informatik.rwth-aachen.de)
-
-       * decl.c (init_decl_processing): Declare __builtin_return_address
-       and __builtin_frame_address for C++ as well.
-
-Thu Mar 31 12:35:49 1994  Mike Stump  <mrs@cygnus.com>
-
-       * typeck2.c (store_init_value): Integral constant variables are
-       always constant, even when doing -fpic.
-
-Sat Jan 23 23:23:26 1994  Stephen R. van den Berg  (berg@pool.informatik.rwth-aachen.de)
-
-       * decl.c (redeclaration_error_message): Pass the types to
-       comptypes.
-
-Wed Mar 30 21:29:25 1994  Mike Stump  <mrs@cygnus.com>
-
-       Cures incorrect errors about pure virtuals in a class, when they
-       have been overridden in a derived class.
-
-       * search.c (get_abstract_virtuals): Reimplement.
-       * search.c (get_abstract_virtuals_1): New routine.
-
-Wed Mar 30 14:10:04 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * pt.c (push_template_decls): Make the pushed level pseudo
-       global.
-
-       * parse.y (extdefs): Don't pop everything if the current binding
-       level is pseudo_global.
-
-       * decl.c (pop_everything): Stop on reaching a pseudo-global
-       binding level.
-
-       * cp-tree.h (DECL_FUNCTION_MEMBER_P): Change to more reliable test.
-
-       * decl.c (duplicate_decls): Only copy DECL_SOURCE_{FILE_LINE} if
-       the old decl actually had an initializer.
-
-       * {various}: Clean up gcc -W complaints.
-
-       * cp-tree.h (DECL_FUNCTION_MEMBER_P): Currently defined to be
-       (DECL_CONTEXT (NODE) != NULL_TREE).
-
-       * parse.y (lang_extdef): Call pop_everything if necessary.
-
-       * decl.c (pop_everything): New function for popping binding
-       levels left over after a syntax error.
-       (pushdecl): Use DECL_FUNCTION_MEMBER_P to decide whether or not
-       a function is a member.
-
-Wed Mar 30 14:20:50 1994  Mike Stump  <mrs@cygnus.com>
-
-       Cures calling a more base base class function, when a more derived
-       base class member should be called in some MI situations.
-
-       * search.c (make_binfo): Use more the more specialized base
-       binfos from the binfo given as the second argument to make_binfo,
-       instead of the unspecialized ones from the TYPE_BINFO.
-       * class.c (finish_base_struct): Likewise, update callers.
-       * search.c (dfs_get_vbase_types): Likewise.
-       * tree.c (propagate_binfo_offsets, layout_vbasetypes): Likewise.
-       * decl.c (xref_tag): Use NULL_TREE instead of 0.
-       * lex.c (make_lang_type): Likewise.
-
-Wed Mar 30 14:10:04 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (pushdecl): If pushing a C-linkage function, only do a
-       push_overloaded_decl.
-       (duplicate_decls): Standard overloading does not shadow built-ins.
-
-Tue Mar 29 00:54:18 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * pt.c (end_template_decl): Don't call push_overloaded_decl.
-
-       * init.c (do_friend): Don't call push_overloaded_decl.
-
-       * decl.c (pushdecl): Call push_overloaded_decl for functions and
-       function templates.
-       (duplicate_decls): functions and function templates are not
-       duplicates, but don't complain about calling this function to
-       compare them.
-       (push_overloaded_decl): Don't deal with linkage.  Call
-       duplicate_decls.
-       (redeclaration_error_message): Deal with linkage.
-
-       * decl.c (start_function): If push_overloaded_decl returns an
-       older version of the function, deal with it.
-
-       * decl.c (start_function): Be sure only to push_overloaded_decl
-       for non-members.
-
-       * decl.c (grokfndecl): Put back clearing of DECL_CHAIN for
-       methods.
-       (start_function): Lose broken and redundant code for checking old
-       decl.
-
-       * init.c (add_friend): Give line numbers of both friend decls
-       when warning about re-friending.
-
-       * pt.c (tsubst): Use comptypes rather than == to compare the
-       types of the method as declared and as defined, since default
-       parameters may be different.
-
-       * call.c (build_method_call): Use brendan's candidate printing
-       routine.
-
-       * decl.c (start_method): Methods defined in the class body are
-       inline whether or not it's a template class.
-
-Mon Mar 28 16:39:26 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (initdcl0): Add "extern" to current_declspecs if
-       have_extern_spec && ! used_extern_spcec.
-
-       * tree.c (really_overloaded_fn): A fn with more than one
-       overload.
-
-       * pt.c (end_template_decl): Use really_overloaded_fn.
-
-       * decl.c (duplicate_decls): When smashing a decl into a previous
-       definition, keep the old file and line.
-       Don't deal with overloaded functions.
-       Lose old code for checking arg types of functions.
-       Check for overloaded C functions.
-       (pushdecl): Deal with overloaded functions.
-       (start_decl): Expect pushdecl to return an appropriate function decl.
-       (start_function): Likewise.
-       (push_overloaded_decl): Don't check for overloaded C functions.
-
-       * *.c: Stop using DECL_OVERLOADED, it being archaic.
-       TREE_OVERLOADED should probably go, too.
-
-Mon Mar 28 14:00:45 1994  Ron Guilmette  <rfg@netcom.com>
-
-       * typeck.c (comp_target_types): Call comp_target_parms with
-       strict == 1.
-
-Sun Mar 27 00:07:45 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (empty_parms): Don't parse () as (...) in extern "C"
-       sections if we're compiling with -ansi or -pedantic.
-
-       * decl.c (decls_match): Don't treat (int) and (int&) as matching.
-
-       * decl2.c (grokfield): Don't pedwarn twice about initializing
-       field.
-
-       * decl.c (push_overloaded_decl): Warn about shadowing
-       constructor.
-       (redeclaration_error_message): Don't allow 'int a; int a;'
-
-       * cvt.c (build_up_reference): Only check for valid upcast if
-       LOOKUP_PROTECT is set, not just any flag.
-
-Fri Mar 25 01:22:31 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * lex.c (check_newline): When we see a #pragma implementation,
-       also set it for the main input file.
-
-       * init.c (build_new): Convert array size argument to size_t.
-
-       * parse.y (primary): If we're doing a parenthesized type-id, call
-       groktypename before passing it to build_new.
-
-       * call.c (build_method_call): Deal properly with const and
-       volatile for instances of reference type.
-
-       * decl.c (store_return_init): Change 'if (pedantic) error' to 'if
-       (pedantic) pedwarn'.
-
-       * decl.c (grokdeclarator): Don't complain about putting `static'
-       and `inline' on template function decls.
-
-Thu Mar 24 23:18:19 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * call.c (build_method_call): Preserve const & volatile on
-       `this'.
-
-Thu Mar 24 16:21:52 1994  Mike Stump  <mrs@cygnus.com>
-
-       * init.c (build_new, build_vec_delete): Use global new and delete
-       for arrays. 
-       * decl2.c (delete_sanity): Likewise.
-
-Thu Mar 24 02:10:46 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cvt.c (convert_to_reference): If i is an lvalue,
-       (int &)i -> *(int*)&i, as per 5.2.8p9 of the latest WP.
-       (convert_force): Call convert_to_reference with LOOKUP_COMPLAIN.
-
-Wed Mar 23 17:45:37 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (duplicate_decls): Also propagate DECL_TEMPLATE_MEMBERS
-       and DECL_TEMPLATE_INSTANTIATIONS.
-
-       * init.c (build_new): Handle array typedefs properly.
-
-Wed Mar 23 18:23:33 1994  Mike Stump  <mrs@cygnus.com>
-
-       30th Cygnus<->FSF merge.
-
-Wed Mar 23 00:46:24 1994  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (modify_vtable_entries): Avoid running off the end of the
-       virtuals list when processing a virtual destructor.
-       * class.c (get_vtable_entry): Likewise.
-
-Wed Mar 23 00:23:59 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (duplicate_decls): If two template decls don't match,
-       just return 0.
-
-Tue Mar 22 23:49:41 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (convert_for_assignment): Don't pedwarn about
-       converting function pointer to void *.
-
-Tue Mar 22 22:23:19 1994  Mike Stump  <mrs@cygnus.com>
-
-       Major revamp of pointer to member functions.  Cures major
-       nonfunctionality when used in casts, and MI situations.
-
-       * cvt.c (convert_force): Update call site of build_ptrmemfunc.
-       * typeck.c (convert_for_assignment): Likewise.
-       * typeck2.c (digest_init): Likewise.
-       * typeck2.c (process_init_constructor): Simplify by moving code into
-       digest_init.
-       * typeck2.c (digest_init): Do default_conversions on init value, if
-       we are processing pointer to member functions.
-       * class.c (get_vfield_offset): Now non-static.  Convert bit offset
-       into byte offset.
-       * cp-tree.h (get_vfield_offset): Likewise.
-       * typeck.c (get_member_function_from_ptrfunc): Convert down to right
-       instance, before fetching vtable pointer.
-       * typeck.c (get_delta_difference): New routine.
-       * typeck.c (build_ptrmemfunc): Revamp to handle casting better, also
-       get vtable pointer out of right subobject.
-
-Tue Mar 22 17:56:48 1994  Mike Stump  <mrs@cygnus.com>
-
-       * search.c (get_binfo): Return NULL instead of aborting, when
-       passed a UNION_TYPE.
-
-Tue Mar 22 12:44:54 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       These patches implement handling of redefinition/redeclaration of
-       templates.
-
-       * typeck.c (comptypes): Simplify.  All TEMPLATE_TYPE_PARMs are
-       considered compatible.
-
-       * parse.y (template_def): Pass defn argument to end_template_decl.
-
-       * pt.c (end_template_decl): Add defn argument.  Check for
-       redefinition.  Simplify.
-
-       * error.c (OB_UNPUT): New macro, to remove mistakes.
-       (aggr_variety): Subroutine of dump_aggr_type.
-
-       * decl.c (decls_match): Support templates.
-       (duplicate_decls): No longer static.  Don't try to lay out template
-       decls.
-       (pushdecl): Simplify.
-
-       * cp-tree.h (DECL_TEMPLATE_MEMBERS): Use DECL_SIZE instead of
-       DECL_INITIAL.
-
-Mon Mar 21 11:46:55 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * error.c (dump_decl): Support class template decls.
-       (dump_type): Don't adorn template type parms.
-
-       * decl.c (duplicate_decls): Save DECL_TEMPLATE_INFO from old decl
-       if it was a definition.
-       (redeclaration_error_message): Do the cp_error thang, and reject
-       redefinition of templates.
-
-Mon Mar 21 19:36:06 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * decl.c (grokdeclarator):  Set TREE_PUBLIC for METHOD_TYPE
-       in FIELD context, when appropriate.  Also,
-       CLASSTYPE_INTERFACE_ONLY is irrelevant to setting TREE_PUBLIC.
-       Also, simplify check for bogus return specifiers.
-
-Mon Mar 21 11:46:55 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (after_type_declarator1): Expand type_quals.
-       (notype_declarator1): Likewise.
-       (absdcl1): Likewise.
-
-Sat Mar 19 01:05:17 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grokdeclarator): Treat class-local typedefs like static
-       members; i.e. 'typedef int f();' means that f is a function type,
-       not a method type.
-
-       * parse.y (decl): Change direct_* back to *.
-       (type_id): Change direct_abstract_declarator to absdcl.
-       (direct_declarator, direct_initdecls, direct_initdcl0): Remove again.
-
-Fri Mar 18 12:47:59 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       These two patches fix crashes on instantiating a template inside a
-       function with C linkage or containing labels.
-
-       * class.c (current_lang_stacksize): No longer static.
-
-       * decl.c (struct saved_scope): Add lang_base, lang_stack,
-       lang_name, lang_stacksize, and named_labels.
-       (push_to_top_level): Save them.
-       (pop_from_top_level): Restore them.
-
-       * gxxint.texi (Parser): Update.
-
-       These two patches finish moving the task of expr/declarator
-       ambiguity resolution from the lexer to the parser, and add one more
-       r/r conflict.  START_DECLARATOR can now be nuked.
-
-       * parse.y (decl): Add "direct_" in typespec X rules.
-       (direct_declarator): New nonterminal for
-       direct_after_type_declarator and direct_notype_declarator.
-       (direct_initdecls): Like initdecls, but uses direct_initdcl0.
-       (direct_initdcl0): Like initdcl0, but uses direct_declarator.
-       (named_parm): Add typespec direct_declarator rule.
-
-       * spew.c (yylex): #if 0 out START_DECLARATOR insertion.
-
-       These two patches disable some excessive cleverness on the part of
-       g++; a non-class declaration always hides a class declaration in the
-       same scope, and g++ was trying to unhide it depending on the
-       enclosing expression.
-
-       * spew.c (arbitrate_lookup): #if 0 out.
-
-       * decl.c (lookup_name): Never call arbitrate_lookup.
-
-       * parse.y (complex_notype_declarator1): Add '*'
-       complex_notype_declarator1 and '&' complex_notype_declarator1 rules.
-
-       * parse.y (complex_direct_notype_declarator): Restore id_scope
-       see_typename TYPENAME rule, remove all other rules beginning with
-       those tokens.
-       (notype_unqualified_id): Add '~' see_typename IDENTIFIER rule.
-
-Thu Mar 17 17:30:01 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       These changes fix the compiler's handling of the functional cast/
-       object declaration ambiguities in section 6.8 of the ARM.  They also
-       add 11 reduce/reduce conflicts.  Sigh.
-
-       * parse.y: Add precedence decls for OPERATOR and '~'.
-       (notype_unqualified_id): New nonterminal, encompasses all of the
-       ANSI unqualified-id nonterminal except TYPENAMEs.
-       (expr_or_declarator): New nonterminal to delay parsing of code like
-       `int (*a)'.
-       (primary): Use notype_unqualified_id.
-       (decl): Add typespec initdecls ';' and typespec declarator ';'
-       rules.
-       (initdcl0): Deal with the above.
-       (complex_notype_declarator1): A notype_declarator that is not also
-       an expr_or_declarator.
-       (complex_direct_notype_declarator): A direct_notype_declarator that
-       doesn't conflict with expr_or_declarator.  Use
-       notype_unqualified_id.  Remove id_scope see_typename TYPENAME rule.
-       (functional_cast): New nonterminal, for the three functional cast
-       rules.  So that they can be moved after
-       complex_direct_notype_declarator.
-       (see_typename): Don't accept type_quals any more.
-
-       * decl2.c (reparse_decl_as_expr): New function to deal with parse
-       nodes for code like `int (*a)++;'.      
-       (reparse_decl_as_expr1): Recursive subroutine of the above.
-       (finish_decl_parsing): New function to deal with parse nodes for
-       code like `int (*a);'.  See the difference?
-
-Thu Mar 17 12:16:10 1994  Mike Stump  <mrs@cygnus.com>
-
-       These changes break binary compatibility in code with classes
-       that use virtual bases.
-
-       * search.c (dfs_get_vbase_types): Simplify and correct to make
-       sure virtual bases are initialized in dfs ordering.
-       * search.c (get_vbase_types): Simplify and make readable.
-
-Thu Mar 17 12:01:10 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y: s/ typename / type_id /g
-
-Wed Mar 16 17:42:52 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * parse.y (typespec): add SCOPE TYPENAME for global scoped 
-       type. e.g. ::B x.
-
-       * decl.c (complete_array_type): fix a bug that in -pendantic
-       mode even there's no initializer, it will continue to build
-       default index.
-
-Wed Mar 16 17:43:07 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (direct_notype_declarator): Add PTYPENAME rule, remove
-       all of the scoped PTYPENAME rules.
-
-Wed Mar 16 16:39:02 1994  Mike Stump  <mrs@cygnus.com>
-
-       * init.c (build_offset_ref): The value of A::typedef_name is
-       always the TYPE_DECL, and never an error.
-
-Tue Mar 15 20:02:35 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * search.c (get_base_distance_recursive): Two binfos can only
-       represent the same object if they are both via_virtual.
-
-       * class.c (finish_base_struct): Check vbases for ambiguity, too.
-
-       * search.c (get_vbase_types): Accept binfo argument, too.
-
-Tue Mar 15 19:22:05 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * decl.c (complete_array_type): complete TYPE_DOMAIN of the 
-       initializer also, because back-end requires it.
-
-Tue Mar 15 15:33:31 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * error.c (dump_expr): Support member functions (which show up as
-       OFFSET_REFs).
-
-Mon Mar 14 16:24:36 1994  Mike Stump  <mrs@cygnus.com>
-
-       * init.c (build_new): Set the return type of multidimensional
-       news correctly.
-
-Fri Mar 11 15:35:39 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * call.c (build_method_call): if basetype not equal to type
-       of the instance, use the type of the instance in building
-       destructor.
-
-Thu Mar 10 17:07:10 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * parse.y (direct_notype_declarator): add push_nested_type for
-       'template_type SCOPED_NAME' rule.
-
-Tue Mar  8 00:19:58 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (parm): Add typed_declspec1 {absdcl, epsilon} rules.
-
-Sat Mar  5 04:47:48 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (regcast_or_absdcl): New nonterminal to implement late
-       reduction of constructs like `int ((int)(int)(int))'.
-       (cast_expr): Use it.
-       (sub_cast_expr): Everything that can come after a cast.
-       (typed_declspecs1): typed_declspecs that are not typed_typespecs.
-       (direct_after_type_declarator): Lose PAREN_STAR_PAREN rule.
-       (direct_abstract_declarator): Replace '(' parmlist ')' rule with
-       '(' complex_parmlist ')' and regcast_or_absdcl.
-       (parmlist): Split
-       (complex_parmlist): Parmlists that are not also typenames.
-       (parms_comma): Enabler.
-       (named_parm): A parm that is not also a typename.  Use declarator
-       rather than dont_see_typename abs_or_notype_decl.  Expand
-       typed_declspecs inline.
-       (abs_or_notype_decl): Lose.
-       (dont_see_typename): Comment out.
-       (bad_parm): Break out abs_or_notype_decl into two rules.
-
-Fri Mar  4 18:22:39 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl2.c (reparse_decl_as_casts): New function to change parse
-       nodes for `(int)(int)(int)' from "function taking int and returning
-       function taking int and returning function taking int" to "... cast
-       to int, cast to int, cast to int".
-
-       * decl2.c (reparse_decl_as_expr): Recursive function to change
-       parse nodes for `A()()' from "function returning function returning
-       A" to "A().operator()".
-
-       * parse.y (primary): Replace `typespec LEFT_RIGHT' rule with
-       `typespec fcast_or_absdcl' rule.
-       (fcast_or_absdcl): New nonterminal to implement late reduction of
-       constructs like `A()()()()'.
-       (typename): Replace `typespec absdcl1' rule with
-       `typespec direct_abstract_declarator' rule.
-       (direct_abstract_declarator): Replace `LEFT_RIGHT type_quals' rule
-       with `fcast_or_absdcl type_quals' rule.
-
-Fri Mar  4 16:18:03 1994  Mike Stump  <mrs@cygnus.com>
-
-       * tree.c (lvalue_p): Improve OFFSET_REF handling, so that it
-       matches Section 5.5.
-
-Fri Mar  4 14:01:59 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * error.c (dump_type_prefix): Don't print basetype twice for
-       pmfs.
-
-Fri Mar  4 13:24:33 1994  Mike Stump  <mrs@cygnus.com>
-
-       * typeck.c (convert_arguments): Handle setHandler(A::handlerFn)
-       so that it is like setHandler(&A::handlerFn).  Cures an `invalid
-       lvalue in unary `&''.
-
-Fri Mar  4 11:15:59 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * gxxint.texi (Copying Objects): New section discussing default
-       op= problems with virtual inheritance.
-
-       * decl2.c (grokoptypename): Just does grokdeclarator and
-       build_typename_overload, since the parser can't call grokdeclarator
-       directly.
-
-       * method.c (build_typename_overload): Set IDENTIFIER_GLOBAL_VALUE
-       and TREE_TYPE on generated identifiers.
-
-       * decl.c (grokdeclarator): Don't deal with TYPE_EXPRs anymore.
-
-       * parse.y (parm): Convert `const char *' to `__opPCc' here.
-
-       * error.c (dump_decl): Say sorry rather than my_friendly_aborting
-       if we can't figure out what to do.
-       (dump_type*): Likewise.
-
-       * typeck2.c (build_m_component_ref): 'component' is an expr, not
-       a decl.  Also move the IS_AGGR_TYPE check after the stripping of
-       REFERENCE_TYPE.
-
-Fri Mar  4 04:46:05 1994  Mike Stump  <mrs@cygnus.com>
-
-       * call.c (build_method_call): Handle b->setHandler(A::handlerFn)
-       so that it is like b->setHandler(&A::handlerFn).  Cures an `invalid
-       lvalue in unary `&''.
-
-Thu Mar  3 12:38:15 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y: Add precedence specification for START_DECLARATOR.
-       (type_quals): Move before primary.
-       (typename): Move before typed_declspecs, add 'typespec absdcl1' rule.
-
-       * decl2.c (grokoptypename): Lose.
-
-       * decl.c (grokdeclarator): Parse TYPE_EXPRs in the initial scan,
-       rather than waiting until later.
-
-Wed Mar  2 14:12:23 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (unary_expr): Use 'typename' in 'new' rules, rather
-       than expanding it inline.
-       (typename): Expand empty option of (former) absdcl inline.
-       (abs_or_notype_decl): Likewise.
-       (absdcl): Lose empty rule.
-       (conversion_declarator): New nonterminal for 'typename' of 'operator
-       typename'.
-       (operator_name): Use it instead of absdcl.
-
-       * parse.y: Add precedence declarations for SCOPED_TYPENAME,
-       TYPEOF, and SIGOF.
-       (typed_declspecs): Accept typed_typespecs, rather than typespec
-       directly.  Add rules with reserved_typespecquals.
-       (reserved_declspecs): Don't accept typespecqual_reserved at the
-       beginning of the list.  The typed_declspecs rule will deal with this
-       omission.
-       (declmods): Accept nonempty_type_quals, rather than TYPE_QUAL
-       directly.
-
-       * parse.y (direct_notype_declarator,
-       direct_after_type_declarator, direct_abstract_declarator): Split up
-       the declarator1 nonterminals to match the draft standard and avoid
-       ambiguities.
-       (new_type_id, new_declarator, direct_new_declarator,
-       new_member_declarator): New nonterminals to implement the subset of
-       'typename' allowed in new expressions.
-       (unary_expr): Use new_type_id instead of typename.
-       (after_type_declarator1, absdcl1): Fix semantics of member pointers.
-       (abs_member_declarator, after_type_member_declarator): Lose.
-
-       * parse.y (absdcl1): Don't require parens around
-       abs_member_declarator.
-       (abs_member_declarator): Lose see_typename from rules.
-       (after_type_member_declarator): Likewise.
-
-       * tree.c (get_identifier_list): New function, containing code
-       previously duplicated in get_decl_list and list_hash_lookup_or_cons.
-       (get_decl_list): Use it.
-       (list_hash_lookup_or_cons): Likewise.
-
-       * parse.y (typed_declspecs, declmods): It's not necessary to hash
-       the declspecs on class_obstack, so don't.  This way typed_typespecs
-       can reduce to typed_declspecs.
-
-Wed Mar  2 14:29:18 1994  Jason Merrill <jason@cygnus.com>
-
-       * cvt.c (build_up_reference): If we aren't checking visibility,
-       also allow base->derived conversions.
-
-Mon Feb 28 15:14:29 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * typeck.c (build_c_cast): Remove bogus hack when converting
-       to a reference type.
-
-       * cp-tree.h (lang_decl::vbase_init_list, DECL_VBASE_INIT_LIST):
-       Removed, not used.
-       (lang_stype::methods, lang_decl::next_method): New fields.
-       (CLASSTYPE_METHODS, DECL_NEXT_METHOD):  New macros.
-       * decl.c (duplicate_decls):  Preserve DECL_NEXT_METHOD.
-
-       * cp-tree.h, decl2.c (flag_vtable_hack):  New flag.
-       * decl2.c (finish_vtable_vardecl):  If flag_vtable_hack,
-       and  !CLASSTYPE_INTERFACE_KNOWN, try to use the presence of
-       a non-inline virtual function to control emitting of vtables.
-       * class.c (finish_struct):  Build CLASSTYPE_METHODS list.
-       * search.c (build_vbase_vtables_init):  Don't assemble_external
-       (yet) if flag_vtable_hack.
-       * class.c (build_vfn_ref):  Likewise.
-
-Mon Feb 28 14:54:13 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (component_decl): Don't include "typed_declspecs
-       declarator ';'" speedup, since it breaks enums.
-
-Fri Feb 25 15:43:44 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * class.c (finish_struct):  Minor optimization for building
-       fn_fields list.
-
-Fri Feb 25 15:23:42 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (start_function): Fix detection of function overloading.
-
-Thu Feb 24 22:26:19 1994  Mike Stump  <mrs@cygnus.com>
-
-       * lex.c (check_newline): #pragma interface can take a string
-       argument, just like #pragma implementation.  #pragma implementation
-       checks for garbage on the line, line #pragma interface does.  Main
-       input files do not auto implement like named files, #pragma
-       implementation must be used explicitly.
-
-Thu Feb 24 17:09:01 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y (components): Handle list of one again.
-       (notype_components): Likewise.
-       (after_type_declarator1): Take maybe_raises out again.
-
-       * gxxint.texi (Parser): Document additional r/r conflict.
-
-Wed Feb 23 14:42:55 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * gxxint.texi (Parser): Add node.
-
-       * Makefile.in (stamp-parse): Update expected conflict count.
-
-       * parse.y (various): Replace "declmods declarator" with "declmods
-       notype_declarator".  The comment saying that "declmods declarator ';'"
-       corresponds to "int i;" was wrong; it corresponds to "const i;".
-       (component_decl): Add "typed_declspecs declarator ';'" rule; this
-       *does* correspond to "int i;".  Change "declmods components" to
-       "declmods notype_components".
-       (components): Don't deal with a list of one anymore.
-       (notype_components): New nonterminal, corresponds to notype_declarator.
-       ({after_,no}type_component_decl{,0}): More new nonterminals.
-       ({after_,no}type_declarator): Fold in START_DECLARATOR token.
-       Eliminates four reduce/reduce conflicts.
-
-       (expr): Depend on nontrivial_exprlist instead of nonnull_exprlist.
-       (nontrivial_exprlist): New nonterminal: A list of at least two
-       expr_no_commas's.
-       (nonnull_exprlist): Depend on nontrival_exprlist.
-       Eliminates four reduce/reduce conflicts.
-
-       (named_class_head): Move intermediate code block into separate
-       nonterminal so that we can stick %prec EMPTY on it.
-
-       Add more %prec EMPTY's to eliminate remaining shift/reduce
-       conflicts.
-
-       (after_type_declarator): Add maybe_raises to fndecl rules.
-       (after_type_declarator_no_typename): Remove.
-       For correctness.
-
-       Document remaining reduce/reduce conflicts.
-
-Tue Feb 22 12:10:32 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * search.c (get_base_distance): Only bash BINFO_INHERITANCE_CHAIN
-       (TYPE_BINFO (type)) if we care about the path.
-
-       * tree.c (lvalue_p): A COND_EXPR is an lvalue if both of the
-       options are.
-
-Mon Feb 21 19:59:40 1994  Mike Stump  <mrs@cygnus.com>
-
-       * Makefile.in (mostlyclean): lex.c is a source file, don't
-       remove.
-
-Sat Feb 19 01:27:14 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * parse.y: Eliminate 20 shift/reduce conflicts.
-
-Fri Feb 18 11:49:42 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * pt.c (type_unification): Add subr argument; if set, it means
-       that we are calling ourselves recursively, so a partial match is OK.
-       (unify): Support pointers to methods and functions.
-       (tsubst): Support method pointers.
-       * decl.c (build_ptrmemfunc_type): No longer static, so that
-       tsubst can get at it.
-
-       * init.c (is_aggr_typedef): Pretend template type parms are
-       aggregates.
-       * decl2.c (build_push_scope): If cname refers to a template type
-       parm, just grin and nod.        
-
-       * call.c (build_overload_call_real): Pass subr argument to
-       type_unification.
-       * pt.c (do_function_instantiation): Likewise.
-       * class.c (instantiate_type): Likewise.
-
-       * search.c (get_base_distance): If BINFO is a binfo, use it and
-       don't mess with its BINFO_INHERITANCE_CHAIN.
-
-       * cvt.c (convert_to_reference): Fix temporary generation.
-       If ambiguous, return error_mark_node.
-
-       * init.c (build_new): Put back some necessary code.
-
-Thu Feb 17 15:39:47 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * init.c (build_new): Deal with array types properly.
-
-       * search.c (get_binfo): Become a shell for get_base_distance.
-       (get_binfo_recursive): Lose.
-       (get_base_distance_recursive): Find the path to the via_virtual base
-       that provides the most access.
-       (get_base_distance): Likewise.
-
-       * parse.y (explicit_instantiation): Syntax is 'template class
-       A<int>', not 'template A<int>'.
-
-       * typeck.c (convert_for_initialization): Remove bogus warning.
-
-       * parse.y (datadef): Revert patch of Oct 27.
-
-Thu Feb 17 15:12:29 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * class.c (build_vfn_ref):  Cast delta field to ptrdiff_type_node,
-       rather than integer_type_node.  Does wonders for the Alpha.
-
-Thu Feb 17 13:36:21 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (build_ptrmemfunc_type): Make sure that the pmf type
-       goes onto the same obstack as its target type.
-
-Wed Feb 16 00:34:46 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cvt.c (convert_to_reference): If converting via constructor
-       on local level, go back to build_cplus_new approach.
-
-       * tree.c (build_cplus_new): If with_cleanup_p, set cleanup slot
-       to error_mark_node to prevent expand_expr from building a cleanup
-       for this variable.
-
-       * lex.c (default_assign_ref_body): Return *this from the memcpy
-       version, too.
-
-       * decl.c (grok_reference_init): Just return if called with
-       error_mark_node, don't worry about initializing non-const reference
-       with temporary.
-
-       * cvt.c (convert_to_reference): Do the right thing for
-       non-aggregate reference conversions, pedwarn when generating a
-       non-const reference to a temporary.
-
-       * class.c (finish_struct): TYPE_HAS_COMPLEX_{INIT,ASSIGN}_REF and
-       TYPE_NEEDS_CONSTRUCTING all depend on TYPE_USES_VIRTUAL_BASECLASSES
-       again.
-
-Tue Feb 15 19:47:19 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grok_reference_init): Pawn off a lot of the work on
-       convert_to_reference.  Generally do the right thing.
-
-       * cvt.c (convert_to_reference): Conform to the initial comment;
-       i.e. don't create temps if decl != error_mark_node.  Handle
-       cleanups better for temps that do get created.  Don't pretend
-       that we can use an 'A' to initialize a 'const double &' just by
-       tacking on a NOP_EXPR.  Support LOOKUP_SPECULATIVELY.
-
-       * call.c (build_method_call): Set TREE_HAS_CONSTRUCTOR on
-       constructor calls.      
-
-Mon Feb 14 14:50:17 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grok_reference_init): Make a temporary for initializing
-       const reference from constant expression.
-
-Mon Feb 14 11:31:31 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * cp-tree.h, decl.c (set_identifier_local_value):  Deleted function.
-       * decl.c (pushdecl):  Define decl in correct binding_level
-       (which isn't always the inner_binding_level).
-
-       * cvt.c (build_up_reference):  Don't ever call expand_aggr_init.
-       It's ugly, and I don't think it's the right thing to do.
-
-       * cp-tree.h, class.c, decl.c, decl2.c, sp/search.c: 
-       Remove NEW_CLASS_SCOPING, assuming it is always 1.
-       * decl.c (pop_decl_level):  Removed; manually inlined.
-
-Sun Feb 13 19:04:56 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * class.h (candidate): Add basetypes field.
-
-       * call.c (build_method_call): Do access checking after choosing a
-       function, not before.
-
-       * Makefile.in (cvt.o, call.o, method.o): Depend on class.h.
-       (mostlyclean): Remove ../cc1plus.
-
-Fri Feb 11 11:52:26 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * class.c (finish_struct): Don't allow adjusting access to a field
-       of a base class if a local field has the same name.
-
-       * error.c (dump_type_prefix): Output basetype for METHOD_TYPEs.
-
-hu Jan 13 17:55:51 EST 1994 Gnanasekaran Swaminathan <gs4t@virginia.edu>
-
-           * cp-tree.h (DESTRUCTOR_NAME_P): do not confuse AUTO_TEMP names
-           with destructor names when either NO_DOLLAR_IN_LABEL or
-           NO_DOT_IN_LABEL are not defined.
-
-           Now `template <class T, T f(T&), const T*> class A {...}' works.
-
-           * pt.c (grok_template_type): substitute template parm types
-           with actual types in complex type as well.
-           (coerce_template_parms): update the grok_template_type ()
-           function call.
-
-       * pt.c (tsubst): Traverse method list using DECL_CHAIN.
-
-       * decl.c (grok_op_properties): Allow operator++/-- to have
-       default arguments.
-
-       * typeck2.c (store_init_value): Don't abort when called to
-       initialize a type that needs constructing with a CONSTRUCTOR.
-
-       * init.c (expand_aggr_init_1, CONSTRUCTOR case): If
-       store_init_value fails, build and expand an INIT_EXPR.  If
-       store_init_value succeeds, call expand_decl_init.
-
-Fri Feb 11 02:49:23 1994  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (build_vbase_path): Use complete_type_p instead of
-       resolves_to_fixed_type_p to determine if the virtual bases are in
-       their right place for the type of expr.  Cures problem of thinking a
-       virtual base class is one place, when it is in fact someplace else.
-
-Fri Feb 11 00:26:46 1994  Mike Stump  <mrs@cygnus.com>
-
-       * init.c (resolve_offset_ref): Make sure we first convert to
-       intermediate type, if given, when dealing with members off `this'.
-       Solves an incorrrect `type `foo' is not a base type for type
-       `multiple'' when it is infact, a base type.
-
-Thu Feb 10 21:49:35 1994  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (modify_other_vtable_entries): Use get_binfo, instead
-       of binfo_value.  Solves problem with compiler giving a `base class
-       `B' ambiguous in binfo_value (compiler error)' on complex MI
-       herarchies, when a virtual function is first defied in a virtual
-       base class.
-
-Thu Feb 10 17:19:32 1994  Mike Stump  <mrs@cygnus.com>
-
-       * class.c (build_vbase_path): Don't complain about ambiguous
-       intermediate conversion when converting down to a virtual base
-       class, even if they might seem to be ambiguous.
-
-Thu Feb 10 12:18:26 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck2.c (build_functional_cast): #if 0 out constructor
-       inheritance code, improve error messages.
-
-       * class.c (finish_base_struct): Complain about base with only
-       non-default constructors in derived class with no constructors.
-
-       * decl.c (grokdeclarator): Fix detection of virtual new/delete.
-
-Wed Feb  9 22:02:32 1994  Mike Stump  <mrs@cygnus.com>
-
-       * search.c (build_mi_virtuals, add_mi_virtuals,
-       report_ambiguous_mi_virtuals): Removed unneeded code.
-       * class.c (finish_struct_bits): Likewise.
-
-Wed Feb  9 11:27:17 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * pt.c (end_template_instantiation): Push decl before
-       pop_from_top_level.
-
-       * typeck2.c (build_m_component_ref): Make sure datum is of
-       aggregate type.
-
-       * init.c (get_type_value): New function, returns
-       IDENTIFIER_TYPE_VALUE or IDENTIFIER_CLASS_TYPE_VALUE or NULL_TREE.
-
-       * call.c (build_method_call): Don't die on call to destructor for
-       non-type.
-
-       * decl.c (grokdeclarator): Complain about virtual op new and op
-       delete, make static virtuals unvirtual instead of unstatic.
-
-       * typeck.c (build_c_cast): Also call default_conversion on
-       methods.
-
-       * decl.c (grokdeclarator): Don't complain about anonymous
-       bitfields.
-
-       * parse.y (simple_stmt, for loops): Move the continue point after
-       the cleanups.
-
-       * class.c (finish_struct): Fix setting of
-       TYPE_HAS_COMPLEX_INIT_REF.
-
-Tue Feb  8 13:21:40 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * init.c (build_new): Deal with `new double (1)'.
-
-       * class.c (finish_struct): TYPE_HAS_COMPLEX_*_REF are supersets of
-       TYPE_HAS_REAL_*_REF, but TYPE_HAS_COMPLEX_INIT_REF is independent of
-       TYPE_NEEDS_CONSTRUCTING.
-
-       * decl.c (duplicate_decls): Propagate access decls.
-
-       * typeck2.c (process_init_constructor): Accept empty_init_node
-       for initializing unions.
-
-       * class.c, lex.c, cp-tree.h: Use
-       TYPE_HAS_COMPLEX_ASSIGN_REF where TYPE_HAS_REAL_ASSIGN_REF was used
-       before, use TYPE_HAS_COMPLEX_INIT_REF for TYPE_NEEDS_CONSTRUCTING in
-       some places.
-
-       * decl.c (finish_decl): Don't complain about uninitialized const
-       if it was initialized before.
-
-Mon Feb  7 18:12:34 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * lex.c (default_assign_ref_body): Don't deal with vbases for
-       now.
-
-       * decl.c (finish_decl): Fix reversed logic for objects and other
-       things that need to be constructed but have no initializer.
-
-       * class.c (finish_struct): Don't set TYPE_HAS_* flags that are
-       set by grok_op_properties or finish_decl.
-
-       * decl.c: Don't warn about extern redeclared inline unless
-       -Wextern-inline is given.
-       * decl2.c (lang_decode_option): Likewise.
-       * cp-tree.h: Likewise.
-
-Mon Feb  7 17:29:24 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * decl.c (pushdecl_with_scope): Fix thinko.  Add forward
-       declaration.
-
-       * decl.c (pushdecl_with_scope):  New function.
-       * decl.c (pushdecl_top_level):  Use new function.
-       * decl.c (pushtag):  Initialize newdecl.
-       * decl.c (pushtag):  Push new type decl into correct scope.
-
-Mon Feb  7 14:42:03 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * call.c, cvt.c, init.c, search.c, cp-tree.h:
-       Eradicate LOOKUP_PROTECTED_OK.
-
-Mon Feb  7 13:57:19 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * decl.c (pushtag, xref_tag), cp-tree.h:  Add extra parameter
-        'globalize' to signify implicit declarations.
-       * decl.c (globalize_nested_type, maybe_globalize_type):  Removed.
-       * decl.c (set_identifier_type_value_with_scope):  New function.
-       * decl.c (set_identifier_local_value):  Simplify.
-       * spew.c (yylex, do_addr):  Modify to return a _DEFN if a
-       forward declaration (followed by ';' and not preceded by 'friend').
-       * class.c, decl.c, except.c, init.c, parse.y,
-       pt.c, search.c: Add new argument to calls to xref_tag and
-       pushtag.
-
-Mon Feb  7 00:22:59 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-tree.h (ACCESSIBLY_UNIQUELY_DERIVED_P): New macro, means what
-       ACCESSIBLY_DERIVED_FROM_P meant before.
-       (ACCESSIBLY_DERIVED_FROM_P): Now disregards ambiguity.
-
-       * cvt.c (build_up_reference): Call get_binfo with PROTECT == 1.
-
-       * search.c (get_base_distance_recursive): Members and friends of
-       a class X can implicitly convert an X* to a pointer to a private or
-       protected immediate base class of X.
-       (get_binfo_recursive): Likewise.
-       (get_base_distance): Ignore ambiguity if PROTECT < 0.
-       (get_binfo): Lose multiple values of PROTECT.
-       (compute_access): Protected is OK if the start of the
-       search is an accessible base class of current_class_type.
-
-       * method.c (build_opfncall): Do check access on operator new here.
-
-       * decl.c (finish_function): Don't check access on operator new
-       here.
-
-Sun Feb  6 14:06:58 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (xref_tag): The base of a derived struct is NOT always
-       public.  Duh.
-
-       * pt.c (do_explicit_instantiation): New function, called from
-       parser to do explicit function instantiation.
-       (type_unification): Allow the args list to be terminated with
-       void_list_node.
-       (do_pending_expansions): Look at i->interface for non-member
-       templates.
-
-       * parse.y (datadef): Move explicit_instantiation here.
-       (structsp): From here.
-       (datadef): Complain about `int;'.
-
-Sun Feb  6 12:33:18 1994  Per Bothner  <bothner@kalessin.cygnus.com>
-
-       * pt.c (end_template_instantiation), cp-tree.h:  Remove unused
-       second parameter, and simplify first from a TREE_LIST where
-       we only care about its TREE_VALUE to just the value (an IDENTIFIER).
-       * pt.c (instantiate_member_templates):  Simplify argument list
-       from a TREE_LIST to just an IDENTIFIER.
-       * lex.c (yyprint):  PRE_PARSED_CLASS_DECL is now just an IDENTIFIER.
-       * parse.y (template_instantiate_once):  Simplify accordingly.
-       * decl.c (inner_binding_level): New.  Use various places to
-       simplify.
-
-Sun Feb  6 02:49:37 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck2.c (build_functional_cast): int() -> int(0).
-
-Sat Feb  5 00:53:21 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * class.c (finish_struct): Don't do a bitwise copy for op= if the
-       class has a virtual function table.
-
-       * typeck.c (convert_for_initialization): Restore warnings about
-       not using defined op=.  Should really be my_friendly_aborts, I
-       s'pose.
-
-Fri Feb  4 14:21:00 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * class.c (finish_struct): Tidy up conditions for doing bitwise
-       copies of objects.
-
-       * decl.c (build_default_constructor): #if 0 out.
-
-       * *: Eradicate TYPE_GETS_{ASSIGNMENT,ASSIGN_REF,CONST_ASSIGN_REF,
-       CONST_INIT_REF}, TYPE_HAS_REAL_CONSTRUCTOR.
-
-       * decl.c (grokdeclarator): Don't return void_type_node for
-       friends being defined here.
-
-       * init.c (perform_member_init): Only do the init if it's useful.
-
-       * lex.c (default_copy_constructor_body): If we don't need to do
-       memberwise init, just call __builtin_memcpy.
-       (default_assign_ref_body): Likewise.
-
-       * decl.c (grokdeclarator): If friendp && virtualp, friendp = 0.
-
-Fri Feb  4 13:02:56 1994  Mike Stump  <mrs@cygnus.com>
-
-       * lex.c (reinit_parse_for_method, cons_up_default_function):
-       Don't give warn_if_unknown_interface warning when it came from a
-       system header file.
-       * pt.c (end_template_decl, instantiate_template): Likewise.
-       * decl.c (start_decl): Likewise.
-
-Fri Feb  4 00:41:21 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grokdeclarator): Don't try to set TYPE_WAS_ANONYMOUS on
-       enums.
-
-       * decl2.c (constructor_name_full): Use IS_AGGR_TYPE_CODE instead of
-       IS_AGGR_TYPE, since we don't know it's a type.
-
-Thu Feb  3 11:36:46 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grokdeclarator): Don't complain about anonymous unions.
-
-       * cp-tree.h (TYPE_WAS_ANONYMOUS): This struct was originally
-       anonymous, but had a name given to it by a typedef.
-
-       * decl.c (grokdeclarator): When renaming an anonymous struct, set
-       TYPE_WAS_ANONYMOUS.
-
-       * decl2.c (constructor_name_full): Use TYPE_WAS_ANONYMOUS.
-
-       * cp-tree.h (DECL_UNDEFINED_FRIENDS): #if 0 out.
-
-       * init.c (xref_friend): Don't set up DECL_UNDEFINED_FRIENDS.
-       (embrace_waiting_friends): Don't use DECL_UNDEFINED_FRIENDS.
-       
-       * decl.c (grokdeclarator): Set TYPE_NESTED_NAME properly on nested
-       anonymous structs that get typedef'd.
-
-       * decl.c (grokdeclarator): Always return void_type_node for
-       friends.
-
-       * error.c (dump_function_decl): Don't use DECL_CLASS_CONTEXT for
-       friends.
-       (dump_function_decl): Don't print out default args for
-       a function used in an expression.
-
-       * decl.c (grokdeclarator): Give error on abstract declarator used
-       in an invalid context (i.e. `void (*)();').
-
-       * error.c (cp_line_of): Support _TYPE nodes.
-       (cp_file_of): Likewise.
-
-       * cvt.c (build_up_reference): Don't abort if passed a SAVE_EXPR;
-       it can happen for the RHS of an assignment stmt where the LHS is
-       a COND_EXPR.
-
-       * init.c (expand_aggr_init_1): Deal with bracketed initializer
-       lists properly.
-
-       * class.c (finish_struct): Deal with enumerators and typedefs
-       again.
-
-Wed Feb  2 11:30:22 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * class.c (finish_struct): Tidy up loop over fields.
-
-       * errfn.c (cp_thing): Don't advance twice after a format.
-
-       * class.c (finish_struct): Complain about needing a constructor
-       if a member has only non-default constructors, and don't try to
-       generate a default constructor.
-
-       * decl.c (finish_decl): Also do the constructor thing if
-       TYPE_NEEDS_CONSTRUCTING is set (for arrays).
-
-       * search.c (unuse_fields): New function: mark all fields in this
-       type unused.
-       (dfs_unuse_fields): Helper function.
-
-       * class.c (pushclass): If the new class is the same as the old
-       class, still unuse the fields.
-       (unuse_fields): Move to search.c.
-
-       * decl.c (grok_op_properties): Add friendp argument.
-       (grokfndecl): Pass it.
-       (start_method): Likewise.
-
-       * decl2.c (delete_sanity): Add use_global_delete parameter to catch
-       ::delete calls.
-
-       * parse.y (unary_expr): Pass new parameter to delete_sanity.
-
-       * lex.c (default_copy_constructor_body): Don't choke if the union
-       has no fields.
-       (default_assign_ref_body): Likewise.
-
-       * call.c (compute_conversion_costs_ansi): Do the right thing for
-       ellipsis matches.
-
-       * decl.c (push_to_top_level): Optimize.
-
-       * decl.c (start_function): Look for the lexical scope of a friend
-       in DECL_CLASS_CONTEXT.
-
-       * init.c (do_friend): Set DECL_CLASS_CONTEXT on global friends.
-
-Tue Feb  1 15:59:24 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-tree.h (TREE_GETS_PLACED_NEW): New macro.
-
-       * init.c (init_init_processing): Don't assign BIN/BID to the
-       IDENTIFIER_GLOBAL_VALUEs of their respective operators.
-       (build_new): Check TREE_GETS_PLACED_NEW.
-
-       * decl.c (grok_op_properties): Don't set TREE_GETS_NEW for a decl of
-       op new with placement, set TREE_GETS_PLACED_NEW.
-
-       * cp-tree.h (ANON_UNION_P): New macro.  Applies to decls.
-
-       * class.c (finish_struct): Don't treat anonymous unions like
-       other aggregate members.  Do synthesize methods for unions without
-       a name, since they may or may not be "anonymous unions".
-
-       * decl2.c (grok_x_components): Wipe out memory of synthesized methods
-       in anonymous unions.
-
-       * lex.c (default_copy_constructor_body): Support unions.
-       (default_assign_ref_body): Likewise.
-
-Mon Jan 31 12:07:30 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-tree.h: Fix documentation of LOOKUP_GLOBAL, add prototypes.
-
-       * error.c (args_as_string): New function (%A), like type_as_string
-       except NULL_TREE -> "..."
-
-       * call.c (build_overload_call_real): Fix for new overloading.
-
-       * decl.c (grok_op_properties): Set all of the TYPE_OVERLOADS_* flags
-       here.
-
-       * parse.y (operator_name): Instead of here.
-
-       * typeck2.c (build_functional_cast): Treat a TREE_LIST as a list
-       of functions.
-
-       * call.c (build_overload_call_real): Support LOOKUP_SPECULATIVELY.
-
-       * method.c (build_opfncall): Don't need to massage return value
-       any more, call build_overload_call with all flags.
-
-       * typeck.c (build_x_binary_op): Put back speculative call to
-       build_opfncall.
-       (build_x_unary_op): Likewise.
-       (build_x_conditional_expr): Likewise.
-
-Mon Jan 31 10:00:30 1994  Mike Stump  <mrs@cygnus.com>
-
-       * cvt.c (build_type_conversion_1): Change call to pedwarn into
-       warning, and conditionalize upon warn_cast_qual.
-
-Fri Jan 28 11:48:15 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * search.c (lookup_field): If xbasetype is a binfo, copy it to
-       avoid clobbering its inheritance info.
-
-       * call.c (build_method_call): Don't overwrite basetype_path with
-       TYPE_BINFO (inst_ptr_basetype) if they have the same type.
-
-       * search.c (compute_access): Fix handling of protected inheritance
-       and friendship with the enclosing class.
-
-       * typeck2.c (store_init_value): Allow passing of TREE_CHAIN for
-       initialization of arbitrary variable.
-
-       * typeck2.c (build_functional_cast): Only try calling a method if
-       one exists.
-
-       * decl.c (grokdeclarator): Move handling of constructor syntax
-       initialization into first loop for generality.
-       (parmlist_is_random): Lose.
-
-       * lex.c (cons_up_default_function): Set TREE_PARMLIST on arguments
-       to default function.
-
-Thu Jan 27 19:26:51 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (grokparms): Abort if we get called with something we don't
-       expect.
-
-Thu Jan 27 17:37:25 1994  Mike Stump  <mrs@cygnus.com>
-
-       * call.c (build_overload_call_real): Change argument complain to
-       flags to match style of rest of code.  Pass it down to
-       build_function_call_real as necessary.
-       * call.c (build_overload_call, build_overload_call_maybe): Change
-       argument complain to flags to match style of rest of code.
-       * cp-tree.h (build_function_call_real): Added fourth flags
-       argument.
-       * cvt.c (convert_to_reference): Only give warning messages, if
-       LOOKUP_COMPLAIN is set.
-       * typeck.c (build_x_function_call): Change simple complain
-       argument to build_overload_call_maybe and build_overload_call, to
-       LOOKUP_COMPLAIN to match style of rest of code.
-       * typeck2.c (build_functional_cast): Likewise.
-       * typeck.c (build_function_call_real): Add flags, so that we can
-       not complain, if we don't want to complain.  Complain about
-       arguments, if we are complaining, otherwise don't.
-       * typeck.c (build_function_call, build_function_call_maybe):
-       Stick in flags argument.
-       * typeck.c (build_x_binary_op, build_x_unary_op,
-       build_x_conditional_expr, build_x_compound_expr): Follow style of
-       build_x_indirect_ref, as it is more correct and more common.
-
-Thu Jan 27 14:36:20 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * call.c (build_method_call): Don't check for being called with
-       a pointer.
-
-       * decl2.c (finish_file): Don't play with DECL_CLASS_CONTEXT for the
-       static initializer function.
-
-       * init.c (build_member_call): Use convert_force here, too.
-
-       * search.c (compute_access): Only treat static members specially
-       if they are referenced directly.
-
-Wed Jan 26 18:28:14 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * gxxint.texi (Access Control): New node.
-
-       * search.c (current_scope): New function; returns whichever of
-       current_class_type and current_function_decl is the most nested.
-       (compute_access): Total overhaul to make it clearer and more
-       correct.  Don't use the cache for now; in the only situation where
-       it was used before, it gained nothing.  This frees up three of the
-       DECL_LANG_FLAGs for possible other use!
-
-       * cp-tree.h: #if 0 out DECL_PUBLIC & friends.
-
-       * typeck.c (build_component_ref_1): Don't check DECL_PUBLIC.
-
-       * call.c (build_method_call): Use convert_force to cast `this' --
-       rely on the access checking for the method itself.
-
-       * init.c (is_friend): Do the nesting thing, handle types.  I am
-       my own friend.
-       (is_friend_type): Become a shell for is_friend.
-       (add_friend): Never stick in ctype.
-       Why are the friendship functions in init.c, anyway?
-
-Wed Jan 26 17:50:00 1994  Mike Stump  <mrs@cygnus.com>
-
-       * cvt.c (build_type_conversion_1): Don't conditionalize call to
-       pedwarn upon pedantic.
-
-Wed Jan 26 17:20:46 1994  Mike Stump  <mrs@cygnus.com>
-
-       * cvt.c (convert_to_reference): Add 8.4.3 checking so that one
-       gets a warning if one tries to initialize a non-const & from a
-       non-lvalue.
-       * cvt.c (convert_to_reference): Use %P format for argument
-       numbers in warnings.
-
-Wed Jan 26 14:35:06 1994  Mike Stump  <mrs@cygnus.com>
-
-       * init.c (build_delete): Follow style in call.c to construct the
-       virtual call to the desctructor, as that code is right.  Fixes a
-       problem of the compiler saying a pointer conversion is ambiguous.
-
-Wed Jan 26 11:28:14 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-tree.h (VTABLE_NAME_P): Change other occurrence of
-       VTABLE_NAME_FORMAT to VTABLE_NAME.
-
-       * *: s/visibility/access/g
-
-Tue Jan 25 18:39:12 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (build_modify_expr): Don't smash references if INIT_EXPR.
-
-Tue Jan 25 13:54:29 1994  Mike Stump  <mrs@cygnus.com>
-
-       * init.c (build_delete): Back out Jan 17th & 18th pacthes, as
-       they break libg++.
-
-Tue Jan 25 13:11:45 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * decl.c (duplicate_decls): Fix pointer arithmetic.
-
-Mon Jan 24 15:50:06 1994  Chip Salzenberg  <chip@fin.uucp>
-
-           [ cp-* changes propagated from c-* changes in 940114 snapshot ]
-           * cp-parse.y (maybe_attribute): Allow multiple __attribute__
-           clauses on a declaration.
-
-Mon Jan 24 17:06:23 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * class.c (finish_struct): Do synthesize methods for anon
-       structs, just not unions.
-
-Mon Jan 24 13:50:13 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * decl.c (xref_tag): handle anonymous nested type.
-       * decl.c (globalize_nested_type): add no globalize bit check.
-       * spew.c (hack_more_ids) : templated nested decl not push top
-       level.
-
-       * parse.y : get rid of 'goto do_components'. It is much better
-       for debugging.
-
-       * decl.c (is_anon_name): get rid of the function and use the
-       macro ANON_AGGRNAME_P.
-       * pt.c : ditto.
-
-Fri Jan 21 14:06:02 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * class.c (finish_struct): Don't synthesize any methods for
-       anonymous structs/unions.
-
-       * typeck.c (build_modify_expr): Don't treat pmf's as class objects.
-
-Thu Jan 20 18:56:46 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * method.c (build_opfncall): Call build_indirect_ref on
-       synthesized instance for operator delete.
-
-       * pt.c (type_unification): Don't abort if called with a list of
-       types in ARGS.
-
-       * class.c (instantiate_type): Deal with function templates.
-
-Thu Jan 20 16:55:35 1994  Jim Wilson  <wilson@sphagnum.cygnus.com>
-
-       * Makefile.in (CC): Default to cc not gcc.
-
-Thu Jan 20 13:47:54 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (build_modify_expr): Call constructor if appropriate.
-
-       * decl.c (push_to_top_level): Clear out class-level bindings cache.
-
-Wed Jan 19 13:51:22 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * call.c (resolve_scope_to_name): Work recursively (previously only
-       looked down one level).
-
-       * lex.c (do_pending_inlines): If we're still dealing with the last
-       batch of inlines, don't start working on a new one.
-
-       * Makefile.in (stamp-parse): Update conflict count.
-       (TAGS): Fix.
-
-       * parse.y (explicit_instantiation): New rule; implements
-       'template A<int>' syntax (though not 'template foo(int)' yet).
-       (structsp): Add explicit_instantiation.
-
-Tue Jan 18 13:53:05 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * class.c (finish_struct, etc.): Simplify decision to synthesize
-       a destructor.
-
-       * call.c, class.c, cp-tree.h, decl.c, init.c,
-       ptree.c, search.c, typeck.c, typeck2.c: Nuke
-       TYPE_NEEDS_CONSTRUCTOR (change all calls to TYPE_NEEDS_CONSTRUCTING).
-       * init.c (expand_aggr_init_1): Don't try non-constructor methods
-       of initializing objects.
-       (build_new): Don't try other methods if the constructor lookup fails.
-
-       * class.c (finish_base_struct): Set cant_have_default_ctor and
-       cant_synth_copy_ctor properly.
-       (finish_struct): Likewise.
-
-Mon Jan 17 13:58:18 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * typeck.c (build_modify_expr_1): #if 0 out again.
-       (build_modify_expr): #if 0 out memberwise init code again.
-
-       * lex.c (default_copy_constructor_body): Be const-correct.
-       (default_assign_ref_body): Likewise.
-
-       * init.c (perform_member_init): Use TYPE_HAS_CONSTRUCTOR to decide
-       whether or not to use it, rather than TYPE_NEEDS_CONSTRUCTING.
-       (expand_aggr_init): Disable silent conversion from initializer list
-       to list of args for a constructor.
-
-       * class.c (base_info): Lose needs_default_ctor.
-       (finish_base_struct): Likewise.
-       (finish_struct): Likewise.
-
-       * decl.c (init_decl_processing): Don't turn off flag_default_inline
-       just because flag_no_inline is on.
-       (finish_decl): Use TYPE_HAS_CONSTRUCTOR to decide to use
-       constructor.
-
-       * class.c (finish_struct): Synthesize default ctor whenever
-       allowed.
-
-       * Makefile.in (TAGS): Don't try to run etags on cp-parse.y.
-
-Sat Jan 15 18:34:33 1994  Mike Stump  <mrs@cygnus.com>
-
-       * Makefile.in, configure: Handle the C++ front-end in a
-       subdirectory.
-       * cp-*: Move C++ front-end to cp/*.
-
-Fri Jan 14 14:09:37 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-typeck.c (build_function_call_real): Modify to match other
-       instances of taking the address of the function.
-
-       * cp-class.c (finish_struct): Set TYPE_HAS_REAL_CONSTRUCTOR to 1 if
-       there are non-synthesized constructors.
-       Only set TYPE_NEEDS_CONSTRUCTOR if TYPE_HAS_REAL_CONSTRUCTOR.
-       Always generate copy constructor if possible.
-
-       * cp-tree.h (lang_type): Add has_real_constructor bitfield.
-       (TYPE_HAS_REAL_CONSTRUCTOR): Define.
-
-       * cp-lex.c (default_copy_constructor_body): Use init syntax
-       for all bases.
-
-       * cp-type2.c (store_init_value): Only give error for initializer list
-       if TYPE_HAS_REAL_CONSTRUCTOR.
-
-Thu Jan 13 15:38:29 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-tree.h (DECL_SYNTHESIZED): Add defn.
-       (lang_decl): Add synthesized bitfield to decl_flags.
-
-       * cp-lex.c (cons_up_default_function): Use DECL_SYNTHESIZED to mark
-       artificial methods, rather than a line # of 0.
-
-Fri Jan 14 18:25:29 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * cp-decl (xref_tag): fix a bug in conflict type.
-       * cp-parse.y : add SCOPED_NAME for uninstantiated template nested
-       type reference.
-       * cp-spew.c (yylex) : generated SCOPED_NAME token.
-       * cp-lex.c (yyprint): handle SCOPED_NAME.
-
-Fri Jan 14 17:00:29 1994  Mike Stump  <mrs@cygnus.com>
-
-       * cp-decl.c (pushdecl): Revert patch from Jan 11 19:33:03, as it is
-       not right.
-
-Thu Jan 13 14:00:35 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * cp-decl2.c (grok_x_components): fix a bug that enum type does not
-       have type_flags.
-
-Thu Jan 13 11:39:34 1994  Mike Stump  <mrs@cygnus.com>
-
-       Ensure that all vtable pointers are initialized with all the right
-       values.
-
-       * cp-class.c (is_normal): Changed to reflect new meaning of
-       CLASSTYPE_VFIELD_PARENT.
-       * cp-class.c (maybe_fixup_vptrs): Use of
-       CLASSTYPE_NEEDS_VIRTUAL_REINIT here is misguided.  Use
-       BINFO_MODIFIED instead.
-       * cp-class.c (finish_struct): Changed to reflect new meaning of
-       CLASSTYPE_VFIELD_PARENT.
-       * cp-decl.c (get_binfo_from_vfield): Removed, unneeded now.
-       * cp-decl.c (finish_function): Use init_vtbl_ptrs, instead of open
-       coding it here.
-       * cp-init.c (init_vfields): Changed name to init_vtbl_ptrs, and
-       re-implement.
-       * cp-init.c (emit_base_init): Use new name init_vtbl_ptrs.
-       * cp-tree.h (vfield_parent): Changed to integer.
-       * cp-tree.h (CLASSTYPE_VFIELD_PARENT): Changed docs to reflect new
-       meaning.
-       * cp-tree.h (init_vtbl_ptrs): Added init_vtbl_ptrs.
-
-Wed Jan 12 18:24:16 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * cp-decl.c (xref_tag): re-implement globalize nested type.
-       * cp-decl2.c (grok_x_components): ditto.
-       * cp-parse.y: ditto.
-       * cp-tree.h (lang_type): add no_globalize bit in type_flags.
-
-Wed Jan 12 14:08:09 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-decl.c (grokdeclarator): Don't set TREE_PUBLIC on friend
-       decls with a definition attached.
-
-       * cp-typeck.c (build_modify_expr): Undo previous change in the case
-       of INIT_EXPRs.
-
-Tue Jan 11 19:33:03 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-typeck.c (build_modify_expr): Replace code for generating
-       assignment semantics for classes with an error.
-       (build_modify_expr_1): #if 0 out.
-
-       * cp-decl.c (pushdecl): Patch bogus design of pushdecl
-       behavior for overloaded functions (it doesn't push anything).
-
-       * cp-class.c (finish_struct): When generating default op=,
-       set TYPE_HAS_ASSIGNMENT.
-
-Mon Jan 10 18:48:06 1994  Mike Stump  <mrs@cygnus.com>
-
-       * cp-cvt.c (convert): Make {double, clashing enum} -> enum
-       invalid.
-       * cp-typeck.c (convert_for_assignment): Simplify.
-       * cp-decl2.c (warn_enum_clash): Removed.
-       * invoke.texi (-Wenum-clash): Removed.
-       * toplev.c (-Wenum-clash): Removed.
-
-Mon Jan 10 17:48:37 1994  Kung Hsu  <kung@mexican.cygnus.com>
-
-       * cp-decl.c (finish_decl): fix incorrect popclass call.
-
-       * cp-decl.c (is_anon_name): new function, check whether the name
-       is anonymous name generated by compiler.
-       * cp-decl.c (grokdeclarator): allow nested SCOPE_REF
-       * cp-spew.c (hack_more_ids): handle nested type in template.
-       * cp-parse.y : handle nested type reference in uninstantiated
-       template.
-       * cp-call.c (build_method_call): handle uninstantiated template
-       case.
-       * cp-pt.c (search_nested_type_in_tmpl): new function, search nested 
-       type in template.
-       * cp-pt.c (lookup_nested_type_by_name): new function, lookup nested 
-       type by name.
-       * cp-pt.c (tsubst): handle nested type search by name.
-
-Mon Jan 10 14:32:18 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-init.c (build_member_call): Propagate qualifiers to new type.
-
-       * cp-call.c (build_method_call): Count functions the new way.
-
-Fri Jan  7 19:03:26 1994  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-decl.c (pushtag): Set DECL_ASSEMBLER_NAME for nested classes,
-       too.
-
-Tue Jan  4 16:45:51 1994  Kung Hsu  <kung@cirdan.cygnus.com>
-
-       * cp-parse.y: change to handle whether to globalize nested class.
-       * cp-decl.c(xref_tag, maybe_globalize_type): Likewise.
-
-Mon Jan  3 22:22:32 1994  Gerald Baumgartner  <gb@cygnus.com>
-
-       * Makefile.in cp-call.c cp-class.c cp-cvt.c cp-decl.c cp-decl2.c
-       cp-error.c cp-init.c cp-lex.c cp-lex.h cp-method.c cp-parse.y
-       cp-spew.c cp-tree.c cp-tree.h cp-type2.c cp-typeck.c cp-xref.c
-       gplus.gperf toplev.c: Incorporated C++ signature extension.
-       * cp-sig.c: New file, contains most of signature processing.
-       * cp-hash.h: Regenerated from gplus.gperf.
-
-       * gcc.1 g++.1: Added explanation for  the `-fhandle-signatures'
-       and `-fno-handle-signatures' command line flags.
-
-       * gcc.texi: Changed the last-modification date.
-       * invoke.texi: Added `-fhandle-signatures' in the list of
-       C++ language options.  Added explanation for this option.
-
-Tue Dec 28 21:10:03 1993  Mike Stump  <mrs@cygnus.com>
-
-       * cp-init.c (expand_vec_init): Remove comptypes test, as it is too
-       harsh here.
-
-Tue Dec 28 13:42:22 1993  Mike Stump  <mrs@cygnus.com>
-
-       * cp-pt.c (do_pending_expansions): Decide to expand a template
-       member function, based upon it's class type, not the class type of
-       the first place it was declared.
-
-Tue Dec 28 05:42:31 1993  Mike Stump  <mrs@cygnus.com>
-
-       * cp-class.c (is_normal): New routine, use to determine when the
-       given binfo is the normal one.  (The one that should have the simple
-       vtable name.)
-       * cp-class.c (modify_other_vtable_entries): Use DECL_ASSEMBLER_NAME
-       to check if two fndecls are `the same'.  Sometimes this routine can
-       modify the main vtable, and normal should be 1, in that case, so use
-       is_normal() to determine if this is the main vtable for the class.
-       Don't recurse down virtual bases, as they are shared, and we take
-       care of them elsewhere.
-       * cp-class.c (modify_vtable_entries): If we have already updated the
-       vtable with the new virtual, don't do it again.
-       * cp-class.c (finish_struct): Set CLASSTYPE_VFIELD_PARENT as
-       appropriate.  Do virtual function overriding in virtual bases, after
-       normal overriding, so that the base function list in DECL_VINDEX is
-       not overridden, before we have a chance to run through the list.
-       Use DECL_ASSEMBLER_NAME to check if two fndecls are `the same'.
-       Make sure we pass the right address into modify_vtable_entries.
-       * cp-tree.h (CLASSTYPE_VFIELD_PARENT): New field to indicate which
-       binfo is the one that has the vtable that we based our vtable on.
-
-Fri Dec 24 09:40:52 1993  Michael Tiemann  <tiemann@blues.cygnus.com>
-
-       * cp-typeck.c (c_expand_start_case): Use default_conversion to
-       convert expression from reference type if necessary.
-
-Wed Dec 22 17:58:43 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-typeck.c (build_unary_op): Make sure that it's a TREE_LIST before
-       trying to read its TREE_VALUE.
-
-       * cp-class.c (finish_struct_methods): Clear DECL_IN_AGGR_P here.
-       (finish_struct): Instead of here.
-
-Tue Dec 21 14:34:25 1993  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * cp-tree.c (list_hash_lookup_or_cons): Make sure the type doesn't
-       have TYPE_PTRMEMFUNC_P set before we try to build its
-       CLASSTYPE_ID_AS_LIST.
-       (get_decl_list): Likewise, when trying to read it.
-
-       * cp-tree.h (VTABLE_NAME): No def with NO_{DOLLAR,DOT} defined.
-       (VTABLE_NAME_P): Use it instead of VTABLE_NAME_FORMAT.
-
-Mon Dec 20 13:35:03 1993  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * cp-typeck.c (rationalize_conditional_expr): New function.
-       (unary_complex_lvalue): Use it.
-       (build_modify_expr): Use it, since trying to do an ADDR_EXPR of it
-       with build_unary_op won't cut it.  Don't wrap the COND_EXPR with a
-       SAVE_EXPR either.
-
-       * cp-decl2.c (explicit_warn_return_type): Deleted variable.
-       (lang_decode_option): Set warn_return_type, not explicit_*, for
-       -Wreturn-type and -Wall.  This is what rest_of_compilation uses to
-       decide if it should go into jump_optimize or not.
-       * cp-tree.h (explicit_warn_return_type): Deleted.
-       * cp-decl.c (grokdeclarator): Use warn_return_type, not explicit_*.
-       (finish_function): Also complain about no return in a non-void fn if
-       we're being pedantic (don't rely on use of -Wreturn-type).
-
-Fri Dec 17 15:45:46 1993  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * cp-decl.c (grokdeclarator): Forbid declaration of a function as
-       static if it's being done inside another function.
-
-       * cp-search.c (compute_visibility): Check for friendship both ways.
-
-Fri Dec 17 14:28:25 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-cvt.c (build_default_binary_type_conversion): Make error
-       messages more helpful.
-
-       * cp-error.c (op_as_string): New function, returns "operator =="
-       given EQ_EXPR or suchlike.
-
-Fri Dec 17 13:28:11 1993  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * cp-call.c (print_n_candidates): New function.
-       (build_overload_call_real): Use it when we complain about a call
-       being ambiguous.
-
-Fri Dec 17 12:41:17 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-call.c (build_method_call): Fix checking for static call
-       context.
-
-       * cp-method.c (build_opfncall): Call build_indirect_ref on argument
-       to operator new.
-
-       * cp-init.c (build_new): Don't mess with rval when building
-       indirect ref.
-
-Thu Dec 16 16:48:05 1993  Kung Hsu  <kung@cirdan.cygnus.com>
-
-       * cp-lex.c (default_assign_ref_body): add check when TYPE_NESTED_
-       NAME(type) may not be exist. It's not a problem for old compiler.
-
-Thu Dec 16 14:46:06 1993  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * cp-tree.h (CLASSTYPE_ALTERS_VISIBILITIES_P): Delete macro, it's
-       never used for anything.
-       (struct lang_type, member type_flags): Delete field
-       `alters_visibility', and up `dummy' by 1.
-       * cp-class.c (finish_base_struct): Delete code that copies the
-       setting of CLASSTYPE_ALTERS_VISIBILITIES_P.
-       (finish_struct): Delete code that sets it.
-
-Thu Dec 16 14:44:39 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-decl.c, cp-init.c, cp-typeck.c: Fix arguments to
-       build_method_call that I messed up before.
-
-       * cp-search.c (get_base_distance): If protect > 1, allow immediate
-       private base.
-
-       * cp-class.c (finish_base_struct): Set cant_synth_* correctly.
-       (finish_struct): Likewise.  Well, nigh-correctly; it won't deal
-       properly with the case where a class contains an object of an
-       ambiguous base class which has a protected op=.  Should be fixed
-       when the access control code gets overhauled.
-       (finish_struct_methods): Set TYPE_HAS_NONPUBLIC_* correctly.
-
-Thu Dec 16 12:17:06 1993  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * cp-lex.c (real_yylex): Turn the code back on that deals with
-       __FUNCTION__ and __PRETTY_FUNCTION__.  Don't use lookup_name, to
-       avoid the ambiguity problems that led to it being turned off in the
-       first place.
-
-       * cp-method.c (hack_identifier): Also check for a TYPE_PTRMEMFUNC_P
-       to see if something is a method.
-
-Wed Dec 15 18:35:58 1993  Mike Stump  <mrs@cygnus.com>
-
-       * cp-typeck.c (build_modify_expr): Avoid error messages on small
-       enum bit fields.
-       * cp-typeck.c (convert_for_assignment): Add missing argument to
-       cp_warning and cp_pedwarn calls.
-
-Wed Dec 15 18:25:32 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-parse.y (member_init): ANSI C++ doesn't forbid old-style base
-       initializers; it's just anachronistic.
-
-       * cp-decl.c (finish_decl): Don't require external-linkage arrays
-       to have a complete type at declaration time when pedantic.
-
-Tue Dec 14 11:37:23 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-decl.c (pushdecl): Don't set DECL_CONTEXT if it's already set.
-
-       * cp-call.c (build_method_call): Don't dereference pointer given
-       as instance.
-
-       * cp-decl.c (finish_function): Don't pass pointer to
-       build_method_call.
-       (finish_function): Likewise.
-
-       * cp-typeck.c (build_x_function_call): Likewise.
-
-       * cp-method.c (build_component_type_expr): Likewise.
-
-       * cp-init.c (build_member_call): Likewise.
-       (build_new): Likewise.
-
-Mon Dec 13 18:04:33 1993  Kung Hsu  <kung@cirdan.cygnus.com>
-
-       * cp-decl.c (xref_tag): fix regression created by changes made 
-       in Dec. 7 1993.
-       * cp-decl.c (xref_defn_tag): fix parallel nested class problem.
-
-Fri Dec 10 12:40:25 1993  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * cp-call.c (compute_conversion_costs_ansi) [DEBUG_MATCHING]: Print
-       out the final evaluation of the function, so we can see if ELLIPSIS,
-       USER, and EVIL were set at the end.
-
-       * cp-call.c (convert_harshness_ansi): When the parm isn't an lvalue,
-       only go for setting TRIVIAL_CODE if we are dealing with types that
-       are compatible.
-
-Thu Dec  9 18:27:22 1993  Mike Stump  <mrs@cygnus.com>
-
-       * cp-decl.c (flag_huge_objects): New flag to allow large objects.
-       * toplev.c (lang_options): Likewise.
-       * cp-decl2.c (flag_huge_objects, lang_f_options): Likewise.
-       * cp-decl.c (delta_type_node): New type for delta entries.
-       * cp-tree.h (delta_type_node): Likewise.
-       * cp-decl.c (init_decl_processing): Setup delta_type_node.
-       * cp-decl.c (init_decl_processing, build_ptrmemfunc_type): Use
-       delta_type_node instead of short_integer_type_node. 
-       * cp-class.c (build_vtable_entry): Likewise.
-
-Thu Dec  9 16:19:05 1993  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * cp-tree.h (OPERATOR_TYPENAME_P): Define outside of
-       NO_{DOLLAR,DOT} macro checks, so it always gets defined.
-       (VTABLE_NAME_P): Define for NO_DOT && NO_DOLLAR_IN_LABEL.
-
-Wed Dec  8 17:38:06 1993  Mike Stump  <mrs@cygnus.com>
-
-       * cp-decl.c (finish_decl): Make sure things that can go into
-       "common", do go into common, if -fcommon is given.
-
-Wed Dec  8 13:01:54 1993  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * cp-call.c (print_harshness) [DEBUG_MATCHING]: New function.
-       (compute_conversion_costs_ansi) [DEBUG_MATCHING]: Print out
-       argument matching diagnostics to make instantly clear what the
-       compiler is doing.
-
-       * cp-call.c (convert_harshness_ansi): If the parm isn't an lvalue,
-       then check to see if the penalty was increased due to
-       signed/unsigned mismatch, and use a TRIVIAL_CODE if it wasn't.
-
-Tue Dec  7 18:29:14 1993  Kung Hsu  <kung@cirdan.cygnus.com>
-
-       * cp-decl.c (xref_tag, pushtag): Fix nested class search/resolution
-       problem.
-
-Tue Dec  7 16:09:34 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-class.c (finish_struct): Before synthesizing methods, if no
-       methods have yet been declared then set nonprivate_method.  Don't
-       set non_private method after synthesizing a method.
-
-       * cp-lex.c (extract_interface_info): If flag_alt_external_templates
-       is set, tie emitted code to the location of template instantiation,
-       rather than definition.
-
-       * cp-tree.h: Declare flag_alt_external_templates.
-
-       * cp-decl2.c (lang_decode_option): Support -falt-external-templates.
-
-       * toplev.c (lang_options): Likewise.
-
-Mon Oct  4 12:50:02 1993  Chip Salzenberg  <chip@fin.uucp>
-
-       [changes propagated from 930810 snapshot]
-       * cp-decl.c (init_decl_processing): Make long long available for use
-       as SIZE_TYPE and PTRDIFF_TYPE.
-       (finish_decl): Allow file-scope static incomplete array.
-       (grokdeclarator): Don't pass on const and volatile fron function
-       value type to function type.
-       Warn here for volatile fn returning non-void type.
-       * cp-parse.y (attrib): Accept attributes `volatile' with alias
-       `noreturn', and `const'.
-       * cp-typeck.c (default_conversion): Don't lose const and volatile.
-       (build_binary_op_nodefault): Generate pedantic warning for comparison
-       of complete pointer type with incomplete pointer type.
-       (build_c_cast): Be careful that null pointer constant be INTEGER_CST.
-
-Tue Dec  7 10:46:48 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-init.c (expand_vec_init): When creating a temporary for copying
-       arrays, use the type of the source, not the target.
-
-       * cp-cvt.c (convert): Pass an argument for errtype to
-       convert_to_reference.
-
-       * cp-error.c (dump_expr, COMPONENT_REF & CALL_EXPR): Deal with
-       methods, -> and `this'.
-
-Mon Dec  6 17:12:33 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-error.c (parm_as_string): New function; returns `this' or arg
-       number.  Corresponds to %P.
-       (dump_expr): Deal with method calls.
-
-       * cp-cvt.c (convert_to_reference): Stop using warn_for_assignment.
-       * cp-typeck.c (convert_for_assignment): Likewise.
-       (warn_for_assignment): Lose.
-
-Mon Dec  6 11:33:35 1993  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * cp-call.c (ideal_candidate_ansi): Delete code that was never
-       doing anything useful.  Instead, sort once, and DO NOT wipe
-       out any codes with EVIL_CODE, since that's what we use as a
-       marker for the end of the list of candidates.
-
-       * cp-cvt.c (convert_to_aggr): Make sure to always set H_LEN.
-
-Mon Dec  6 12:49:17 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-init.c (get_aggr_from_typedef): New function, like
-       is_aggr_typedef but returns the _TYPE.
-
-       * cp-call.c, cp-init.c, cp-method.c: Eradicate err_name.
-
-Sun Dec  5 18:12:48 1993  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * cp-lex.c (readescape): Pedwarn when a hex escape is out of range.
-
-Thu Nov 25 23:50:19 1993  Chip Salzenberg  <chip@fin.uucp>
-
-       Delay language context change until beginning of next decl.
-
-       * cp-lex.h (c_header_level): Removed.
-       (pending_lang_change): Declared.
-       * cp-lex.c (c_header_level): Renamed from in_c_header, made static.
-       (pending_lang_change): Defined.
-       (check_newline): Rework code that recognizes line number and
-       filename changes.  Instead of pushing and popping lang context,
-       increment and decrement pending_lang_change.
-       (do_pending_lang_change):  Push and pop lang context according
-       to value of pending_lang_change.
-       * cp-parse.y (extdefs): Use lang_extdef instead of extdef.
-       (extdef): Same as extdef, but call do_pending_lang_change() first.
-
-Mon Nov 15 15:39:15 1993  Chip Salzenberg  <chip@fin.uucp>
-
-       * cp-typeck.c (build_binary_op_nodefault): Warn for ordered
-       compare of ptr with 0 only if pedantic in both cases.
-
-Thu Nov 25 13:31:37 1993  Chip Salzenberg  <chip@fin.uucp>
-
-       Reinstate the below patch, which got lost in the Cygnus merge:
-       Tue Nov 23 13:59:24 1993  Hallvard B Furuseth  (hbf@durin.uio.no)
-       * cp-parse.y (maybe_type_qual): Don't fail to set $$.
-
-Wed Nov 17 19:03:30 1993  Chip Salzenberg  <chip@fin.uucp>
-
-       * cp-parse.y (attrib): Allow "ident(ident)" like the C front end.
-
-Fri Oct 22 20:43:37 1993  Paul Eggert  <eggert@twinsun.com>
-
-       * cp-lex.c (real_yylex): Diagnose floating point constants
-       that are too large.
-
-Wed Nov 17 19:10:37 1993  Chip Salzenberg  <chip@fin.uucp>
-
-       * cp-type2.c (build_functional_cast): ARM page 16: When a class
-       and an object, function or enumerator are declared in the same
-       scope with the same name, the class name is hidden.
-
-Wed Nov 17 19:07:18 1993  Chip Salzenberg  <chip@fin.uucp>
-
-       * cp-call.c (convert_harshness_ansi): Distinguish float, double,
-       and long double from each other when overloading.
-       (compute_conversion_costs_{ansi,old}, build_method_call,
-       build_overlay_call_real, convert_to_aggr): Always set and
-       always use H_LEN member of candidate structure.
-
-Mon Oct 11 23:10:53 1993  Chip Salzenberg  <chip@fin.uucp>
-
-       * cp-decl.c (duplicate_decls): Note redeclarations of library
-       functions, and generate distinct warnings for them.
-
-Mon Oct  4 12:26:49 1993  Chip Salzenberg  <chip@fin.uucp>
-
-       Support format warnings in G++.
-
-       * cp-tree.h: Protect against multiple inclusion.
-       Declare all public functions in c-common.c (copy from c-tree.h).
-       (STDIO_PROTO): Define.
-       (warn_format): Declare.
-       (record_format_info): Remove declaration.
-       * cp-decl.c (init_decl_processing): Call init_function_format_info.
-       * cp-decl2.c (lang_decode_option): Make "-Wall" include warn_format.
-       * cp-typeck.c (build_function_call_real): Call check_function_format.
-       (record_format_info): Remove -- obsolete stub.
-
-Sat Jul 24 12:04:29 1993  Chip Salzenberg  <chip@fin.uucp>
-
-       * cp-decl.c (duplicate_decls): Don't warn for non-extern var decl
-       following an extern one (for -Wredundant-decls).
-       * cp-parse.y (primary): In statement expression case, if compstmt
-       returns something other than a BLOCK, return it unchanged.
-
-Thu Dec  2 20:44:58 1993  Chip Salzenberg  <chip@fin.uucp>
-
-       * cp-decl.c (warn_extern_redeclared_static): New function made
-       from code extracted from pushdecl.
-       (duplicate_decls, pushdecl): Call new function.
-       (lookup_name_current_level): Allow for IDENTIFIER_GLOBAL_VALUE
-       to be a TREE_LIST when function is declared in 'extern "C" {}'.
-
-Fri Dec  3 16:01:10 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-class.c (duplicate_tag_error): Use cp_error.
-       (finish_base_struct): Check for ambiguity with direct base, and don't
-       generate op= or copy ctor if it exists.
-
-Fri Dec  3 15:32:34 1993  Kung Hsu  <kung@cirdan.cygnus.com>
-
-       * cp-init.c (expand_member_init): when initializer name is null,
-       don't try to build it now because emit_base_init will handle it.
-
-Fri Dec  3 12:28:59 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-lex.c (init_lex): Initialize input_filename to "<internal>" for
-       code such as ExceptionHandler::operator=.
-
-Fri Dec  3 10:32:08 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-decl.c (grokdeclarator): Don't try to print out dname when
-       complaining about arrays of references if decl_context==TYPENAME,
-       since it will be null.
-
-       * cp-decl2.c: Default to flag_ansi_overloading.
-
-Thu Dec  2 18:05:56 1993  Kung Hsu  <kung@cirdan.cygnus.com>
-
-       * cp-call.c (build_method_call): use binfo from instance if it's
-       different from binfo (basetype_path) passed from above.
-
-Wed Nov 17 19:14:29 1993  Chip Salzenberg  <chip@fin.uucp>
-
-       cp-error.c (dump_expr): Use unsigned chars to output a
-       TREE_REAL_CST in hex.
-
-Thu Dec  2 11:05:48 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-class.c (finish_struct): Fix typo in setting
-       cant_synth_asn_ref.
-
-       * cp-tree.h (TYPE_NESTED_NAME): New macro, does
-       DECL_NESTED_TYPENAME (TYPE_NAME (NODE)).
-
-       * cp-lex.c (default_copy_constructor_body): Change
-       DECL_NAME (TYPE_NAME (btype)) to TYPE_NESTED_NAME (btype).
-       (default_assign_ref_body): Likewise.
-       (default_copy_constructor_body): Call operator= explicitly for
-       base classes that have no constructor.
-
-Thu Dec  2 10:47:15 1993  Michael Tiemann  <tiemann@blues.cygnus.com>
-
-       * cp-call.c (build_method_call): If the instance variable is
-       converted to error_mark_node when we're trying to convert it to the
-       base type of a method we're looking up, return error_mark_node.
-
-Thu Dec  2 10:41:16 1993  Torbjorn Granlund  <tege@cygnus.com>
-
-       * cp-typeck.c (build_binary_op_nodefault): In *_DIV_EXPR *_MOD_EXPR
-       cases, tests for unsigned operands by peeking inside a NOP_EXPR.
-
-Wed Dec  1 13:33:34 1993  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * cp-call.c (compute_conversion_costs_ansi): Use the size of struct
-       harshness_code, not the size of short, for clearing out the
-       ansi_harshness.
-
-       * cp-call.c (print_candidates): New function.
-       (build_method_call): When we had some candidates, but didn't get a
-       usable match, don't report that we got an error with the first
-       candidate.  Instead, say there were no matches, and list the
-       candidates with print_candidates.  In the second pass, make sure we
-       clear out ever_seen, so we can accurately count the number of
-       functions that qualified.
-
-Wed Dec  1 09:53:59 1993  Torbjorn Granlund  <tege@cygnus.com>
-
-       * cp-typeck.c (build_binary_op_nodefault): Shorten for *_MOD_EXPR
-       only if op1 is known to be != -1.
-       (build_binary_op_nodefault): Handle *_DIV_EXPR likewise.
-
-Tue Nov 30 14:07:26 1993  Brendan Kehoe  <brendan@lisa.cygnus.com>
-
-       * cp-method.c (hack_identifier): If the field itself is private, and
-       not from a private base class, say so.
-
-Mon Nov 29 03:00:56 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-decl.c (grokdeclarator): Always warn on initialization of
-       const member.
-
-Wed Nov 24 00:49:35 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-class.c (finish_struct): Set TYPE_GETS_CONST_* properly.
-       (finish_base_struct): Set cant_synth_asn_ref properly.
-
-       * cp-lex.c (cons_up_default_function): Add section for operator=.
-       (default_assign_ref_body): New function, mostly cribbed from
-       default_copy_constructor_body.
-
-       * cp-class.c (base_info): Add members cant_synth_copy_ctor,
-       cant_synth_asn_ref, no_const_asn_ref.
-       (finish_base_struct): Update no_const_asn_ref, note that you should
-       update cant_synth_*, propagate TYPE_GETS_ASSIGN_REF.
-       (finish_struct): Add decls for cant_synth_*, no_const_asn_ref, and
-       initialize them properly.  Set no_const_asn_ref properly.  Set
-       cant_synth_* in some of the situations where they should be set.
-       Propagate TYPE_GETS_ASSIGN_REF.  Use cant_synth_copy_ctor.  Add call
-       to cons_up_default_function for operator=.
-
-Tue Nov 23 20:24:58 1993  Mike Stump  <mrs@cygnus.com>
-
-       * cp-cvt.c (convert_force): Add code to perform casting of pointer
-       to member function types.
-       * cp-typeck.c (build_ptrmemfunc): Add FORCE parameter to indicate
-       when the conversion should be done, regardless.
-       * cp-tree.h (build_ptrmemfunc): Likewise.
-       * cp-type2.c (digest_init): Likewise.
-       * cp-typeck.c (convert_for_assignment): Likewise.
-
-Tue Nov 23 18:06:58 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-error.c (dump_expr): Do the right thing for variables of
-       reference type.
-
-       * cp-decl.c (grok_op_properties): Set TYPE_HAS_ASSIGN_REF
-       and its kin properly.
-       (xref_tag): Propagate TYPE_GETS_ASSIGN_REF.
-
-Tue Nov 23 12:26:13 1993  Mike Stump  <mrs@cygnus.com>
-
-       * cp-method.c (build_opfncall): Don't count pointer to member
-       functions as aggregates here, as we don't want to look up methods in
-       them.  The compiler would core dump if we did, as they don't have
-       normal names.
-       * cp-typeck.c (build_indirect_ref): Improve wording on error
-       message.
-
-Mon Nov 22 14:22:23 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-decl.c (grok_op_properties): Allow operator?: with pedwarn
-       (since it's supported in other compiler bits).
-
-       * cp-method.c (report_type_mismatch): Use cp_error; ignore err_name
-       argument.
-
-       * cp-error.c (dump_function_decl): Don't print return type for
-       constructors and destructors.
-
-       * cp-cvt.c (cp_convert_to_pointer): Import code from
-       convert_to_pointer so we can return error_mark_node in the case of an
-       error, and to allow more meaningful error messages.
-       (build_type_conversion): Don't go through void* when trying
-       to convert to a pointer type.
-
-       * cp-decl.c (grokfndecl): Move call to grok_op_properties back
-       after grokclassfn so that it's dealing with the right decl.
-       (grok_op_properties): Don't assert !methodp for op new and op delete.
-
-       * cp-init.c (build_delete): Don't use TYPE_BUILT_IN (there are now
-       no uses of it in the compiler).
-
-       * cp-call.c (build_scoped_method_call): Fix for destructors of simple
-       types.
-       (build_method_call): Likewise.
-
-Fri Nov 19 12:59:38 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-tree.c (count_functions): Abstraction function.
-
-       * cp-call.c (build_overload_call_real): Deal with new overloading
-       properly, remove dead code.
-
-       * gcc.c (default_compilers): Generate and use .ii files in the
-       intermediate stage of compiling C++ source.
-
-Fri Nov 19 11:26:09 1993  Jim Wilson  <wilson@sphagnum.cygnus.com>
-
-       * cp-expr.c (cplus_expand_expr): Make call_target a valid memory
-       address before using it, so it can be later safely compared.
-
-Fri Nov 12 15:30:27 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-pt.c (tsubst): Deal with new overloading.
-
-       * cp-typeck.c (fntype_p): is the arg function type?
-       (comp_target_parms): pedwarn on conversion from (anything) to (...).
-       (build_x_function_call): Deal with new overloading.
-
-       * cp-tree.c (decl_list_length): Deal with new overloading.
-       (decl_value_member): Like value_member, but for DECL_CHAINs.
-
-       * cp-decl.c (duplicate_decls): Deal with new overloading.
-       (start_decl): Likewise.
-
-       * cp-class.c (instantiate_type): Deal with new overloading.
-
-       * cp-call.c (convert_harshness_ansi): Deal with new overloading.
-       (convert_harshness_old): Deal with new overloading.
-       (build_overload_call_real): Likewise.
-
-Mon Nov  8 13:50:49 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-tree.c (get_unique_fn): New function; returns FUNCTION_DECL
-       if unambiguous, NULL_TREE otherwise.
-       (get_first_fn): Returns the first appropriate FUNCTION_DECL.
-       (is_overloaded_fn): Returns whether or not the passed tree is
-       a function or list of functions.
-
-       * cp-init.c (init_init_processing): use `get_first_fn' to find
-       the FUNCTION_DEFN for new and delete.
-
-       * cp-decl.c (push_overloaded_decl): Use new overloading strategy, cut
-       code size in half (I spit on special cases).
-
-Tue Sep  7 20:03:33 1993  Jason Merrill  <jason@deneb.cygnus.com>
-
-       * cp-decl.c: Allow references and template type parameters as well
diff --git a/gcc/cpp.info b/gcc/cpp.info
deleted file mode 100644 (file)
index f20aef9..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-This is Info file cpp.info, produced by Makeinfo version 1.67 from the
-input file cpp.texi.
-
-   This file documents the GNU C Preprocessor.
-
-   Copyright 1987, 1989, 1991, 1992, 1993, 1994, 1995 Free Software
-Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the entire resulting derived work is distributed under the terms
-of a permission notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions.
-
-\1f
-Indirect:
-cpp.info-1: 798
-cpp.info-2: 50062
-cpp.info-3: 91249
-\1f
-Tag Table:
-(Indirect)
-Node: Top\7f798
-Node: Global Actions\7f3707
-Node: Directives\7f6227
-Node: Header Files\7f7914
-Node: Header Uses\7f8573
-Node: Include Syntax\7f10065
-Node: Include Operation\7f13207
-Node: Once-Only\7f15069
-Node: Inheritance\7f17494
-Node: Macros\7f20027
-Node: Simple Macros\7f20941
-Node: Argument Macros\7f23929
-Node: Predefined\7f29727
-Node: Standard Predefined\7f30157
-Node: Nonstandard Predefined\7f37948
-Node: Stringification\7f41524
-Node: Concatenation\7f44450
-Node: Undefining\7f47723
-Node: Redefining\7f48762
-Node: Macro Pitfalls\7f50062
-Node: Misnesting\7f51166
-Node: Macro Parentheses\7f52180
-Node: Swallow Semicolon\7f54048
-Node: Side Effects\7f55948
-Node: Self-Reference\7f57646
-Node: Argument Prescan\7f59922
-Node: Cascaded Macros\7f64924
-Node: Newlines in Args\7f66069
-Node: Conditionals\7f67414
-Node: Conditional Uses\7f68766
-Node: Conditional Syntax\7f70189
-Node: #if Directive\7f70775
-Node: #else Directive\7f73064
-Node: #elif Directive\7f73731
-Node: Deleted Code\7f75109
-Node: Conditionals-Macros\7f76170
-Node: Assertions\7f79855
-Node: #error Directive\7f84090
-Node: Combining Sources\7f85575
-Node: Other Directives\7f88486
-Node: Output\7f89940
-Node: Invocation\7f91249
-Node: Concept Index\7f103346
-Node: Index\7f106199
-\1f
-End Tag Table
diff --git a/gcc/cpp.info-1 b/gcc/cpp.info-1
deleted file mode 100644 (file)
index aa15a02..0000000
+++ /dev/null
@@ -1,1182 +0,0 @@
-This is Info file cpp.info, produced by Makeinfo version 1.67 from the
-input file cpp.texi.
-
-   This file documents the GNU C Preprocessor.
-
-   Copyright 1987, 1989, 1991, 1992, 1993, 1994, 1995 Free Software
-Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the entire resulting derived work is distributed under the terms
-of a permission notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions.
-
-\1f
-File: cpp.info,  Node: Top,  Next: Global Actions,  Up: (DIR)
-
-The C Preprocessor
-******************
-
-   The C preprocessor is a "macro processor" that is used automatically
-by the C compiler to transform your program before actual compilation.
-It is called a macro processor because it allows you to define "macros",
-which are brief abbreviations for longer constructs.
-
-   The C preprocessor provides four separate facilities that you can
-use as you see fit:
-
-   * Inclusion of header files.  These are files of declarations that
-     can be substituted into your program.
-
-   * Macro expansion.  You can define "macros", which are abbreviations
-     for arbitrary fragments of C code, and then the C preprocessor will
-     replace the macros with their definitions throughout the program.
-
-   * Conditional compilation.  Using special preprocessing directives,
-     you can include or exclude parts of the program according to
-     various conditions.
-
-   * Line control.  If you use a program to combine or rearrange source
-     files into an intermediate file which is then compiled, you can
-     use line control to inform the compiler of where each source line
-     originally came from.
-
-   C preprocessors vary in some details.  This manual discusses the GNU
-C preprocessor, the C Compatible Compiler Preprocessor.  The GNU C
-preprocessor provides a superset of the features of ANSI Standard C.
-
-   ANSI Standard C requires the rejection of many harmless constructs
-commonly used by today's C programs.  Such incompatibility would be
-inconvenient for users, so the GNU C preprocessor is configured to
-accept these constructs by default.  Strictly speaking, to get ANSI
-Standard C, you must use the options `-trigraphs', `-undef' and
-`-pedantic', but in practice the consequences of having strict ANSI
-Standard C make it undesirable to do this.  *Note Invocation::.
-
-   The C preprocessor is designed for C-like languages; you may run into
-problems if you apply it to other kinds of languages, because it assumes
-that it is dealing with C.  For example, the C preprocessor sometimes
-outputs extra white space to avoid inadvertent C token concatenation,
-and this may cause problems with other languages.
-
-* Menu:
-
-* Global Actions::    Actions made uniformly on all input files.
-* Directives::        General syntax of preprocessing directives.
-* Header Files::      How and why to use header files.
-* Macros::            How and why to use macros.
-* Conditionals::      How and why to use conditionals.
-* Combining Sources:: Use of line control when you combine source files.
-* Other Directives::  Miscellaneous preprocessing directives.
-* Output::            Format of output from the C preprocessor.
-* Invocation::        How to invoke the preprocessor; command options.
-* Concept Index::     Index of concepts and terms.
-* Index::             Index of directives, predefined macros and options.
-
-\1f
-File: cpp.info,  Node: Global Actions,  Next: Directives,  Prev: Top,  Up: Top
-
-Transformations Made Globally
-=============================
-
-   Most C preprocessor features are inactive unless you give specific
-directives to request their use.  (Preprocessing directives are lines
-starting with `#'; *note Directives::.).  But there are three
-transformations that the preprocessor always makes on all the input it
-receives, even in the absence of directives.
-
-   * All C comments are replaced with single spaces.
-
-   * Backslash-Newline sequences are deleted, no matter where.  This
-     feature allows you to break long lines for cosmetic purposes
-     without changing their meaning.
-
-   * Predefined macro names are replaced with their expansions (*note
-     Predefined::.).
-
-   The first two transformations are done *before* nearly all other
-parsing and before preprocessing directives are recognized.  Thus, for
-example, you can split a line cosmetically with Backslash-Newline
-anywhere (except when trigraphs are in use; see below).
-
-     /*
-     */ # /*
-     */ defi\
-     ne FO\
-     O 10\
-     20
-
-is equivalent into `#define FOO 1020'.  You can split even an escape
-sequence with Backslash-Newline.  For example, you can split `"foo\bar"'
-between the `\' and the `b' to get
-
-     "foo\\
-     bar"
-
-This behavior is unclean: in all other contexts, a Backslash can be
-inserted in a string constant as an ordinary character by writing a
-double Backslash, and this creates an exception.  But the ANSI C
-standard requires it.  (Strict ANSI C does not allow Newlines in string
-constants, so they do not consider this a problem.)
-
-   But there are a few exceptions to all three transformations.
-
-   * C comments and predefined macro names are not recognized inside a
-     `#include' directive in which the file name is delimited with `<'
-     and `>'.
-
-   * C comments and predefined macro names are never recognized within a
-     character or string constant.  (Strictly speaking, this is the
-     rule, not an exception, but it is worth noting here anyway.)
-
-   * Backslash-Newline may not safely be used within an ANSI "trigraph".
-     Trigraphs are converted before Backslash-Newline is deleted.  If
-     you write what looks like a trigraph with a Backslash-Newline
-     inside, the Backslash-Newline is deleted as usual, but it is then
-     too late to recognize the trigraph.
-
-     This exception is relevant only if you use the `-trigraphs' option
-     to enable trigraph processing.  *Note Invocation::.
-
-\1f
-File: cpp.info,  Node: Directives,  Next: Header Files,  Prev: Global Actions,  Up: Top
-
-Preprocessing Directives
-========================
-
-   Most preprocessor features are active only if you use preprocessing
-directives to request their use.
-
-   Preprocessing directives are lines in your program that start with
-`#'.  The `#' is followed by an identifier that is the "directive name".
-For example, `#define' is the directive that defines a macro.
-Whitespace is also allowed before and after the `#'.
-
-   The set of valid directive names is fixed.  Programs cannot define
-new preprocessing directives.
-
-   Some directive names require arguments; these make up the rest of
-the directive line and must be separated from the directive name by
-whitespace.  For example, `#define' must be followed by a macro name
-and the intended expansion of the macro.  *Note Simple Macros::.
-
-   A preprocessing directive cannot be more than one line in normal
-circumstances.  It may be split cosmetically with Backslash-Newline,
-but that has no effect on its meaning.  Comments containing Newlines
-can also divide the directive into multiple lines, but the comments are
-changed to Spaces before the directive is interpreted.  The only way a
-significant Newline can occur in a preprocessing directive is within a
-string constant or character constant.  Note that most C compilers that
-might be applied to the output from the preprocessor do not accept
-string or character constants containing Newlines.
-
-   The `#' and the directive name cannot come from a macro expansion.
-For example, if `foo' is defined as a macro expanding to `define', that
-does not make `#foo' a valid preprocessing directive.
-
-\1f
-File: cpp.info,  Node: Header Files,  Next: Macros,  Prev: Directives,  Up: Top
-
-Header Files
-============
-
-   A header file is a file containing C declarations and macro
-definitions (*note Macros::.) to be shared between several source
-files.  You request the use of a header file in your program with the C
-preprocessing directive `#include'.
-
-* Menu:
-
-* Header Uses::         What header files are used for.
-* Include Syntax::      How to write `#include' directives.
-* Include Operation::   What `#include' does.
-* Once-Only::          Preventing multiple inclusion of one header file.
-* Inheritance::         Including one header file in another header file.
-
-\1f
-File: cpp.info,  Node: Header Uses,  Next: Include Syntax,  Prev: Header Files,  Up: Header Files
-
-Uses of Header Files
---------------------
-
-   Header files serve two kinds of purposes.
-
-   * System header files declare the interfaces to parts of the
-     operating system.  You include them in your program to supply the
-     definitions and declarations you need to invoke system calls and
-     libraries.
-
-   * Your own header files contain declarations for interfaces between
-     the source files of your program.  Each time you have a group of
-     related declarations and macro definitions all or most of which
-     are needed in several different source files, it is a good idea to
-     create a header file for them.
-
-   Including a header file produces the same results in C compilation as
-copying the header file into each source file that needs it.  But such
-copying would be time-consuming and error-prone.  With a header file,
-the related declarations appear in only one place.  If they need to be
-changed, they can be changed in one place, and programs that include
-the header file will automatically use the new version when next
-recompiled.  The header file eliminates the labor of finding and
-changing all the copies as well as the risk that a failure to find one
-copy will result in inconsistencies within a program.
-
-   The usual convention is to give header files names that end with
-`.h'.  Avoid unusual characters in header file names, as they reduce
-portability.
-
-\1f
-File: cpp.info,  Node: Include Syntax,  Next: Include Operation,  Prev: Header Uses,  Up: Header Files
-
-The `#include' Directive
-------------------------
-
-   Both user and system header files are included using the
-preprocessing directive `#include'.  It has three variants:
-
-`#include <FILE>'
-     This variant is used for system header files.  It searches for a
-     file named FILE in a list of directories specified by you, then in
-     a standard list of system directories.  You specify directories to
-     search for header files with the command option `-I' (*note
-     Invocation::.).  The option `-nostdinc' inhibits searching the
-     standard system directories; in this case only the directories you
-     specify are searched.
-
-     The parsing of this form of `#include' is slightly special because
-     comments are not recognized within the `<...>'.  Thus, in
-     `#include <x/*y>' the `/*' does not start a comment and the
-     directive specifies inclusion of a system header file named
-     `x/*y'.  Of course, a header file with such a name is unlikely to
-     exist on Unix, where shell wildcard features would make it hard to
-     manipulate.
-
-     The argument FILE may not contain a `>' character.  It may,
-     however, contain a `<' character.
-
-`#include "FILE"'
-     This variant is used for header files of your own program.  It
-     searches for a file named FILE first in the current directory,
-     then in the same directories used for system header files.  The
-     current directory is the directory of the current input file.  It
-     is tried first because it is presumed to be the location of the
-     files that the current input file refers to.  (If the `-I-' option
-     is used, the special treatment of the current directory is
-     inhibited.)
-
-     The argument FILE may not contain `"' characters.  If backslashes
-     occur within FILE, they are considered ordinary text characters,
-     not escape characters.  None of the character escape sequences
-     appropriate to string constants in C are processed.  Thus,
-     `#include "x\n\\y"' specifies a filename containing three
-     backslashes.  It is not clear why this behavior is ever useful, but
-     the ANSI standard specifies it.
-
-`#include ANYTHING ELSE'
-     This variant is called a "computed #include".  Any `#include'
-     directive whose argument does not fit the above two forms is a
-     computed include.  The text ANYTHING ELSE is checked for macro
-     calls, which are expanded (*note Macros::.).  When this is done,
-     the result must fit one of the above two variants--in particular,
-     the expanded text must in the end be surrounded by either quotes
-     or angle braces.
-
-     This feature allows you to define a macro which controls the file
-     name to be used at a later point in the program.  One application
-     of this is to allow a site-specific configuration file for your
-     program to specify the names of the system include files to be
-     used.  This can help in porting the program to various operating
-     systems in which the necessary system header files are found in
-     different places.
-
-\1f
-File: cpp.info,  Node: Include Operation,  Next: Once-Only,  Prev: Include Syntax,  Up: Header Files
-
-How `#include' Works
---------------------
-
-   The `#include' directive works by directing the C preprocessor to
-scan the specified file as input before continuing with the rest of the
-current file.  The output from the preprocessor contains the output
-already generated, followed by the output resulting from the included
-file, followed by the output that comes from the text after the
-`#include' directive.  For example, given a header file `header.h' as
-follows,
-
-     char *test ();
-
-and a main program called `program.c' that uses the header file, like
-this,
-
-     int x;
-     #include "header.h"
-     
-     main ()
-     {
-       printf (test ());
-     }
-
-the output generated by the C preprocessor for `program.c' as input
-would be
-
-     int x;
-     char *test ();
-     
-     main ()
-     {
-       printf (test ());
-     }
-
-   Included files are not limited to declarations and macro
-definitions; those are merely the typical uses.  Any fragment of a C
-program can be included from another file.  The include file could even
-contain the beginning of a statement that is concluded in the
-containing file, or the end of a statement that was started in the
-including file.  However, a comment or a string or character constant
-may not start in the included file and finish in the including file.
-An unterminated comment, string constant or character constant in an
-included file is considered to end (with an error message) at the end
-of the file.
-
-   It is possible for a header file to begin or end a syntactic unit
-such as a function definition, but that would be very confusing, so
-don't do it.
-
-   The line following the `#include' directive is always treated as a
-separate line by the C preprocessor even if the included file lacks a
-final newline.
-
-\1f
-File: cpp.info,  Node: Once-Only,  Next: Inheritance,  Prev: Include Operation,  Up: Header Files
-
-Once-Only Include Files
------------------------
-
-   Very often, one header file includes another.  It can easily result
-that a certain header file is included more than once.  This may lead
-to errors, if the header file defines structure types or typedefs, and
-is certainly wasteful.  Therefore, we often wish to prevent multiple
-inclusion of a header file.
-
-   The standard way to do this is to enclose the entire real contents
-of the file in a conditional, like this:
-
-     #ifndef FILE_FOO_SEEN
-     #define FILE_FOO_SEEN
-     
-     THE ENTIRE FILE
-     
-     #endif /* FILE_FOO_SEEN */
-
-   The macro `FILE_FOO_SEEN' indicates that the file has been included
-once already.  In a user header file, the macro name should not begin
-with `_'.  In a system header file, this name should begin with `__' to
-avoid conflicts with user programs.  In any kind of header file, the
-macro name should contain the name of the file and some additional
-text, to avoid conflicts with other header files.
-
-   The GNU C preprocessor is programmed to notice when a header file
-uses this particular construct and handle it efficiently.  If a header
-file is contained entirely in a `#ifndef' conditional, then it records
-that fact.  If a subsequent `#include' specifies the same file, and the
-macro in the `#ifndef' is already defined, then the file is entirely
-skipped, without even reading it.
-
-   There is also an explicit directive to tell the preprocessor that it
-need not include a file more than once.  This is called `#pragma once',
-and was used *in addition to* the `#ifndef' conditional around the
-contents of the header file.  `#pragma once' is now obsolete and should
-not be used at all.
-
-   In the Objective C language, there is a variant of `#include' called
-`#import' which includes a file, but does so at most once.  If you use
-`#import' *instead of* `#include', then you don't need the conditionals
-inside the header file to prevent multiple execution of the contents.
-
-   `#import' is obsolete because it is not a well designed feature.  It
-requires the users of a header file--the applications programmers--to
-know that a certain header file should only be included once.  It is
-much better for the header file's implementor to write the file so that
-users don't need to know this.  Using `#ifndef' accomplishes this goal.
-
-\1f
-File: cpp.info,  Node: Inheritance,  Prev: Once-Only,  Up: Header Files
-
-Inheritance and Header Files
-----------------------------
-
-   "Inheritance" is what happens when one object or file derives some
-of its contents by virtual copying from another object or file.  In the
-case of C header files, inheritance means that one header file includes
-another header file and then replaces or adds something.
-
-   If the inheriting header file and the base header file have different
-names, then inheritance is straightforward: simply write `#include
-"BASE"' in the inheriting file.
-
-   Sometimes it is necessary to give the inheriting file the same name
-as the base file.  This is less straightforward.
-
-   For example, suppose an application program uses the system header
-`sys/signal.h', but the version of `/usr/include/sys/signal.h' on a
-particular system doesn't do what the application program expects.  It
-might be convenient to define a "local" version, perhaps under the name
-`/usr/local/include/sys/signal.h', to override or add to the one
-supplied by the system.
-
-   You can do this by compiling with the option `-I.', and writing a
-file `sys/signal.h' that does what the application program expects.
-But making this file include the standard `sys/signal.h' is not so
-easy--writing `#include <sys/signal.h>' in that file doesn't work,
-because it includes your own version of the file, not the standard
-system version.  Used in that file itself, this leads to an infinite
-recursion and a fatal error in compilation.
-
-   `#include </usr/include/sys/signal.h>' would find the proper file,
-but that is not clean, since it makes an assumption about where the
-system header file is found.  This is bad for maintenance, since it
-means that any change in where the system's header files are kept
-requires a change somewhere else.
-
-   The clean way to solve this problem is to use `#include_next', which
-means, "Include the *next* file with this name."  This directive works
-like `#include' except in searching for the specified file: it starts
-searching the list of header file directories *after* the directory in
-which the current file was found.
-
-   Suppose you specify `-I /usr/local/include', and the list of
-directories to search also includes `/usr/include'; and suppose both
-directories contain `sys/signal.h'.  Ordinary `#include <sys/signal.h>'
-finds the file under `/usr/local/include'.  If that file contains
-`#include_next <sys/signal.h>', it starts searching after that
-directory, and finds the file in `/usr/include'.
-
-\1f
-File: cpp.info,  Node: Macros,  Next: Conditionals,  Prev: Header Files,  Up: Top
-
-Macros
-======
-
-   A macro is a sort of abbreviation which you can define once and then
-use later.  There are many complicated features associated with macros
-in the C preprocessor.
-
-* Menu:
-
-* Simple Macros::    Macros that always expand the same way.
-* Argument Macros::  Macros that accept arguments that are substituted
-                       into the macro expansion.
-* Predefined::       Predefined macros that are always available.
-* Stringification::  Macro arguments converted into string constants.
-* Concatenation::    Building tokens from parts taken from macro arguments.
-* Undefining::       Cancelling a macro's definition.
-* Redefining::       Changing a macro's definition.
-* Macro Pitfalls::   Macros can confuse the unwary.  Here we explain
-                       several common problems and strange features.
-
-\1f
-File: cpp.info,  Node: Simple Macros,  Next: Argument Macros,  Prev: Macros,  Up: Macros
-
-Simple Macros
--------------
-
-   A "simple macro" is a kind of abbreviation.  It is a name which
-stands for a fragment of code.  Some people refer to these as "manifest
-constants".
-
-   Before you can use a macro, you must "define" it explicitly with the
-`#define' directive.  `#define' is followed by the name of the macro
-and then the code it should be an abbreviation for.  For example,
-
-     #define BUFFER_SIZE 1020
-
-defines a macro named `BUFFER_SIZE' as an abbreviation for the text
-`1020'.  If somewhere after this `#define' directive there comes a C
-statement of the form
-
-     foo = (char *) xmalloc (BUFFER_SIZE);
-
-then the C preprocessor will recognize and "expand" the macro
-`BUFFER_SIZE', resulting in
-
-     foo = (char *) xmalloc (1020);
-
-   The use of all upper case for macro names is a standard convention.
-Programs are easier to read when it is possible to tell at a glance
-which names are macros.
-
-   Normally, a macro definition must be a single line, like all C
-preprocessing directives.  (You can split a long macro definition
-cosmetically with Backslash-Newline.)  There is one exception: Newlines
-can be included in the macro definition if within a string or character
-constant.  This is because it is not possible for a macro definition to
-contain an unbalanced quote character; the definition automatically
-extends to include the matching quote character that ends the string or
-character constant.  Comments within a macro definition may contain
-Newlines, which make no difference since the comments are entirely
-replaced with Spaces regardless of their contents.
-
-   Aside from the above, there is no restriction on what can go in a
-macro body.  Parentheses need not balance.  The body need not resemble
-valid C code.  (But if it does not, you may get error messages from the
-C compiler when you use the macro.)
-
-   The C preprocessor scans your program sequentially, so macro
-definitions take effect at the place you write them.  Therefore, the
-following input to the C preprocessor
-
-     foo = X;
-     #define X 4
-     bar = X;
-
-produces as output
-
-     foo = X;
-     
-     bar = 4;
-
-   After the preprocessor expands a macro name, the macro's definition
-body is appended to the front of the remaining input, and the check for
-macro calls continues.  Therefore, the macro body can contain calls to
-other macros.  For example, after
-
-     #define BUFSIZE 1020
-     #define TABLESIZE BUFSIZE
-
-the name `TABLESIZE' when used in the program would go through two
-stages of expansion, resulting ultimately in `1020'.
-
-   This is not at all the same as defining `TABLESIZE' to be `1020'.
-The `#define' for `TABLESIZE' uses exactly the body you specify--in
-this case, `BUFSIZE'--and does not check to see whether it too is the
-name of a macro.  It's only when you *use* `TABLESIZE' that the result
-of its expansion is checked for more macro names.  *Note Cascaded
-Macros::.
-
-\1f
-File: cpp.info,  Node: Argument Macros,  Next: Predefined,  Prev: Simple Macros,  Up: Macros
-
-Macros with Arguments
----------------------
-
-   A simple macro always stands for exactly the same text, each time it
-is used.  Macros can be more flexible when they accept "arguments".
-Arguments are fragments of code that you supply each time the macro is
-used.  These fragments are included in the expansion of the macro
-according to the directions in the macro definition.  A macro that
-accepts arguments is called a "function-like macro" because the syntax
-for using it looks like a function call.
-
-   To define a macro that uses arguments, you write a `#define'
-directive with a list of "argument names" in parentheses after the name
-of the macro.  The argument names may be any valid C identifiers,
-separated by commas and optionally whitespace.  The open-parenthesis
-must follow the macro name immediately, with no space in between.
-
-   For example, here is a macro that computes the minimum of two numeric
-values, as it is defined in many C programs:
-
-     #define min(X, Y)  ((X) < (Y) ? (X) : (Y))
-
-(This is not the best way to define a "minimum" macro in GNU C.  *Note
-Side Effects::, for more information.)
-
-   To use a macro that expects arguments, you write the name of the
-macro followed by a list of "actual arguments" in parentheses,
-separated by commas.  The number of actual arguments you give must
-match the number of arguments the macro expects.   Examples of use of
-the macro `min' include `min (1, 2)' and `min (x + 28, *p)'.
-
-   The expansion text of the macro depends on the arguments you use.
-Each of the argument names of the macro is replaced, throughout the
-macro definition, with the corresponding actual argument.  Using the
-same macro `min' defined above, `min (1, 2)' expands into
-
-     ((1) < (2) ? (1) : (2))
-
-where `1' has been substituted for `X' and `2' for `Y'.
-
-   Likewise, `min (x + 28, *p)' expands into
-
-     ((x + 28) < (*p) ? (x + 28) : (*p))
-
-   Parentheses in the actual arguments must balance; a comma within
-parentheses does not end an argument.  However, there is no requirement
-for brackets or braces to balance, and they do not prevent a comma from
-separating arguments.  Thus,
-
-     macro (array[x = y, x + 1])
-
-passes two arguments to `macro': `array[x = y' and `x + 1]'.  If you
-want to supply `array[x = y, x + 1]' as an argument, you must write it
-as `array[(x = y, x + 1)]', which is equivalent C code.
-
-   After the actual arguments are substituted into the macro body, the
-entire result is appended to the front of the remaining input, and the
-check for macro calls continues.  Therefore, the actual arguments can
-contain calls to other macros, either with or without arguments, or
-even to the same macro.  The macro body can also contain calls to other
-macros.  For example, `min (min (a, b), c)' expands into this text:
-
-     ((((a) < (b) ? (a) : (b))) < (c)
-      ? (((a) < (b) ? (a) : (b)))
-      : (c))
-
-(Line breaks shown here for clarity would not actually be generated.)
-
-   If a macro `foo' takes one argument, and you want to supply an empty
-argument, you must write at least some whitespace between the
-parentheses, like this: `foo ( )'.  Just `foo ()' is providing no
-arguments, which is an error if `foo' expects an argument.  But `foo0
-()' is the correct way to call a macro defined to take zero arguments,
-like this:
-
-     #define foo0() ...
-
-   If you use the macro name followed by something other than an
-open-parenthesis (after ignoring any spaces, tabs and comments that
-follow), it is not a call to the macro, and the preprocessor does not
-change what you have written.  Therefore, it is possible for the same
-name to be a variable or function in your program as well as a macro,
-and you can choose in each instance whether to refer to the macro (if
-an actual argument list follows) or the variable or function (if an
-argument list does not follow).
-
-   Such dual use of one name could be confusing and should be avoided
-except when the two meanings are effectively synonymous: that is, when
-the name is both a macro and a function and the two have similar
-effects.  You can think of the name simply as a function; use of the
-name for purposes other than calling it (such as, to take the address)
-will refer to the function, while calls will expand the macro and
-generate better but equivalent code.  For example, you can use a
-function named `min' in the same source file that defines the macro.
-If you write `&min' with no argument list, you refer to the function.
-If you write `min (x, bb)', with an argument list, the macro is
-expanded.  If you write `(min) (a, bb)', where the name `min' is not
-followed by an open-parenthesis, the macro is not expanded, so you wind
-up with a call to the function `min'.
-
-   You may not define the same name as both a simple macro and a macro
-with arguments.
-
-   In the definition of a macro with arguments, the list of argument
-names must follow the macro name immediately with no space in between.
-If there is a space after the macro name, the macro is defined as
-taking no arguments, and all the rest of the line is taken to be the
-expansion.  The reason for this is that it is often useful to define a
-macro that takes no arguments and whose definition begins with an
-identifier in parentheses.  This rule about spaces makes it possible
-for you to do either this:
-
-     #define FOO(x) - 1 / (x)
-
-(which defines `FOO' to take an argument and expand into minus the
-reciprocal of that argument) or this:
-
-     #define BAR (x) - 1 / (x)
-
-(which defines `BAR' to take no argument and always expand into `(x) -
-1 / (x)').
-
-   Note that the *uses* of a macro with arguments can have spaces before
-the left parenthesis; it's the *definition* where it matters whether
-there is a space.
-
-\1f
-File: cpp.info,  Node: Predefined,  Next: Stringification,  Prev: Argument Macros,  Up: Macros
-
-Predefined Macros
------------------
-
-   Several simple macros are predefined.  You can use them without
-giving definitions for them.  They fall into two classes: standard
-macros and system-specific macros.
-
-* Menu:
-
-* Standard Predefined::     Standard predefined macros.
-* Nonstandard Predefined::  Nonstandard predefined macros.
-
-\1f
-File: cpp.info,  Node: Standard Predefined,  Next: Nonstandard Predefined,  Prev: Predefined,  Up: Predefined
-
-Standard Predefined Macros
-..........................
-
-   The standard predefined macros are available with the same meanings
-regardless of the machine or operating system on which you are using
-GNU C.  Their names all start and end with double underscores.  Those
-preceding `__GNUC__' in this table are standardized by ANSI C; the rest
-are GNU C extensions.
-
-`__FILE__'
-     This macro expands to the name of the current input file, in the
-     form of a C string constant.  The precise name returned is the one
-     that was specified in `#include' or as the input file name
-     argument.
-
-`__LINE__'
-     This macro expands to the current input line number, in the form
-     of a decimal integer constant.  While we call it a predefined
-     macro, it's a pretty strange macro, since its "definition" changes
-     with each new line of source code.
-
-     This and `__FILE__' are useful in generating an error message to
-     report an inconsistency detected by the program; the message can
-     state the source line at which the inconsistency was detected.
-     For example,
-
-          fprintf (stderr, "Internal error: "
-                           "negative string length "
-                           "%d at %s, line %d.",
-                   length, __FILE__, __LINE__);
-
-     A `#include' directive changes the expansions of `__FILE__' and
-     `__LINE__' to correspond to the included file.  At the end of that
-     file, when processing resumes on the input file that contained the
-     `#include' directive, the expansions of `__FILE__' and `__LINE__'
-     revert to the values they had before the `#include' (but
-     `__LINE__' is then incremented by one as processing moves to the
-     line after the `#include').
-
-     The expansions of both `__FILE__' and `__LINE__' are altered if a
-     `#line' directive is used.  *Note Combining Sources::.
-
-`__DATE__'
-     This macro expands to a string constant that describes the date on
-     which the preprocessor is being run.  The string constant contains
-     eleven characters and looks like `"Feb  1 1996"'.
-
-`__TIME__'
-     This macro expands to a string constant that describes the time at
-     which the preprocessor is being run.  The string constant contains
-     eight characters and looks like `"23:59:01"'.
-
-`__STDC__'
-     This macro expands to the constant 1, to signify that this is ANSI
-     Standard C.  (Whether that is actually true depends on what C
-     compiler will operate on the output from the preprocessor.)
-
-     On some hosts, system include files use a different convention,
-     where `__STDC__' is normally 0, but is 1 if the user specifies
-     strict conformance to the C Standard.  The preprocessor follows
-     the host convention when processing system include files, but when
-     processing user files it follows the usual GNU C convention.
-
-     This macro is not defined if the `-traditional' option is used.
-
-`__STDC_VERSION__'
-     This macro expands to the C Standard's version number, a long
-     integer constant of the form `YYYYMML' where YYYY and MM are the
-     year and month of the Standard version.  This signifies which
-     version of the C Standard the preprocessor conforms to.  Like
-     `__STDC__', whether this version number is accurate for the entire
-     implementation depends on what C compiler will operate on the
-     output from the preprocessor.
-
-     This macro is not defined if the `-traditional' option is used.
-
-`__GNUC__'
-     This macro is defined if and only if this is GNU C.  This macro is
-     defined only when the entire GNU C compiler is in use; if you
-     invoke the preprocessor directly, `__GNUC__' is undefined.  The
-     value identifies the major version number of GNU CC (`1' for GNU CC
-     version 1, which is now obsolete, and `2' for version 2).
-
-`__GNUC_MINOR__'
-     The macro contains the minor version number of the compiler.  This
-     can be used to work around differences between different releases
-     of the compiler (for example, if gcc 2.6.3 is known to support a
-     feature, you can test for `__GNUC__ > 2 || (__GNUC__ == 2 &&
-     __GNUC_MINOR__ >= 6)').  The last number, `3' in the example
-     above, denotes the bugfix level of the compiler; no macro contains
-     this value.
-
-`__GNUG__'
-     The GNU C compiler defines this when the compilation language is
-     C++; use `__GNUG__' to distinguish between GNU C and GNU C++.
-
-`__cplusplus'
-     The draft ANSI standard for C++ used to require predefining this
-     variable.  Though it is no longer required, GNU C++ continues to
-     define it, as do other popular C++ compilers.  You can use
-     `__cplusplus' to test whether a header is compiled by a C compiler
-     or a C++ compiler.
-
-`__STRICT_ANSI__'
-     This macro is defined if and only if the `-ansi' switch was
-     specified when GNU C was invoked.  Its definition is the null
-     string.  This macro exists primarily to direct certain GNU header
-     files not to define certain traditional Unix constructs which are
-     incompatible with ANSI C.
-
-`__BASE_FILE__'
-     This macro expands to the name of the main input file, in the form
-     of a C string constant.  This is the source file that was specified
-     as an argument when the C compiler was invoked.
-
-`__INCLUDE_LEVEL__'
-     This macro expands to a decimal integer constant that represents
-     the depth of nesting in include files.  The value of this macro is
-     incremented on every `#include' directive and decremented at every
-     end of file.  For input files specified by command line arguments,
-     the nesting level is zero.
-
-`__VERSION__'
-     This macro expands to a string which describes the version number
-     of GNU C.  The string is normally a sequence of decimal numbers
-     separated by periods, such as `"2.6.0"'.  The only reasonable use
-     of this macro is to incorporate it into a string constant.
-
-`__OPTIMIZE__'
-     This macro is defined in optimizing compilations.  It causes
-     certain GNU header files to define alternative macro definitions
-     for some system library functions.  It is unwise to refer to or
-     test the definition of this macro unless you make very sure that
-     programs will execute with the same effect regardless.
-
-`__CHAR_UNSIGNED__'
-     This macro is defined if and only if the data type `char' is
-     unsigned on the target machine.  It exists to cause the standard
-     header file `limits.h' to work correctly.  It is bad practice to
-     refer to this macro yourself; instead, refer to the standard
-     macros defined in `limits.h'.  The preprocessor uses this macro to
-     determine whether or not to sign-extend large character constants
-     written in octal; see *Note The `#if' Directive: #if Directive.
-
-`__REGISTER_PREFIX__'
-     This macro expands to a string describing the prefix applied to cpu
-     registers in assembler code.  It can be used to write assembler
-     code that is usable in multiple environments.  For example, in the
-     `m68k-aout' environment it expands to the string `""', but in the
-     `m68k-coff' environment it expands to the string `"%"'.
-
-`__USER_LABEL_PREFIX__'
-     This macro expands to a string describing the prefix applied to
-     user generated labels in assembler code.  It can be used to write
-     assembler code that is usable in multiple environments.  For
-     example, in the `m68k-aout' environment it expands to the string
-     `"_"', but in the `m68k-coff' environment it expands to the string
-     `""'.  This does not work with the `-mno-underscores' option that
-     the i386 OSF/rose and m88k targets provide nor with the `-mcall*'
-     options of the rs6000 System V Release 4 target.
-
-\1f
-File: cpp.info,  Node: Nonstandard Predefined,  Prev: Standard Predefined,  Up: Predefined
-
-Nonstandard Predefined Macros
-.............................
-
-   The C preprocessor normally has several predefined macros that vary
-between machines because their purpose is to indicate what type of
-system and machine is in use.  This manual, being for all systems and
-machines, cannot tell you exactly what their names are; instead, we
-offer a list of some typical ones.  You can use `cpp -dM' to see the
-values of predefined macros; see *Note Invocation::.
-
-   Some nonstandard predefined macros describe the operating system in
-use, with more or less specificity.  For example,
-
-`unix'
-     `unix' is normally predefined on all Unix systems.
-
-`BSD'
-     `BSD' is predefined on recent versions of Berkeley Unix (perhaps
-     only in version 4.3).
-
-   Other nonstandard predefined macros describe the kind of CPU, with
-more or less specificity.  For example,
-
-`vax'
-     `vax' is predefined on Vax computers.
-
-`mc68000'
-     `mc68000' is predefined on most computers whose CPU is a Motorola
-     68000, 68010 or 68020.
-
-`m68k'
-     `m68k' is also predefined on most computers whose CPU is a 68000,
-     68010 or 68020; however, some makers use `mc68000' and some use
-     `m68k'.  Some predefine both names.  What happens in GNU C depends
-     on the system you are using it on.
-
-`M68020'
-     `M68020' has been observed to be predefined on some systems that
-     use 68020 CPUs--in addition to `mc68000' and `m68k', which are
-     less specific.
-
-`_AM29K'
-`_AM29000'
-     Both `_AM29K' and `_AM29000' are predefined for the AMD 29000 CPU
-     family.
-
-`ns32000'
-     `ns32000' is predefined on computers which use the National
-     Semiconductor 32000 series CPU.
-
-   Yet other nonstandard predefined macros describe the manufacturer of
-the system.  For example,
-
-`sun'
-     `sun' is predefined on all models of Sun computers.
-
-`pyr'
-     `pyr' is predefined on all models of Pyramid computers.
-
-`sequent'
-     `sequent' is predefined on all models of Sequent computers.
-
-   These predefined symbols are not only nonstandard, they are contrary
-to the ANSI standard because their names do not start with underscores.
-Therefore, the option `-ansi' inhibits the definition of these symbols.
-
-   This tends to make `-ansi' useless, since many programs depend on the
-customary nonstandard predefined symbols.  Even system header files
-check them and will generate incorrect declarations if they do not find
-the names that are expected.  You might think that the header files
-supplied for the Uglix computer would not need to test what machine
-they are running on, because they can simply assume it is the Uglix;
-but often they do, and they do so using the customary names.  As a
-result, very few C programs will compile with `-ansi'.  We intend to
-avoid such problems on the GNU system.
-
-   What, then, should you do in an ANSI C program to test the type of
-machine it will run on?
-
-   GNU C offers a parallel series of symbols for this purpose, whose
-names are made from the customary ones by adding `__' at the beginning
-and end.  Thus, the symbol `__vax__' would be available on a Vax, and
-so on.
-
-   The set of nonstandard predefined names in the GNU C preprocessor is
-controlled (when `cpp' is itself compiled) by the macro
-`CPP_PREDEFINES', which should be a string containing `-D' options,
-separated by spaces.  For example, on the Sun 3, we use the following
-definition:
-
-     #define CPP_PREDEFINES "-Dmc68000 -Dsun -Dunix -Dm68k"
-
-This macro is usually specified in `tm.h'.
-
-\1f
-File: cpp.info,  Node: Stringification,  Next: Concatenation,  Prev: Predefined,  Up: Macros
-
-Stringification
----------------
-
-   "Stringification" means turning a code fragment into a string
-constant whose contents are the text for the code fragment.  For
-example, stringifying `foo (z)' results in `"foo (z)"'.
-
-   In the C preprocessor, stringification is an option available when
-macro arguments are substituted into the macro definition.  In the body
-of the definition, when an argument name appears, the character `#'
-before the name specifies stringification of the corresponding actual
-argument when it is substituted at that point in the definition.  The
-same argument may be substituted in other places in the definition
-without stringification if the argument name appears in those places
-with no `#'.
-
-   Here is an example of a macro definition that uses stringification:
-
-     #define WARN_IF(EXP) \
-     do { if (EXP) \
-             fprintf (stderr, "Warning: " #EXP "\n"); } \
-     while (0)
-
-Here the actual argument for `EXP' is substituted once as given, into
-the `if' statement, and once as stringified, into the argument to
-`fprintf'.  The `do' and `while (0)' are a kludge to make it possible
-to write `WARN_IF (ARG);', which the resemblance of `WARN_IF' to a
-function would make C programmers want to do; see *Note Swallow
-Semicolon::.
-
-   The stringification feature is limited to transforming one macro
-argument into one string constant: there is no way to combine the
-argument with other text and then stringify it all together.  But the
-example above shows how an equivalent result can be obtained in ANSI
-Standard C using the feature that adjacent string constants are
-concatenated as one string constant.  The preprocessor stringifies the
-actual value of `EXP' into a separate string constant, resulting in
-text like
-
-     do { if (x == 0) \
-             fprintf (stderr, "Warning: " "x == 0" "\n"); } \
-     while (0)
-
-but the C compiler then sees three consecutive string constants and
-concatenates them into one, producing effectively
-
-     do { if (x == 0) \
-             fprintf (stderr, "Warning: x == 0\n"); } \
-     while (0)
-
-   Stringification in C involves more than putting doublequote
-characters around the fragment; it is necessary to put backslashes in
-front of all doublequote characters, and all backslashes in string and
-character constants, in order to get a valid C string constant with the
-proper contents.  Thus, stringifying `p = "foo\n";' results in `"p =
-\"foo\\n\";"'.  However, backslashes that are not inside of string or
-character constants are not duplicated: `\n' by itself stringifies to
-`"\n"'.
-
-   Whitespace (including comments) in the text being stringified is
-handled according to precise rules.  All leading and trailing
-whitespace is ignored.  Any sequence of whitespace in the middle of the
-text is converted to a single space in the stringified result.
-
-\1f
-File: cpp.info,  Node: Concatenation,  Next: Undefining,  Prev: Stringification,  Up: Macros
-
-Concatenation
--------------
-
-   "Concatenation" means joining two strings into one.  In the context
-of macro expansion, concatenation refers to joining two lexical units
-into one longer one.  Specifically, an actual argument to the macro can
-be concatenated with another actual argument or with fixed text to
-produce a longer name.  The longer name might be the name of a function,
-variable or type, or a C keyword; it might even be the name of another
-macro, in which case it will be expanded.
-
-   When you define a macro, you request concatenation with the special
-operator `##' in the macro body.  When the macro is called, after
-actual arguments are substituted, all `##' operators are deleted, and
-so is any whitespace next to them (including whitespace that was part
-of an actual argument).  The result is to concatenate the syntactic
-tokens on either side of the `##'.
-
-   Consider a C program that interprets named commands.  There probably
-needs to be a table of commands, perhaps an array of structures
-declared as follows:
-
-     struct command
-     {
-       char *name;
-       void (*function) ();
-     };
-     
-     struct command commands[] =
-     {
-       { "quit", quit_command},
-       { "help", help_command},
-       ...
-     };
-
-   It would be cleaner not to have to give each command name twice,
-once in the string constant and once in the function name.  A macro
-which takes the name of a command as an argument can make this
-unnecessary.  The string constant can be created with stringification,
-and the function name by concatenating the argument with `_command'.
-Here is how it is done:
-
-     #define COMMAND(NAME)  { #NAME, NAME ## _command }
-     
-     struct command commands[] =
-     {
-       COMMAND (quit),
-       COMMAND (help),
-       ...
-     };
-
-   The usual case of concatenation is concatenating two names (or a
-name and a number) into a longer name.  But this isn't the only valid
-case.  It is also possible to concatenate two numbers (or a number and
-a name, such as `1.5' and `e3') into a number.  Also, multi-character
-operators such as `+=' can be formed by concatenation.  In some cases
-it is even possible to piece together a string constant.  However, two
-pieces of text that don't together form a valid lexical unit cannot be
-concatenated.  For example, concatenation with `x' on one side and `+'
-on the other is not meaningful because those two characters can't fit
-together in any lexical unit of C.  The ANSI standard says that such
-attempts at concatenation are undefined, but in the GNU C preprocessor
-it is well defined: it puts the `x' and `+' side by side with no
-particular special results.
-
-   Keep in mind that the C preprocessor converts comments to whitespace
-before macros are even considered.  Therefore, you cannot create a
-comment by concatenating `/' and `*': the `/*' sequence that starts a
-comment is not a lexical unit, but rather the beginning of a "long"
-space character.  Also, you can freely use comments next to a `##' in a
-macro definition, or in actual arguments that will be concatenated,
-because the comments will be converted to spaces at first sight, and
-concatenation will later discard the spaces.
-
-\1f
-File: cpp.info,  Node: Undefining,  Next: Redefining,  Prev: Concatenation,  Up: Macros
-
-Undefining Macros
------------------
-
-   To "undefine" a macro means to cancel its definition.  This is done
-with the `#undef' directive.  `#undef' is followed by the macro name to
-be undefined.
-
-   Like definition, undefinition occurs at a specific point in the
-source file, and it applies starting from that point.  The name ceases
-to be a macro name, and from that point on it is treated by the
-preprocessor as if it had never been a macro name.
-
-   For example,
-
-     #define FOO 4
-     x = FOO;
-     #undef FOO
-     x = FOO;
-
-expands into
-
-     x = 4;
-     
-     x = FOO;
-
-In this example, `FOO' had better be a variable or function as well as
-(temporarily) a macro, in order for the result of the expansion to be
-valid C code.
-
-   The same form of `#undef' directive will cancel definitions with
-arguments or definitions that don't expect arguments.  The `#undef'
-directive has no effect when used on a name not currently defined as a
-macro.
-
-\1f
-File: cpp.info,  Node: Redefining,  Next: Macro Pitfalls,  Prev: Undefining,  Up: Macros
-
-Redefining Macros
------------------
-
-   "Redefining" a macro means defining (with `#define') a name that is
-already defined as a macro.
-
-   A redefinition is trivial if the new definition is transparently
-identical to the old one.  You probably wouldn't deliberately write a
-trivial redefinition, but they can happen automatically when a header
-file is included more than once (*note Header Files::.), so they are
-accepted silently and without effect.
-
-   Nontrivial redefinition is considered likely to be an error, so it
-provokes a warning message from the preprocessor.  However, sometimes it
-is useful to change the definition of a macro in mid-compilation.  You
-can inhibit the warning by undefining the macro with `#undef' before the
-second definition.
-
-   In order for a redefinition to be trivial, the new definition must
-exactly match the one already in effect, with two possible exceptions:
-
-   * Whitespace may be added or deleted at the beginning or the end.
-
-   * Whitespace may be changed in the middle (but not inside strings).
-     However, it may not be eliminated entirely, and it may not be added
-     where there was no whitespace at all.
-
-   Recall that a comment counts as whitespace.
-
diff --git a/gcc/cpp.info-2 b/gcc/cpp.info-2
deleted file mode 100644 (file)
index b98ab2d..0000000
+++ /dev/null
@@ -1,1058 +0,0 @@
-This is Info file cpp.info, produced by Makeinfo version 1.67 from the
-input file cpp.texi.
-
-   This file documents the GNU C Preprocessor.
-
-   Copyright 1987, 1989, 1991, 1992, 1993, 1994, 1995 Free Software
-Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the entire resulting derived work is distributed under the terms
-of a permission notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions.
-
-\1f
-File: cpp.info,  Node: Macro Pitfalls,  Prev: Redefining,  Up: Macros
-
-Pitfalls and Subtleties of Macros
----------------------------------
-
-   In this section we describe some special rules that apply to macros
-and macro expansion, and point out certain cases in which the rules have
-counterintuitive consequences that you must watch out for.
-
-* Menu:
-
-* Misnesting::        Macros can contain unmatched parentheses.
-* Macro Parentheses:: Why apparently superfluous parentheses
-                         may be necessary to avoid incorrect grouping.
-* Swallow Semicolon:: Macros that look like functions
-                         but expand into compound statements.
-* Side Effects::      Unsafe macros that cause trouble when
-                         arguments contain side effects.
-* Self-Reference::    Macros whose definitions use the macros' own names.
-* Argument Prescan::  Actual arguments are checked for macro calls
-                         before they are substituted.
-* Cascaded Macros::   Macros whose definitions use other macros.
-* Newlines in Args::  Sometimes line numbers get confused.
-
-\1f
-File: cpp.info,  Node: Misnesting,  Next: Macro Parentheses,  Prev: Macro Pitfalls,  Up: Macro Pitfalls
-
-Improperly Nested Constructs
-............................
-
-   Recall that when a macro is called with arguments, the arguments are
-substituted into the macro body and the result is checked, together with
-the rest of the input file, for more macro calls.
-
-   It is possible to piece together a macro call coming partially from
-the macro body and partially from the actual arguments.  For example,
-
-     #define double(x) (2*(x))
-     #define call_with_1(x) x(1)
-
-would expand `call_with_1 (double)' into `(2*(1))'.
-
-   Macro definitions do not have to have balanced parentheses.  By
-writing an unbalanced open parenthesis in a macro body, it is possible
-to create a macro call that begins inside the macro body but ends
-outside of it.  For example,
-
-     #define strange(file) fprintf (file, "%s %d",
-     ...
-     strange(stderr) p, 35)
-
-This bizarre example expands to `fprintf (stderr, "%s %d", p, 35)'!
-
-\1f
-File: cpp.info,  Node: Macro Parentheses,  Next: Swallow Semicolon,  Prev: Misnesting,  Up: Macro Pitfalls
-
-Unintended Grouping of Arithmetic
-.................................
-
-   You may have noticed that in most of the macro definition examples
-shown above, each occurrence of a macro argument name had parentheses
-around it.  In addition, another pair of parentheses usually surround
-the entire macro definition.  Here is why it is best to write macros
-that way.
-
-   Suppose you define a macro as follows,
-
-     #define ceil_div(x, y) (x + y - 1) / y
-
-whose purpose is to divide, rounding up.  (One use for this operation is
-to compute how many `int' objects are needed to hold a certain number
-of `char' objects.)  Then suppose it is used as follows:
-
-     a = ceil_div (b & c, sizeof (int));
-
-This expands into
-
-     a = (b & c + sizeof (int) - 1) / sizeof (int);
-
-which does not do what is intended.  The operator-precedence rules of C
-make it equivalent to this:
-
-     a = (b & (c + sizeof (int) - 1)) / sizeof (int);
-
-But what we want is this:
-
-     a = ((b & c) + sizeof (int) - 1)) / sizeof (int);
-
-Defining the macro as
-
-     #define ceil_div(x, y) ((x) + (y) - 1) / (y)
-
-provides the desired result.
-
-   Unintended grouping can result in another way.  Consider `sizeof
-ceil_div(1, 2)'.  That has the appearance of a C expression that would
-compute the size of the type of `ceil_div (1, 2)', but in fact it means
-something very different.  Here is what it expands to:
-
-     sizeof ((1) + (2) - 1) / (2)
-
-This would take the size of an integer and divide it by two.  The
-precedence rules have put the division outside the `sizeof' when it was
-intended to be inside.
-
-   Parentheses around the entire macro definition can prevent such
-problems.  Here, then, is the recommended way to define `ceil_div':
-
-     #define ceil_div(x, y) (((x) + (y) - 1) / (y))
-
-\1f
-File: cpp.info,  Node: Swallow Semicolon,  Next: Side Effects,  Prev: Macro Parentheses,  Up: Macro Pitfalls
-
-Swallowing the Semicolon
-........................
-
-   Often it is desirable to define a macro that expands into a compound
-statement.  Consider, for example, the following macro, that advances a
-pointer (the argument `p' says where to find it) across whitespace
-characters:
-
-     #define SKIP_SPACES (p, limit)  \
-     { register char *lim = (limit); \
-       while (p != lim) {            \
-         if (*p++ != ' ') {          \
-           p--; break; }}}
-
-Here Backslash-Newline is used to split the macro definition, which must
-be a single line, so that it resembles the way such C code would be
-laid out if not part of a macro definition.
-
-   A call to this macro might be `SKIP_SPACES (p, lim)'.  Strictly
-speaking, the call expands to a compound statement, which is a complete
-statement with no need for a semicolon to end it.  But it looks like a
-function call.  So it minimizes confusion if you can use it like a
-function call, writing a semicolon afterward, as in `SKIP_SPACES (p,
-lim);'
-
-   But this can cause trouble before `else' statements, because the
-semicolon is actually a null statement.  Suppose you write
-
-     if (*p != 0)
-       SKIP_SPACES (p, lim);
-     else ...
-
-The presence of two statements--the compound statement and a null
-statement--in between the `if' condition and the `else' makes invalid C
-code.
-
-   The definition of the macro `SKIP_SPACES' can be altered to solve
-this problem, using a `do ... while' statement.  Here is how:
-
-     #define SKIP_SPACES (p, limit)     \
-     do { register char *lim = (limit); \
-          while (p != lim) {            \
-            if (*p++ != ' ') {          \
-              p--; break; }}}           \
-     while (0)
-
-   Now `SKIP_SPACES (p, lim);' expands into
-
-     do {...} while (0);
-
-which is one statement.
-
-\1f
-File: cpp.info,  Node: Side Effects,  Next: Self-Reference,  Prev: Swallow Semicolon,  Up: Macro Pitfalls
-
-Duplication of Side Effects
-...........................
-
-   Many C programs define a macro `min', for "minimum", like this:
-
-     #define min(X, Y)  ((X) < (Y) ? (X) : (Y))
-
-   When you use this macro with an argument containing a side effect,
-as shown here,
-
-     next = min (x + y, foo (z));
-
-it expands as follows:
-
-     next = ((x + y) < (foo (z)) ? (x + y) : (foo (z)));
-
-where `x + y' has been substituted for `X' and `foo (z)' for `Y'.
-
-   The function `foo' is used only once in the statement as it appears
-in the program, but the expression `foo (z)' has been substituted twice
-into the macro expansion.  As a result, `foo' might be called two times
-when the statement is executed.  If it has side effects or if it takes
-a long time to compute, the results might not be what you intended.  We
-say that `min' is an "unsafe" macro.
-
-   The best solution to this problem is to define `min' in a way that
-computes the value of `foo (z)' only once.  The C language offers no
-standard way to do this, but it can be done with GNU C extensions as
-follows:
-
-     #define min(X, Y)                     \
-     ({ typeof (X) __x = (X), __y = (Y);   \
-        (__x < __y) ? __x : __y; })
-
-   If you do not wish to use GNU C extensions, the only solution is to
-be careful when *using* the macro `min'.  For example, you can
-calculate the value of `foo (z)', save it in a variable, and use that
-variable in `min':
-
-     #define min(X, Y)  ((X) < (Y) ? (X) : (Y))
-     ...
-     {
-       int tem = foo (z);
-       next = min (x + y, tem);
-     }
-
-(where we assume that `foo' returns type `int').
-
-\1f
-File: cpp.info,  Node: Self-Reference,  Next: Argument Prescan,  Prev: Side Effects,  Up: Macro Pitfalls
-
-Self-Referential Macros
-.......................
-
-   A "self-referential" macro is one whose name appears in its
-definition.  A special feature of ANSI Standard C is that the
-self-reference is not considered a macro call.  It is passed into the
-preprocessor output unchanged.
-
-   Let's consider an example:
-
-     #define foo (4 + foo)
-
-where `foo' is also a variable in your program.
-
-   Following the ordinary rules, each reference to `foo' will expand
-into `(4 + foo)'; then this will be rescanned and will expand into `(4
-+ (4 + foo))'; and so on until it causes a fatal error (memory full) in
-the preprocessor.
-
-   However, the special rule about self-reference cuts this process
-short after one step, at `(4 + foo)'.  Therefore, this macro definition
-has the possibly useful effect of causing the program to add 4 to the
-value of `foo' wherever `foo' is referred to.
-
-   In most cases, it is a bad idea to take advantage of this feature.  A
-person reading the program who sees that `foo' is a variable will not
-expect that it is a macro as well.  The reader will come across the
-identifier `foo' in the program and think its value should be that of
-the variable `foo', whereas in fact the value is four greater.
-
-   The special rule for self-reference applies also to "indirect"
-self-reference.  This is the case where a macro X expands to use a
-macro `y', and the expansion of `y' refers to the macro `x'.  The
-resulting reference to `x' comes indirectly from the expansion of `x',
-so it is a self-reference and is not further expanded.  Thus, after
-
-     #define x (4 + y)
-     #define y (2 * x)
-
-`x' would expand into `(4 + (2 * x))'.  Clear?
-
-   But suppose `y' is used elsewhere, not from the definition of `x'.
-Then the use of `x' in the expansion of `y' is not a self-reference
-because `x' is not "in progress".  So it does expand.  However, the
-expansion of `x' contains a reference to `y', and that is an indirect
-self-reference now because `y' is "in progress".  The result is that
-`y' expands to `(2 * (4 + y))'.
-
-   It is not clear that this behavior would ever be useful, but it is
-specified by the ANSI C standard, so you may need to understand it.
-
-\1f
-File: cpp.info,  Node: Argument Prescan,  Next: Cascaded Macros,  Prev: Self-Reference,  Up: Macro Pitfalls
-
-Separate Expansion of Macro Arguments
-.....................................
-
-   We have explained that the expansion of a macro, including the
-substituted actual arguments, is scanned over again for macro calls to
-be expanded.
-
-   What really happens is more subtle: first each actual argument text
-is scanned separately for macro calls.  Then the results of this are
-substituted into the macro body to produce the macro expansion, and the
-macro expansion is scanned again for macros to expand.
-
-   The result is that the actual arguments are scanned *twice* to expand
-macro calls in them.
-
-   Most of the time, this has no effect.  If the actual argument
-contained any macro calls, they are expanded during the first scan.
-The result therefore contains no macro calls, so the second scan does
-not change it.  If the actual argument were substituted as given, with
-no prescan, the single remaining scan would find the same macro calls
-and produce the same results.
-
-   You might expect the double scan to change the results when a
-self-referential macro is used in an actual argument of another macro
-(*note Self-Reference::.): the self-referential macro would be expanded
-once in the first scan, and a second time in the second scan.  But this
-is not what happens.  The self-references that do not expand in the
-first scan are marked so that they will not expand in the second scan
-either.
-
-   The prescan is not done when an argument is stringified or
-concatenated.  Thus,
-
-     #define str(s) #s
-     #define foo 4
-     str (foo)
-
-expands to `"foo"'.  Once more, prescan has been prevented from having
-any noticeable effect.
-
-   More precisely, stringification and concatenation use the argument as
-written, in un-prescanned form.  The same actual argument would be used
-in prescanned form if it is substituted elsewhere without
-stringification or concatenation.
-
-     #define str(s) #s lose(s)
-     #define foo 4
-     str (foo)
-
-   expands to `"foo" lose(4)'.
-
-   You might now ask, "Why mention the prescan, if it makes no
-difference?  And why not skip it and make the preprocessor faster?"
-The answer is that the prescan does make a difference in three special
-cases:
-
-   * Nested calls to a macro.
-
-   * Macros that call other macros that stringify or concatenate.
-
-   * Macros whose expansions contain unshielded commas.
-
-   We say that "nested" calls to a macro occur when a macro's actual
-argument contains a call to that very macro.  For example, if `f' is a
-macro that expects one argument, `f (f (1))' is a nested pair of calls
-to `f'.  The desired expansion is made by expanding `f (1)' and
-substituting that into the definition of `f'.  The prescan causes the
-expected result to happen.  Without the prescan, `f (1)' itself would
-be substituted as an actual argument, and the inner use of `f' would
-appear during the main scan as an indirect self-reference and would not
-be expanded.  Here, the prescan cancels an undesirable side effect (in
-the medical, not computational, sense of the term) of the special rule
-for self-referential macros.
-
-   But prescan causes trouble in certain other cases of nested macro
-calls.  Here is an example:
-
-     #define foo  a,b
-     #define bar(x) lose(x)
-     #define lose(x) (1 + (x))
-     
-     bar(foo)
-
-We would like `bar(foo)' to turn into `(1 + (foo))', which would then
-turn into `(1 + (a,b))'.  But instead, `bar(foo)' expands into
-`lose(a,b)', and you get an error because `lose' requires a single
-argument.  In this case, the problem is easily solved by the same
-parentheses that ought to be used to prevent misnesting of arithmetic
-operations:
-
-     #define foo (a,b)
-     #define bar(x) lose((x))
-
-   The problem is more serious when the operands of the macro are not
-expressions; for example, when they are statements.  Then parentheses
-are unacceptable because they would make for invalid C code:
-
-     #define foo { int a, b; ... }
-
-In GNU C you can shield the commas using the `({...})' construct which
-turns a compound statement into an expression:
-
-     #define foo ({ int a, b; ... })
-
-   Or you can rewrite the macro definition to avoid such commas:
-
-     #define foo { int a; int b; ... }
-
-   There is also one case where prescan is useful.  It is possible to
-use prescan to expand an argument and then stringify it--if you use two
-levels of macros.  Let's add a new macro `xstr' to the example shown
-above:
-
-     #define xstr(s) str(s)
-     #define str(s) #s
-     #define foo 4
-     xstr (foo)
-
-   This expands into `"4"', not `"foo"'.  The reason for the difference
-is that the argument of `xstr' is expanded at prescan (because `xstr'
-does not specify stringification or concatenation of the argument).
-The result of prescan then forms the actual argument for `str'.  `str'
-uses its argument without prescan because it performs stringification;
-but it cannot prevent or undo the prescanning already done by `xstr'.
-
-\1f
-File: cpp.info,  Node: Cascaded Macros,  Next: Newlines in Args,  Prev: Argument Prescan,  Up: Macro Pitfalls
-
-Cascaded Use of Macros
-......................
-
-   A "cascade" of macros is when one macro's body contains a reference
-to another macro.  This is very common practice.  For example,
-
-     #define BUFSIZE 1020
-     #define TABLESIZE BUFSIZE
-
-   This is not at all the same as defining `TABLESIZE' to be `1020'.
-The `#define' for `TABLESIZE' uses exactly the body you specify--in
-this case, `BUFSIZE'--and does not check to see whether it too is the
-name of a macro.
-
-   It's only when you *use* `TABLESIZE' that the result of its expansion
-is checked for more macro names.
-
-   This makes a difference if you change the definition of `BUFSIZE' at
-some point in the source file.  `TABLESIZE', defined as shown, will
-always expand using the definition of `BUFSIZE' that is currently in
-effect:
-
-     #define BUFSIZE 1020
-     #define TABLESIZE BUFSIZE
-     #undef BUFSIZE
-     #define BUFSIZE 37
-
-Now `TABLESIZE' expands (in two stages) to `37'.  (The `#undef' is to
-prevent any warning about the nontrivial redefinition of `BUFSIZE'.)
-
-\1f
-File: cpp.info,  Node: Newlines in Args,  Prev: Cascaded Macros,  Up: Macro Pitfalls
-
-Newlines in Macro Arguments
----------------------------
-
-   Traditional macro processing carries forward all newlines in macro
-arguments into the expansion of the macro.  This means that, if some of
-the arguments are substituted more than once, or not at all, or out of
-order, newlines can be duplicated, lost, or moved around within the
-expansion.  If the expansion consists of multiple statements, then the
-effect is to distort the line numbers of some of these statements.  The
-result can be incorrect line numbers, in error messages or displayed in
-a debugger.
-
-   The GNU C preprocessor operating in ANSI C mode adjusts appropriately
-for multiple use of an argument--the first use expands all the
-newlines, and subsequent uses of the same argument produce no newlines.
-But even in this mode, it can produce incorrect line numbering if
-arguments are used out of order, or not used at all.
-
-   Here is an example illustrating this problem:
-
-     #define ignore_second_arg(a,b,c) a; c
-     
-     ignore_second_arg (foo (),
-                        ignored (),
-                        syntax error);
-
-The syntax error triggered by the tokens `syntax error' results in an
-error message citing line four, even though the statement text comes
-from line five.
-
-\1f
-File: cpp.info,  Node: Conditionals,  Next: Combining Sources,  Prev: Macros,  Up: Top
-
-Conditionals
-============
-
-   In a macro processor, a "conditional" is a directive that allows a
-part of the program to be ignored during compilation, on some
-conditions.  In the C preprocessor, a conditional can test either an
-arithmetic expression or whether a name is defined as a macro.
-
-   A conditional in the C preprocessor resembles in some ways an `if'
-statement in C, but it is important to understand the difference between
-them.  The condition in an `if' statement is tested during the execution
-of your program.  Its purpose is to allow your program to behave
-differently from run to run, depending on the data it is operating on.
-The condition in a preprocessing conditional directive is tested when
-your program is compiled.  Its purpose is to allow different code to be
-included in the program depending on the situation at the time of
-compilation.
-
-* Menu:
-
-* Uses: Conditional Uses.       What conditionals are for.
-* Syntax: Conditional Syntax.   How conditionals are written.
-* Deletion: Deleted Code.       Making code into a comment.
-* Macros: Conditionals-Macros.  Why conditionals are used with macros.
-* Assertions::                 How and why to use assertions.
-* Errors: #error Directive.     Detecting inconsistent compilation parameters.
-
-\1f
-File: cpp.info,  Node: Conditional Uses,  Next: Conditional Syntax,  Up: Conditionals
-
-Why Conditionals are Used
--------------------------
-
-   Generally there are three kinds of reason to use a conditional.
-
-   * A program may need to use different code depending on the machine
-     or operating system it is to run on.  In some cases the code for
-     one operating system may be erroneous on another operating system;
-     for example, it might refer to library routines that do not exist
-     on the other system.  When this happens, it is not enough to avoid
-     executing the invalid code: merely having it in the program makes
-     it impossible to link the program and run it.  With a
-     preprocessing conditional, the offending code can be effectively
-     excised from the program when it is not valid.
-
-   * You may want to be able to compile the same source file into two
-     different programs.  Sometimes the difference between the programs
-     is that one makes frequent time-consuming consistency checks on its
-     intermediate data, or prints the values of those data for
-     debugging, while the other does not.
-
-   * A conditional whose condition is always false is a good way to
-     exclude code from the program but keep it as a sort of comment for
-     future reference.
-
-   Most simple programs that are intended to run on only one machine
-will not need to use preprocessing conditionals.
-
-\1f
-File: cpp.info,  Node: Conditional Syntax,  Next: Deleted Code,  Prev: Conditional Uses,  Up: Conditionals
-
-Syntax of Conditionals
-----------------------
-
-   A conditional in the C preprocessor begins with a "conditional
-directive": `#if', `#ifdef' or `#ifndef'.  *Note Conditionals-Macros::,
-for information on `#ifdef' and `#ifndef'; only `#if' is explained here.
-
-* Menu:
-
-* If: #if Directive.     Basic conditionals using `#if' and `#endif'.
-* Else: #else Directive. Including some text if the condition fails.
-* Elif: #elif Directive. Testing several alternative possibilities.
-
-\1f
-File: cpp.info,  Node: #if Directive,  Next: #else Directive,  Up: Conditional Syntax
-
-The `#if' Directive
-...................
-
-   The `#if' directive in its simplest form consists of
-
-     #if EXPRESSION
-     CONTROLLED TEXT
-     #endif /* EXPRESSION */
-
-   The comment following the `#endif' is not required, but it is a good
-practice because it helps people match the `#endif' to the
-corresponding `#if'.  Such comments should always be used, except in
-short conditionals that are not nested.  In fact, you can put anything
-at all after the `#endif' and it will be ignored by the GNU C
-preprocessor, but only comments are acceptable in ANSI Standard C.
-
-   EXPRESSION is a C expression of integer type, subject to stringent
-restrictions.  It may contain
-
-   * Integer constants, which are all regarded as `long' or `unsigned
-     long'.
-
-   * Character constants, which are interpreted according to the
-     character set and conventions of the machine and operating system
-     on which the preprocessor is running.  The GNU C preprocessor uses
-     the C data type `char' for these character constants; therefore,
-     whether some character codes are negative is determined by the C
-     compiler used to compile the preprocessor.  If it treats `char' as
-     signed, then character codes large enough to set the sign bit will
-     be considered negative; otherwise, no character code is considered
-     negative.
-
-   * Arithmetic operators for addition, subtraction, multiplication,
-     division, bitwise operations, shifts, comparisons, and logical
-     operations (`&&' and `||').
-
-   * Identifiers that are not macros, which are all treated as zero(!).
-
-   * Macro calls.  All macro calls in the expression are expanded before
-     actual computation of the expression's value begins.
-
-   Note that `sizeof' operators and `enum'-type values are not allowed.
-`enum'-type values, like all other identifiers that are not taken as
-macro calls and expanded, are treated as zero.
-
-   The CONTROLLED TEXT inside of a conditional can include
-preprocessing directives.  Then the directives inside the conditional
-are obeyed only if that branch of the conditional succeeds.  The text
-can also contain other conditional groups.  However, the `#if' and
-`#endif' directives must balance.
-
-\1f
-File: cpp.info,  Node: #else Directive,  Next: #elif Directive,  Prev: #if Directive,  Up: Conditional Syntax
-
-The `#else' Directive
-.....................
-
-   The `#else' directive can be added to a conditional to provide
-alternative text to be used if the condition is false.  This is what it
-looks like:
-
-     #if EXPRESSION
-     TEXT-IF-TRUE
-     #else /* Not EXPRESSION */
-     TEXT-IF-FALSE
-     #endif /* Not EXPRESSION */
-
-   If EXPRESSION is nonzero, and thus the TEXT-IF-TRUE is active, then
-`#else' acts like a failing conditional and the TEXT-IF-FALSE is
-ignored.  Contrariwise, if the `#if' conditional fails, the
-TEXT-IF-FALSE is considered included.
-
-\1f
-File: cpp.info,  Node: #elif Directive,  Prev: #else Directive,  Up: Conditional Syntax
-
-The `#elif' Directive
-.....................
-
-   One common case of nested conditionals is used to check for more
-than two possible alternatives.  For example, you might have
-
-     #if X == 1
-     ...
-     #else /* X != 1 */
-     #if X == 2
-     ...
-     #else /* X != 2 */
-     ...
-     #endif /* X != 2 */
-     #endif /* X != 1 */
-
-   Another conditional directive, `#elif', allows this to be abbreviated
-as follows:
-
-     #if X == 1
-     ...
-     #elif X == 2
-     ...
-     #else /* X != 2 and X != 1*/
-     ...
-     #endif /* X != 2 and X != 1*/
-
-   `#elif' stands for "else if".  Like `#else', it goes in the middle
-of a `#if'-`#endif' pair and subdivides it; it does not require a
-matching `#endif' of its own.  Like `#if', the `#elif' directive
-includes an expression to be tested.
-
-   The text following the `#elif' is processed only if the original
-`#if'-condition failed and the `#elif' condition succeeds.  More than
-one `#elif' can go in the same `#if'-`#endif' group.  Then the text
-after each `#elif' is processed only if the `#elif' condition succeeds
-after the original `#if' and any previous `#elif' directives within it
-have failed.  `#else' is equivalent to `#elif 1', and `#else' is
-allowed after any number of `#elif' directives, but `#elif' may not
-follow `#else'.
-
-\1f
-File: cpp.info,  Node: Deleted Code,  Next: Conditionals-Macros,  Prev: Conditional Syntax,  Up: Conditionals
-
-Keeping Deleted Code for Future Reference
------------------------------------------
-
-   If you replace or delete a part of the program but want to keep the
-old code around as a comment for future reference, the easy way to do
-this is to put `#if 0' before it and `#endif' after it.  This is better
-than using comment delimiters `/*' and `*/' since those won't work if
-the code already contains comments (C comments do not nest).
-
-   This works even if the code being turned off contains conditionals,
-but they must be entire conditionals (balanced `#if' and `#endif').
-
-   Conversely, do not use `#if 0' for comments which are not C code.
-Use the comment delimiters `/*' and `*/' instead.  The interior of `#if
-0' must consist of complete tokens; in particular, singlequote
-characters must balance.  But comments often contain unbalanced
-singlequote characters (known in English as apostrophes).  These
-confuse `#if 0'.  They do not confuse `/*'.
-
-\1f
-File: cpp.info,  Node: Conditionals-Macros,  Next: Assertions,  Prev: Deleted Code,  Up: Conditionals
-
-Conditionals and Macros
------------------------
-
-   Conditionals are useful in connection with macros or assertions,
-because those are the only ways that an expression's value can vary
-from one compilation to another.  A `#if' directive whose expression
-uses no macros or assertions is equivalent to `#if 1' or `#if 0'; you
-might as well determine which one, by computing the value of the
-expression yourself, and then simplify the program.
-
-   For example, here is a conditional that tests the expression
-`BUFSIZE == 1020', where `BUFSIZE' must be a macro.
-
-     #if BUFSIZE == 1020
-       printf ("Large buffers!\n");
-     #endif /* BUFSIZE is large */
-
-   (Programmers often wish they could test the size of a variable or
-data type in `#if', but this does not work.  The preprocessor does not
-understand `sizeof', or typedef names, or even the type keywords such
-as `int'.)
-
-   The special operator `defined' is used in `#if' expressions to test
-whether a certain name is defined as a macro.  Either `defined NAME' or
-`defined (NAME)' is an expression whose value is 1 if NAME is defined
-as macro at the current point in the program, and 0 otherwise.  For the
-`defined' operator it makes no difference what the definition of the
-macro is; all that matters is whether there is a definition.  Thus, for
-example,
-
-     #if defined (vax) || defined (ns16000)
-
-would succeed if either of the names `vax' and `ns16000' is defined as
-a macro.  You can test the same condition using assertions (*note
-Assertions::.), like this:
-
-     #if #cpu (vax) || #cpu (ns16000)
-
-   If a macro is defined and later undefined with `#undef', subsequent
-use of the `defined' operator returns 0, because the name is no longer
-defined.  If the macro is defined again with another `#define',
-`defined' will recommence returning 1.
-
-   Conditionals that test whether just one name is defined are very
-common, so there are two special short conditional directives for this
-case.
-
-`#ifdef NAME'
-     is equivalent to `#if defined (NAME)'.
-
-`#ifndef NAME'
-     is equivalent to `#if ! defined (NAME)'.
-
-   Macro definitions can vary between compilations for several reasons.
-
-   * Some macros are predefined on each kind of machine.  For example,
-     on a Vax, the name `vax' is a predefined macro.  On other
-     machines, it would not be defined.
-
-   * Many more macros are defined by system header files.  Different
-     systems and machines define different macros, or give them
-     different values.  It is useful to test these macros with
-     conditionals to avoid using a system feature on a machine where it
-     is not implemented.
-
-   * Macros are a common way of allowing users to customize a program
-     for different machines or applications.  For example, the macro
-     `BUFSIZE' might be defined in a configuration file for your
-     program that is included as a header file in each source file.  You
-     would use `BUFSIZE' in a preprocessing conditional in order to
-     generate different code depending on the chosen configuration.
-
-   * Macros can be defined or undefined with `-D' and `-U' command
-     options when you compile the program.  You can arrange to compile
-     the same source file into two different programs by choosing a
-     macro name to specify which program you want, writing conditionals
-     to test whether or how this macro is defined, and then controlling
-     the state of the macro with compiler command options.  *Note
-     Invocation::.
-
-   Assertions are usually predefined, but can be defined with
-preprocessor directives or command-line options.
-
-\1f
-File: cpp.info,  Node: Assertions,  Next: #error Directive,  Prev: Conditionals-Macros,  Up: Conditionals
-
-Assertions
-----------
-
-   "Assertions" are a more systematic alternative to macros in writing
-conditionals to test what sort of computer or system the compiled
-program will run on.  Assertions are usually predefined, but you can
-define them with preprocessing directives or command-line options.
-
-   The macros traditionally used to describe the type of target are not
-classified in any way according to which question they answer; they may
-indicate a hardware architecture, a particular hardware model, an
-operating system, a particular version of an operating system, or
-specific configuration options.  These are jumbled together in a single
-namespace.  In contrast, each assertion consists of a named question and
-an answer.  The question is usually called the "predicate".  An
-assertion looks like this:
-
-     #PREDICATE (ANSWER)
-
-You must use a properly formed identifier for PREDICATE.  The value of
-ANSWER can be any sequence of words; all characters are significant
-except for leading and trailing whitespace, and differences in internal
-whitespace sequences are ignored.  Thus, `x + y' is different from
-`x+y' but equivalent to `x + y'.  `)' is not allowed in an answer.
-
-   Here is a conditional to test whether the answer ANSWER is asserted
-for the predicate PREDICATE:
-
-     #if #PREDICATE (ANSWER)
-
-There may be more than one answer asserted for a given predicate.  If
-you omit the answer, you can test whether *any* answer is asserted for
-PREDICATE:
-
-     #if #PREDICATE
-
-   Most of the time, the assertions you test will be predefined
-assertions.  GNU C provides three predefined predicates: `system',
-`cpu', and `machine'.  `system' is for assertions about the type of
-software, `cpu' describes the type of computer architecture, and
-`machine' gives more information about the computer.  For example, on a
-GNU system, the following assertions would be true:
-
-     #system (gnu)
-     #system (mach)
-     #system (mach 3)
-     #system (mach 3.SUBVERSION)
-     #system (hurd)
-     #system (hurd VERSION)
-
-and perhaps others.  The alternatives with more or less version
-information let you ask more or less detailed questions about the type
-of system software.
-
-   On a Unix system, you would find `#system (unix)' and perhaps one of:
-`#system (aix)', `#system (bsd)', `#system (hpux)', `#system (lynx)',
-`#system (mach)', `#system (posix)', `#system (svr3)', `#system
-(svr4)', or `#system (xpg4)' with possible version numbers following.
-
-   Other values for `system' are `#system (mvs)' and `#system (vms)'.
-
-   *Portability note:* Many Unix C compilers provide only one answer
-for the `system' assertion: `#system (unix)', if they support
-assertions at all.  This is less than useful.
-
-   An assertion with a multi-word answer is completely different from
-several assertions with individual single-word answers.  For example,
-the presence of `system (mach 3.0)' does not mean that `system (3.0)'
-is true.  It also does not directly imply `system (mach)', but in GNU
-C, that last will normally be asserted as well.
-
-   The current list of possible assertion values for `cpu' is: `#cpu
-(a29k)', `#cpu (alpha)', `#cpu (arm)', `#cpu (clipper)', `#cpu
-(convex)', `#cpu (elxsi)', `#cpu (tron)', `#cpu (h8300)', `#cpu
-(i370)', `#cpu (i386)', `#cpu (i860)', `#cpu (i960)', `#cpu (m68k)',
-`#cpu (m88k)', `#cpu (mips)', `#cpu (ns32k)', `#cpu (hppa)', `#cpu
-(pyr)', `#cpu (ibm032)', `#cpu (rs6000)', `#cpu (sh)', `#cpu (sparc)',
-`#cpu (spur)', `#cpu (tahoe)', `#cpu (vax)', `#cpu (we32000)'.
-
-   You can create assertions within a C program using `#assert', like
-this:
-
-     #assert PREDICATE (ANSWER)
-
-(Note the absence of a `#' before PREDICATE.)
-
-   Each time you do this, you assert a new true answer for PREDICATE.
-Asserting one answer does not invalidate previously asserted answers;
-they all remain true.  The only way to remove an assertion is with
-`#unassert'.  `#unassert' has the same syntax as `#assert'.  You can
-also remove all assertions about PREDICATE like this:
-
-     #unassert PREDICATE
-
-   You can also add or cancel assertions using command options when you
-run `gcc' or `cpp'.  *Note Invocation::.
-
-\1f
-File: cpp.info,  Node: #error Directive,  Prev: Assertions,  Up: Conditionals
-
-The `#error' and `#warning' Directives
---------------------------------------
-
-   The directive `#error' causes the preprocessor to report a fatal
-error.  The rest of the line that follows `#error' is used as the error
-message.  The line must consist of complete tokens.
-
-   You would use `#error' inside of a conditional that detects a
-combination of parameters which you know the program does not properly
-support.  For example, if you know that the program will not run
-properly on a Vax, you might write
-
-     #ifdef __vax__
-     #error "Won't work on Vaxen.  See comments at get_last_object."
-     #endif
-
-*Note Nonstandard Predefined::, for why this works.
-
-   If you have several configuration parameters that must be set up by
-the installation in a consistent way, you can use conditionals to detect
-an inconsistency and report it with `#error'.  For example,
-
-     #if HASH_TABLE_SIZE % 2 == 0 || HASH_TABLE_SIZE % 3 == 0 \
-         || HASH_TABLE_SIZE % 5 == 0
-     #error HASH_TABLE_SIZE should not be divisible by a small prime
-     #endif
-
-   The directive `#warning' is like the directive `#error', but causes
-the preprocessor to issue a warning and continue preprocessing.  The
-rest of the line that follows `#warning' is used as the warning message.
-
-   You might use `#warning' in obsolete header files, with a message
-directing the user to the header file which should be used instead.
-
-\1f
-File: cpp.info,  Node: Combining Sources,  Next: Other Directives,  Prev: Conditionals,  Up: Top
-
-Combining Source Files
-======================
-
-   One of the jobs of the C preprocessor is to inform the C compiler of
-where each line of C code came from: which source file and which line
-number.
-
-   C code can come from multiple source files if you use `#include';
-both `#include' and the use of conditionals and macros can cause the
-line number of a line in the preprocessor output to be different from
-the line's number in the original source file.  You will appreciate the
-value of making both the C compiler (in error messages) and symbolic
-debuggers such as GDB use the line numbers in your source file.
-
-   The C preprocessor builds on this feature by offering a directive by
-which you can control the feature explicitly.  This is useful when a
-file for input to the C preprocessor is the output from another program
-such as the `bison' parser generator, which operates on another file
-that is the true source file.  Parts of the output from `bison' are
-generated from scratch, other parts come from a standard parser file.
-The rest are copied nearly verbatim from the source file, but their
-line numbers in the `bison' output are not the same as their original
-line numbers.  Naturally you would like compiler error messages and
-symbolic debuggers to know the original source file and line number of
-each line in the `bison' input.
-
-   `bison' arranges this by writing `#line' directives into the output
-file.  `#line' is a directive that specifies the original line number
-and source file name for subsequent input in the current preprocessor
-input file.  `#line' has three variants:
-
-`#line LINENUM'
-     Here LINENUM is a decimal integer constant.  This specifies that
-     the line number of the following line of input, in its original
-     source file, was LINENUM.
-
-`#line LINENUM FILENAME'
-     Here LINENUM is a decimal integer constant and FILENAME is a
-     string constant.  This specifies that the following line of input
-     came originally from source file FILENAME and its line number there
-     was LINENUM.  Keep in mind that FILENAME is not just a file name;
-     it is surrounded by doublequote characters so that it looks like a
-     string constant.
-
-`#line ANYTHING ELSE'
-     ANYTHING ELSE is checked for macro calls, which are expanded.  The
-     result should be a decimal integer constant followed optionally by
-     a string constant, as described above.
-
-   `#line' directives alter the results of the `__FILE__' and
-`__LINE__' predefined macros from that point on.  *Note Standard
-Predefined::.
-
-   The output of the preprocessor (which is the input for the rest of
-the compiler) contains directives that look much like `#line'
-directives.  They start with just `#' instead of `#line', but this is
-followed by a line number and file name as in `#line'.  *Note Output::.
-
-\1f
-File: cpp.info,  Node: Other Directives,  Next: Output,  Prev: Combining Sources,  Up: Top
-
-Miscellaneous Preprocessing Directives
-======================================
-
-   This section describes three additional preprocessing directives.
-They are not very useful, but are mentioned for completeness.
-
-   The "null directive" consists of a `#' followed by a Newline, with
-only whitespace (including comments) in between.  A null directive is
-understood as a preprocessing directive but has no effect on the
-preprocessor output.  The primary significance of the existence of the
-null directive is that an input line consisting of just a `#' will
-produce no output, rather than a line of output containing just a `#'.
-Supposedly some old C programs contain such lines.
-
-   The ANSI standard specifies that the effect of the `#pragma'
-directive is implementation-defined.  In the GNU C preprocessor,
-`#pragma' directives are not used, except for `#pragma once' (*note
-Once-Only::.).  However, they are left in the preprocessor output, so
-they are available to the compilation pass.
-
-   The `#ident' directive is supported for compatibility with certain
-other systems.  It is followed by a line of text.  On some systems, the
-text is copied into a special place in the object file; on most systems,
-the text is ignored and this directive has no effect.  Typically
-`#ident' is only used in header files supplied with those systems where
-it is meaningful.
-
-\1f
-File: cpp.info,  Node: Output,  Next: Invocation,  Prev: Other Directives,  Up: Top
-
-C Preprocessor Output
-=====================
-
-   The output from the C preprocessor looks much like the input, except
-that all preprocessing directive lines have been replaced with blank
-lines and all comments with spaces.  Whitespace within a line is not
-altered; however, unless `-traditional' is used, spaces may be inserted
-into the expansions of macro calls to prevent tokens from being
-concatenated.
-
-   Source file name and line number information is conveyed by lines of
-the form
-
-     # LINENUM FILENAME FLAGS
-
-which are inserted as needed into the middle of the input (but never
-within a string or character constant).  Such a line means that the
-following line originated in file FILENAME at line LINENUM.
-
-   After the file name comes zero or more flags, which are `1', `2',
-`3', or `4'.  If there are multiple flags, spaces separate them.  Here
-is what the flags mean:
-
-`1'
-     This indicates the start of a new file.
-
-`2'
-     This indicates returning to a file (after having included another
-     file).
-
-`3'
-     This indicates that the following text comes from a system header
-     file, so certain warnings should be suppressed.
-
-`4'
-     This indicates that the following text should be treated as C.
-
diff --git a/gcc/cpp.info-3 b/gcc/cpp.info-3
deleted file mode 100644 (file)
index 9f0fa14..0000000
+++ /dev/null
@@ -1,478 +0,0 @@
-This is Info file cpp.info, produced by Makeinfo version 1.67 from the
-input file cpp.texi.
-
-   This file documents the GNU C Preprocessor.
-
-   Copyright 1987, 1989, 1991, 1992, 1993, 1994, 1995 Free Software
-Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the entire resulting derived work is distributed under the terms
-of a permission notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions.
-
-\1f
-File: cpp.info,  Node: Invocation,  Next: Concept Index,  Prev: Output,  Up: Top
-
-Invoking the C Preprocessor
-===========================
-
-   Most often when you use the C preprocessor you will not have to
-invoke it explicitly: the C compiler will do so automatically.
-However, the preprocessor is sometimes useful on its own.
-
-   The C preprocessor expects two file names as arguments, INFILE and
-OUTFILE.  The preprocessor reads INFILE together with any other files
-it specifies with `#include'.  All the output generated by the combined
-input files is written in OUTFILE.
-
-   Either INFILE or OUTFILE may be `-', which as INFILE means to read
-from standard input and as OUTFILE means to write to standard output.
-Also, if OUTFILE or both file names are omitted, the standard output
-and standard input are used for the omitted file names.
-
-   Here is a table of command options accepted by the C preprocessor.
-These options can also be given when compiling a C program; they are
-passed along automatically to the preprocessor when it is invoked by the
-compiler.
-
-`-P'
-     Inhibit generation of `#'-lines with line-number information in
-     the output from the preprocessor (*note Output::.).  This might be
-     useful when running the preprocessor on something that is not C
-     code and will be sent to a program which might be confused by the
-     `#'-lines.
-
-`-C'
-     Do not discard comments: pass them through to the output file.
-     Comments appearing in arguments of a macro call will be copied to
-     the output before the expansion of the macro call.
-
-`-traditional'
-     Try to imitate the behavior of old-fashioned C, as opposed to ANSI
-     C.
-
-        * Traditional macro expansion pays no attention to singlequote
-          or doublequote characters; macro argument symbols are
-          replaced by the argument values even when they appear within
-          apparent string or character constants.
-
-        * Traditionally, it is permissible for a macro expansion to end
-          in the middle of a string or character constant.  The
-          constant continues into the text surrounding the macro call.
-
-        * However, traditionally the end of the line terminates a
-          string or character constant, with no error.
-
-        * In traditional C, a comment is equivalent to no text at all.
-          (In ANSI C, a comment counts as whitespace.)
-
-        * Traditional C does not have the concept of a "preprocessing
-          number".  It considers `1.0e+4' to be three tokens: `1.0e',
-          `+', and `4'.
-
-        * A macro is not suppressed within its own definition, in
-          traditional C.  Thus, any macro that is used recursively
-          inevitably causes an error.
-
-        * The character `#' has no special meaning within a macro
-          definition in traditional C.
-
-        * In traditional C, the text at the end of a macro expansion
-          can run together with the text after the macro call, to
-          produce a single token.  (This is impossible in ANSI C.)
-
-        * Traditionally, `\' inside a macro argument suppresses the
-          syntactic significance of the following character.
-
-`-trigraphs'
-     Process ANSI standard trigraph sequences.  These are
-     three-character sequences, all starting with `??', that are
-     defined by ANSI C to stand for single characters.  For example,
-     `??/' stands for `\', so `'??/n'' is a character constant for a
-     newline.  Strictly speaking, the GNU C preprocessor does not
-     support all programs in ANSI Standard C unless `-trigraphs' is
-     used, but if you ever notice the difference it will be with relief.
-
-     You don't want to know any more about trigraphs.
-
-`-pedantic'
-     Issue warnings required by the ANSI C standard in certain cases
-     such as when text other than a comment follows `#else' or `#endif'.
-
-`-pedantic-errors'
-     Like `-pedantic', except that errors are produced rather than
-     warnings.
-
-`-Wtrigraphs'
-     Warn if any trigraphs are encountered (assuming they are enabled).
-
-`-Wcomment'
-     Warn whenever a comment-start sequence `/*' appears in a `/*'
-     comment, or whenever a Backslash-Newline appears in a `//' comment.
-
-`-Wall'
-     Requests both `-Wtrigraphs' and `-Wcomment' (but not
-     `-Wtraditional' or `-Wundef').
-
-`-Wtraditional'
-     Warn about certain constructs that behave differently in
-     traditional and ANSI C.
-
-`-Wundef'
-     Warn if an undefined identifier is evaluated in an `#if' directive.
-
-`-I DIRECTORY'
-     Add the directory DIRECTORY to the head of the list of directories
-     to be searched for header files (*note Include Syntax::.).  This
-     can be used to override a system header file, substituting your
-     own version, since these directories are searched before the system
-     header file directories.  If you use more than one `-I' option,
-     the directories are scanned in left-to-right order; the standard
-     system directories come after.
-
-`-I-'
-     Any directories specified with `-I' options before the `-I-'
-     option are searched only for the case of `#include "FILE"'; they
-     are not searched for `#include <FILE>'.
-
-     If additional directories are specified with `-I' options after
-     the `-I-', these directories are searched for all `#include'
-     directives.
-
-     In addition, the `-I-' option inhibits the use of the current
-     directory as the first search directory for `#include "FILE"'.
-     Therefore, the current directory is searched only if it is
-     requested explicitly with `-I.'.  Specifying both `-I-' and `-I.'
-     allows you to control precisely which directories are searched
-     before the current one and which are searched after.
-
-`-nostdinc'
-     Do not search the standard system directories for header files.
-     Only the directories you have specified with `-I' options (and the
-     current directory, if appropriate) are searched.
-
-`-nostdinc++'
-     Do not search for header files in the C++-specific standard
-     directories, but do still search the other standard directories.
-     (This option is used when building libg++.)
-
-`-D NAME'
-     Predefine NAME as a macro, with definition `1'.
-
-`-D NAME=DEFINITION'
-     Predefine NAME as a macro, with definition DEFINITION.  There are
-     no restrictions on the contents of DEFINITION, but if you are
-     invoking the preprocessor from a shell or shell-like program you
-     may need to use the shell's quoting syntax to protect characters
-     such as spaces that have a meaning in the shell syntax.  If you
-     use more than one `-D' for the same NAME, the rightmost definition
-     takes effect.
-
-`-U NAME'
-     Do not predefine NAME.  If both `-U' and `-D' are specified for
-     one name, the `-U' beats the `-D' and the name is not predefined.
-
-`-undef'
-     Do not predefine any nonstandard macros.
-
-`-A PREDICATE(ANSWER)'
-     Make an assertion with the predicate PREDICATE and answer ANSWER.
-     *Note Assertions::.
-
-     You can use `-A-' to disable all predefined assertions; it also
-     undefines all predefined macros that identify the type of target
-     system.
-
-`-dM'
-     Instead of outputting the result of preprocessing, output a list of
-     `#define' directives for all the macros defined during the
-     execution of the preprocessor, including predefined macros.  This
-     gives you a way of finding out what is predefined in your version
-     of the preprocessor; assuming you have no file `foo.h', the command
-
-          touch foo.h; cpp -dM foo.h
-
-     will show the values of any predefined macros.
-
-`-dD'
-     Like `-dM' except in two respects: it does *not* include the
-     predefined macros, and it outputs *both* the `#define' directives
-     and the result of preprocessing.  Both kinds of output go to the
-     standard output file.
-
-`-dI'
-     Output `#include' directives in addition to the result of
-     preprocessing.
-
-`-M [-MG]'
-     Instead of outputting the result of preprocessing, output a rule
-     suitable for `make' describing the dependencies of the main source
-     file.  The preprocessor outputs one `make' rule containing the
-     object file name for that source file, a colon, and the names of
-     all the included files.  If there are many included files then the
-     rule is split into several lines using `\'-newline.
-
-     `-MG' says to treat missing header files as generated files and
-     assume they live in the same directory as the source file.  It
-     must be specified in addition to `-M'.
-
-     This feature is used in automatic updating of makefiles.
-
-`-MM [-MG]'
-     Like `-M' but mention only the files included with `#include
-     "FILE"'.  System header files included with `#include <FILE>' are
-     omitted.
-
-`-MD FILE'
-     Like `-M' but the dependency information is written to FILE.  This
-     is in addition to compiling the file as specified--`-MD' does not
-     inhibit ordinary compilation the way `-M' does.
-
-     When invoking gcc, do not specify the FILE argument.  Gcc will
-     create file names made by replacing ".c" with ".d" at the end of
-     the input file names.
-
-     In Mach, you can use the utility `md' to merge multiple dependency
-     files into a single dependency file suitable for using with the
-     `make' command.
-
-`-MMD FILE'
-     Like `-MD' except mention only user header files, not system
-     header files.
-
-`-H'
-     Print the name of each header file used, in addition to other
-     normal activities.
-
-`-imacros FILE'
-     Process FILE as input, discarding the resulting output, before
-     processing the regular input file.  Because the output generated
-     from FILE is discarded, the only effect of `-imacros FILE' is to
-     make the macros defined in FILE available for use in the main
-     input.
-
-`-include FILE'
-     Process FILE as input, and include all the resulting output,
-     before processing the regular input file.
-
-`-idirafter DIR'
-     Add the directory DIR to the second include path.  The directories
-     on the second include path are searched when a header file is not
-     found in any of the directories in the main include path (the one
-     that `-I' adds to).
-
-`-iprefix PREFIX'
-     Specify PREFIX as the prefix for subsequent `-iwithprefix' options.
-
-`-iwithprefix DIR'
-     Add a directory to the second include path.  The directory's name
-     is made by concatenating PREFIX and DIR, where PREFIX was
-     specified previously with `-iprefix'.
-
-`-isystem DIR'
-     Add a directory to the beginning of the second include path,
-     marking it as a system directory, so that it gets the same special
-     treatment as is applied to the standard system directories.
-
-`-lang-c'
-`-lang-c89'
-`-lang-c++'
-`-lang-objc'
-`-lang-objc++'
-     Specify the source language.  `-lang-c' is the default; it allows
-     recognition of C++ comments (comments that begin with `//' and end
-     at end of line) and hexadecimal floating-point constants, since
-     these features will most likely appear in the next C standard.
-     `-lang-c89' disables recognition of C++ comments and hexadecimal
-     floating-point constants.  `-lang-c++' handles C++ comment syntax
-     and includes extra default include directories for C++.
-     `-lang-objc' enables the Objective C `#import' directive.
-     `-lang-objc++' enables both C++ and Objective C extensions.
-
-     These options are generated by the compiler driver `gcc', but not
-     passed from the `gcc' command line unless you use the driver's
-     `-Wp' option.
-
-`-lint'
-     Look for commands to the program checker `lint' embedded in
-     comments, and emit them preceded by `#pragma lint'.  For example,
-     the comment `/* NOTREACHED */' becomes `#pragma lint NOTREACHED'.
-
-     This option is available only when you call `cpp' directly; `gcc'
-     will not pass it from its command line.
-
-`-$'
-     Forbid the use of `$' in identifiers.  This was formerly required
-     for strict conformance to the C Standard before the standard was
-     corrected.
-
-     This option is available only when you call `cpp' directly; `gcc'
-     will not pass it from its command line.
-
-\1f
-File: cpp.info,  Node: Concept Index,  Next: Index,  Prev: Invocation,  Up: Top
-
-Concept Index
-*************
-
-* Menu:
-
-* ##:                                    Concatenation.
-* arguments in macro definitions:        Argument Macros.
-* assertions:                            Assertions.
-* assertions, undoing:                   Assertions.
-* blank macro arguments:                 Argument Macros.
-* cascaded macros:                       Cascaded Macros.
-* commenting out code:                   Deleted Code.
-* computed #include:                     Include Syntax.
-* concatenation:                         Concatenation.
-* conditionals:                          Conditionals.
-* directives:                            Directives.
-* expansion of arguments:                Argument Prescan.
-* function-like macro:                   Argument Macros.
-* header file:                           Header Files.
-* including just once:                   Once-Only.
-* inheritance:                           Inheritance.
-* invocation of the preprocessor:        Invocation.
-* line control:                          Combining Sources.
-* macro argument expansion:              Argument Prescan.
-* macro body uses macro:                 Cascaded Macros.
-* macros with argument:                  Argument Macros.
-* manifest constant:                     Simple Macros.
-* newlines in macro arguments:           Newlines in Args.
-* null directive:                        Other Directives.
-* options:                               Invocation.
-* output format:                         Output.
-* overriding a header file:              Inheritance.
-* parentheses in macro bodies:           Macro Parentheses.
-* pitfalls of macros:                    Macro Pitfalls.
-* predefined macros:                     Predefined.
-* predicates:                            Assertions.
-* preprocessing directives:              Directives.
-* prescan of macro arguments:            Argument Prescan.
-* problems with macros:                  Macro Pitfalls.
-* redefining macros:                     Redefining.
-* repeated inclusion:                    Once-Only.
-* retracting assertions:                 Assertions.
-* second include path:                   Invocation.
-* self-reference:                        Self-Reference.
-* semicolons (after macro calls):        Swallow Semicolon.
-* side effects (in macro arguments):     Side Effects.
-* simple macro:                          Simple Macros.
-* space as macro argument:               Argument Macros.
-* standard predefined macros:            Standard Predefined.
-* stringification:                       Stringification.
-* testing predicates:                    Assertions.
-* unassert:                              Assertions.
-* undefining macros:                     Undefining.
-* unsafe macros:                         Side Effects.
-
-\1f
-File: cpp.info,  Node: Index,  Prev: Concept Index,  Up: Top
-
-Index of Directives, Macros and Options
-***************************************
-
-* Menu:
-
-* #assert:                               Assertions.
-* #cpu:                                  Assertions.
-* #define:                               Argument Macros.
-* #elif:                                 #elif Directive.
-* #else:                                 #else Directive.
-* #error:                                #error Directive.
-* #ident:                                Other Directives.
-* #if:                                   Conditional Syntax.
-* #ifdef:                                Conditionals-Macros.
-* #ifndef:                               Conditionals-Macros.
-* #import:                               Once-Only.
-* #include:                              Include Syntax.
-* #include_next:                         Inheritance.
-* #line:                                 Combining Sources.
-* #machine:                              Assertions.
-* #pragma:                               Other Directives.
-* #pragma once:                          Once-Only.
-* #system:                               Assertions.
-* #unassert:                             Assertions.
-* #warning:                              #error Directive.
-* -$:                                    Invocation.
-* -A:                                    Invocation.
-* -C:                                    Invocation.
-* -D:                                    Invocation.
-* -dD:                                   Invocation.
-* -dI:                                   Invocation.
-* -dM:                                   Invocation.
-* -H:                                    Invocation.
-* -I:                                    Invocation.
-* -idirafter:                            Invocation.
-* -imacros:                              Invocation.
-* -include:                              Invocation.
-* -iprefix:                              Invocation.
-* -isystem:                              Invocation.
-* -iwithprefix:                          Invocation.
-* -lang-c:                               Invocation.
-* -lang-c++:                             Invocation.
-* -lang-c89:                             Invocation.
-* -lang-objc:                            Invocation.
-* -lang-objc++:                          Invocation.
-* -M:                                    Invocation.
-* -MD:                                   Invocation.
-* -MM:                                   Invocation.
-* -MMD:                                  Invocation.
-* -nostdinc:                             Invocation.
-* -nostdinc++:                           Invocation.
-* -P:                                    Invocation.
-* -pedantic:                             Invocation.
-* -pedantic-errors:                      Invocation.
-* -traditional:                          Invocation.
-* -trigraphs:                            Invocation.
-* -U:                                    Invocation.
-* -undef:                                Invocation.
-* -Wall:                                 Invocation.
-* -Wcomment:                             Invocation.
-* -Wtraditional:                         Invocation.
-* -Wtrigraphs:                           Invocation.
-* -Wundef:                               Invocation.
-* __BASE_FILE__:                         Standard Predefined.
-* __CHAR_UNSIGNED__:                     Standard Predefined.
-* __cplusplus:                           Standard Predefined.
-* __DATE__:                              Standard Predefined.
-* __FILE__:                              Standard Predefined.
-* __GNUC__:                              Standard Predefined.
-* __GNUC_MINOR__:                        Standard Predefined.
-* __GNUG__:                              Standard Predefined.
-* __INCLUDE_LEVEL_:                      Standard Predefined.
-* __LINE__:                              Standard Predefined.
-* __OPTIMIZE__:                          Standard Predefined.
-* __REGISTER_PREFIX__:                   Standard Predefined.
-* __STDC__:                              Standard Predefined.
-* __STDC_VERSION__:                      Standard Predefined.
-* __STRICT_ANSI__:                       Standard Predefined.
-* __TIME__:                              Standard Predefined.
-* __USER_LABEL_PREFIX__:                 Standard Predefined.
-* __VERSION__:                           Standard Predefined.
-* _AM29000:                              Nonstandard Predefined.
-* _AM29K:                                Nonstandard Predefined.
-* BSD:                                   Nonstandard Predefined.
-* defined:                               Conditionals-Macros.
-* M68020:                                Nonstandard Predefined.
-* m68k:                                  Nonstandard Predefined.
-* mc68000:                               Nonstandard Predefined.
-* ns32000:                               Nonstandard Predefined.
-* pyr:                                   Nonstandard Predefined.
-* sequent:                               Nonstandard Predefined.
-* sun:                                   Nonstandard Predefined.
-* system header files:                   Header Uses.
-* unix:                                  Nonstandard Predefined.
-* vax:                                   Nonstandard Predefined.
-
-
diff --git a/gcc/cstamp-h b/gcc/cstamp-h
deleted file mode 100644 (file)
index 8b13789..0000000
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/gcc/fixinc.wrap b/gcc/fixinc.wrap
deleted file mode 100755 (executable)
index 406c87e..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-#! /bin/sh
-# Create wrappers for include files instead of replacing them.
-#
-# This script is designed for systems whose include files can be fixed
-# by creating small wrappers around them.
-# An advantage of this method is that if the system include files are changed
-# (e.g. by OS upgrade), you need not re-run fixincludes.
-#
-# See README-fixinc for more information.
-
-# Directory containing the original header files.
-# (This was named INCLUDES, but that conflicts with a name in Makefile.in.)
-INPUT=${2-${INPUT-/usr/include}}
-
-# Directory in which to store the results.
-LIB=${1?"fixincludes: output directory not specified"}
-
-# Make sure it exists.
-if [ ! -d $LIB ]; then
-  mkdir $LIB || exit 1
-fi
-
-echo Building fixed headers in ${LIB}
-
-# Some math.h files define struct exception, which conflicts with
-# the class exception defined in the C++ file std/stdexcept.h.  We
-# redefine it to __math_exception.  This is not a great fix, but I
-# haven't been able to think of anything better.
-file=math.h
-if [ -r $INPUT/$file ]; then
-  echo Checking $INPUT/$file
-  if grep 'struct exception' $INPUT/$file >/dev/null
-  then
-    echo Fixed $file
-    rm -f $LIB/$file
-    cat <<'__EOF__' >$LIB/$file
-#ifndef _MATH_H_WRAPPER
-#ifdef __cplusplus
-# define exception __math_exception
-#endif
-#include_next <math.h>
-#ifdef __cplusplus
-# undef exception
-#endif
-#define _MATH_H_WRAPPER
-#endif /* _MATH_H_WRAPPER */
-__EOF__
-    # Define _MATH_H_WRAPPER at the end of the wrapper, not the start,
-    # so that if #include_next gets another instance of the wrapper,
-    # this will follow the #include_next chain until we arrive at
-    # the real <math.h>.
-    chmod a+r $LIB/$file
-  fi
-fi
-
-# Avoid the definition of the bool type in the Solaris 2.x curses.h when using
-# g++, since it's now an official type in the C++ language.
-file=curses.h
-if [ -r $INPUT/$file ]; then
-  echo Checking $INPUT/$file
-  w='[  ]'
-  if grep "typedef$w$w*char$w$w*bool$w*;" $INPUT/$file >/dev/null
-  then
-    echo Fixed $file
-    rm -f $LIB/$file
-    cat <<'__EOF__' >$LIB/$file
-#ifndef _CURSES_H_WRAPPER
-#ifdef __cplusplus
-# define bool __curses_bool_t
-#endif
-#include_next <curses.h>
-#ifdef __cplusplus
-# undef bool
-#endif
-#define _CURSES_H_WRAPPER
-#endif /* _CURSES_H_WRAPPER */
-__EOF__
-    # Define _CURSES_H_WRAPPER at the end of the wrapper, not the start,
-    # so that if #include_next gets another instance of the wrapper,
-    # this will follow the #include_next chain until we arrive at
-    # the real <curses.h>.
-    chmod a+r $LIB/$file
-  fi
-fi
-
-exit 0
diff --git a/gcc/future.options b/gcc/future.options
deleted file mode 100644 (file)
index 214be80..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-From: friedman@gnu.ai.mit.edu (Noah Friedman)
-To: roland@gnu.ai.mit.edu (Roland McGrath),
-    rms@gnu.ai.mit.edu (Richard Stallman),
-    jimb@gnu.ai.mit.edu (Jim Blandy),
-    mib@gnu.ai.mit.edu (Michael Bushnell)
-Cc: cgw@sol.acs.unt.edu (chris williams),
-    clc@gnu.ai.mit.edu (Christian Longshore Claiborn)
-Subject: Some gcc options we'd like to see.
-Date: Mon, 28 Jun 93 00:45:09 EST
-Reply-To: friedman@gnu.ai.mit.edu
-
--Waggravate-return
--Wcast-spell
--Wcaste-align
--Win
--Wmissing-protons
--Wredundant-repetitions
--antsy
--fbungee-jump
--fexpensive-operations
--fextra-strength
--fjesus-saves
--fkeep-programmers-inline
--fno-peeping-toms
--fruit-roll-ups
--fshort-enough
--mno-dialogue
--pedophile
--vomit-frame-pointer
diff --git a/gcc/gcc.info b/gcc/gcc.info
deleted file mode 100644 (file)
index e47bfc2..0000000
+++ /dev/null
@@ -1,312 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-Indirect:
-gcc.info-1: 1402
-gcc.info-2: 50964
-gcc.info-3: 96983
-gcc.info-4: 143917
-gcc.info-5: 192350
-gcc.info-6: 225344
-gcc.info-7: 249300
-gcc.info-8: 295618
-gcc.info-9: 344449
-gcc.info-10: 393730
-gcc.info-11: 441350
-gcc.info-12: 491094
-gcc.info-13: 534183
-gcc.info-14: 572713
-gcc.info-15: 622155
-gcc.info-16: 665863
-gcc.info-17: 713227
-gcc.info-18: 751237
-gcc.info-19: 796779
-gcc.info-20: 841999
-gcc.info-21: 891870
-gcc.info-22: 937562
-gcc.info-23: 982612
-gcc.info-24: 1026075
-gcc.info-25: 1072705
-gcc.info-26: 1121544
-gcc.info-27: 1162761
-gcc.info-28: 1187258
-\1f
-Tag Table:
-(Indirect)
-Node: Top\7f1402
-Node: G++ and GCC\7f3216
-Node: Invoking GCC\7f5423
-Node: Option Summary\7f8802
-Node: Overall Options\7f20950
-Node: Invoking G++\7f25513
-Node: C Dialect Options\7f27386
-Node: C++ Dialect Options\7f38688
-Node: Warning Options\7f50964
-Node: Debugging Options\7f68134
-Node: Optimize Options\7f84249
-Node: Preprocessor Options\7f96983
-Node: Assembler Options\7f103446
-Node: Link Options\7f103813
-Node: Directory Options\7f109086
-Node: Target Options\7f112951
-Node: Submodel Options\7f116608
-Node: M680x0 Options\7f118040
-Node: VAX Options\7f122970
-Node: SPARC Options\7f123505
-Node: Convex Options\7f132591
-Node: AMD29K Options\7f134772
-Node: ARM Options\7f137997
-Node: M32R/D Options\7f141571
-Node: M88K Options\7f143917
-Node: RS/6000 and PowerPC Options\7f151867
-Node: RT Options\7f170743
-Node: MIPS Options\7f172447
-Node: i386 Options\7f180547
-Node: HPPA Options\7f185990
-Node: Intel 960 Options\7f189810
-Node: DEC Alpha Options\7f192350
-Node: Clipper Options\7f199428
-Node: H8/300 Options\7f199827
-Node: SH Options\7f200641
-Node: System V Options\7f201237
-Node: V850 Options\7f202046
-Node: Code Gen Options\7f204031
-Node: Environment Variables\7f214892
-Node: Running Protoize\7f219115
-Node: Installation\7f225344
-Node: Configurations\7f249300
-Node: Other Dir\7f287877
-Node: Cross-Compiler\7f289593
-Node: Steps of Cross\7f291424
-Node: Configure Cross\7f292542
-Node: Tools and Libraries\7f293179
-Node: Cross Runtime\7f295618
-Node: Cross Headers\7f299699
-Node: Build Cross\7f301698
-Node: Sun Install\7f303574
-Node: VMS Install\7f305042
-Node: Collect2\7f314971
-Node: Header Dirs\7f317680
-Node: C Extensions\7f319094
-Node: Statement Exprs\7f322450
-Node: Local Labels\7f324344
-Node: Labels as Values\7f326406
-Node: Nested Functions\7f328270
-Node: Constructing Calls\7f332126
-Node: Naming Types\7f334183
-Node: Typeof\7f335277
-Node: Lvalues\7f337142
-Node: Conditionals\7f339582
-Node: Long Long\7f340473
-Node: Complex\7f341913
-Node: Zero Length\7f343775
-Node: Variable Length\7f344449
-Node: Macro Varargs\7f346974
-Node: Subscripting\7f349077
-Node: Pointer Arith\7f349560
-Node: Initializers\7f350125
-Node: Constructors\7f350590
-Node: Labeled Elements\7f352284
-Node: Case Ranges\7f354913
-Node: Cast to Union\7f355594
-Node: Function Attributes\7f356672
-Node: Function Prototypes\7f371569
-Node: C++ Comments\7f373371
-Node: Dollar Signs\7f373907
-Node: Character Escapes\7f374365
-Node: Alignment\7f374652
-Node: Variable Attributes\7f376124
-Node: Type Attributes\7f384657
-Node: Inline\7f393730
-Node: Extended Asm\7f397607
-Node: Asm Labels\7f408173
-Node: Explicit Reg Vars\7f409492
-Node: Global Reg Vars\7f410740
-Node: Local Reg Vars\7f415305
-Node: Alternate Keywords\7f416897
-Node: Incomplete Enums\7f418299
-Node: Function Names\7f419055
-Node: Return Address\7f420329
-Node: C++ Extensions\7f422349
-Node: Naming Results\7f423583
-Node: Min and Max\7f426897
-Node: Destructors and Goto\7f428337
-Node: C++ Interface\7f428813
-Node: Template Instantiation\7f434047
-Node: C++ Signatures\7f441350
-Node: Gcov\7f445694
-Node: Gcov Intro\7f446217
-Node: Invoking Gcov\7f448898
-Node: Gcov and Optimization\7f454509
-Node: Gcov Data Files\7f455933
-Node: Trouble\7f459503
-Node: Actual Bugs\7f461204
-Node: Installation Problems\7f462473
-Node: Cross-Compiler Problems\7f476259
-Node: Interoperation\7f477730
-Node: External Bugs\7f491094
-Node: Incompatibilities\7f493226
-Node: Fixed Headers\7f501776
-Node: Standard Libraries\7f504118
-Node: Disappointments\7f505365
-Node: C++ Misunderstandings\7f509922
-Node: Static Definitions\7f510569
-Node: Temporaries\7f511623
-Node: Protoize Caveats\7f513827
-Node: Non-bugs\7f517783
-Node: Warnings and Errors\7f527210
-Node: Bugs\7f528980
-Node: Bug Criteria\7f530340
-Node: Bug Lists\7f532770
-Node: Bug Reporting\7f534183
-Node: Sending Patches\7f546601
-Node: Service\7f551988
-Node: Contributing\7f552558
-Node: VMS\7f553394
-Node: Include Files and VMS\7f553792
-Node: Global Declarations\7f557682
-Node: VMS Misc\7f561991
-Node: Portability\7f566317
-Node: Interface\7f568080
-Node: Passes\7f572713
-Node: RTL\7f590056
-Node: RTL Objects\7f591944
-Node: Accessors\7f594988
-Node: Flags\7f600314
-Node: Machine Modes\7f609333
-Node: Constants\7f616967
-Node: Regs and Memory\7f622155
-Node: Arithmetic\7f634208
-Node: Comparisons\7f640106
-Node: Bit Fields\7f644169
-Node: Conversions\7f645581
-Node: RTL Declarations\7f648469
-Node: Side Effects\7f649278
-Node: Incdec\7f661825
-Node: Assembler\7f664341
-Node: Insns\7f665863
-Node: Calls\7f688341
-Node: Sharing\7f690936
-Node: Reading RTL\7f694012
-Node: Machine Desc\7f694951
-Node: Patterns\7f696804
-Node: Example\7f699748
-Node: RTL Template\7f700876
-Node: Output Template\7f713227
-Node: Output Statement\7f717209
-Node: Constraints\7f720922
-Node: Simple Constraints\7f721925
-Node: Multi-Alternative\7f733837
-Node: Class Preferences\7f736673
-Node: Modifiers\7f737553
-Node: Machine Constraints\7f741097
-Node: No Constraints\7f750116
-Node: Standard Names\7f751237
-Node: Pattern Ordering\7f783426
-Node: Dependent Patterns\7f784653
-Node: Jump Patterns\7f787468
-Node: Insn Canonicalizations\7f793284
-Node: Peephole Definitions\7f796779
-Node: Expander Definitions\7f803697
-Node: Insn Splitting\7f811143
-Node: Insn Attributes\7f818158
-Node: Defining Attributes\7f819205
-Node: Expressions\7f821217
-Node: Tagging Insns\7f827525
-Node: Attr Example\7f831888
-Node: Insn Lengths\7f834264
-Node: Constant Attributes\7f837628
-Node: Delay Slots\7f838788
-Node: Function Units\7f841999
-Node: Target Macros\7f847669
-Node: Driver\7f849552
-Node: Run-time Target\7f863850
-Node: Storage Layout\7f869736
-Node: Type Layout\7f885097
-Node: Registers\7f891870
-Node: Register Basics\7f892850
-Node: Allocation Order\7f896887
-Node: Values in Registers\7f898305
-Node: Leaf Functions\7f902931
-Node: Stack Registers\7f905406
-Node: Obsolete Register Macros\7f906239
-Node: Register Classes\7f908822
-Node: Stack and Calling\7f928897
-Node: Frame Layout\7f929352
-Node: Stack Checking\7f933982
-Node: Frame Registers\7f937562
-Node: Elimination\7f941977
-Node: Stack Arguments\7f946233
-Node: Register Arguments\7f952841
-Node: Scalar Return\7f962634
-Node: Aggregate Return\7f966872
-Node: Caller Saves\7f970587
-Node: Function Entry\7f971737
-Node: Profiling\7f982612
-Node: Varargs\7f989691
-Node: Trampolines\7f997101
-Node: Library Calls\7f1003819
-Node: Addressing Modes\7f1011877
-Node: Condition Code\7f1019876
-Node: Costs\7f1026075
-Node: Sections\7f1034786
-Node: PIC\7f1040969
-Node: Assembler Format\7f1043679
-Node: File Framework\7f1044745
-Node: Data Output\7f1049443
-Node: Uninitialized Data\7f1056637
-Node: Label Output\7f1062043
-Node: Initialization\7f1072705
-Node: Macros for Initialization\7f1078848
-Node: Instruction Output\7f1083445
-Node: Dispatch Tables\7f1091632
-Node: Exception Region Output\7f1094079
-Node: Alignment Output\7f1097073
-Node: Debugging Info\7f1098821
-Node: All Debuggers\7f1099430
-Node: DBX Options\7f1101875
-Node: DBX Hooks\7f1107158
-Node: File Names and DBX\7f1110798
-Node: SDB and DWARF\7f1112771
-Node: Cross-compilation\7f1114978
-Node: Misc\7f1121544
-Node: Config\7f1139585
-Node: Fragments\7f1147323
-Node: Target Fragment\7f1147922
-Node: Host Fragment\7f1152088
-Node: Funding\7f1152690
-Node: Look and Feel\7f1155184
-Node: Copying\7f1162761
-Node: Contributors\7f1181953
-Node: Index\7f1187258
-\1f
-End Tag Table
diff --git a/gcc/gcc.info-1 b/gcc/gcc.info-1
deleted file mode 100644 (file)
index 12ce102..0000000
+++ /dev/null
@@ -1,1154 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Top,  Next: G++ and GCC,  Up: (DIR)
-
-Introduction
-************
-
-   This manual documents how to run, install and port the GNU compiler,
-as well as its new features and incompatibilities, and how to report
-bugs.  It corresponds to GNU CC version 2.7.2.
-
-* Menu:
-
-
-* G++ and GCC::     You can compile C or C++ programs.
-* Invoking GCC::    Command options supported by `gcc'.
-* Installation::    How to configure, compile and install GNU CC.
-* C Extensions::    GNU extensions to the C language family.
-* C++ Extensions::  GNU extensions to the C++ language.
-* Gcov::           gcov: a GNU CC test coverage program.
-* Trouble::         If you have trouble installing GNU CC.
-* Bugs::            How, why and where to report bugs.
-* Service::         How to find suppliers of support for GNU CC.
-* Contributing::    How to contribute to testing and developing GNU CC.
-* VMS::             Using GNU CC on VMS.
-
-* Portability::     Goals of GNU CC's portability features.
-* Interface::       Function-call interface of GNU CC output.
-* Passes::          Order of passes, what they do, and what each file is for.
-* RTL::             The intermediate representation that most passes work on.
-* Machine Desc::    How to write machine description instruction patterns.
-* Target Macros::   How to write the machine description C macros.
-* Config::          Writing the `xm-MACHINE.h' file.
-* Fragments::       Writing the `t-TARGET' and `x-HOST' files.
-
-* Funding::         How to help assure funding for free software.
-* Look and Feel::   Protect your freedom--fight "look and feel".
-
-* Copying::         GNU General Public License says
-                     how you can copy and share GNU CC.
-* Contributors::    People who have contributed to GNU CC.
-
-* Index::          Index of concepts and symbol names.
-
-\1f
-File: gcc.info,  Node: G++ and GCC,  Next: Invoking GCC,  Prev: Top,  Up: Top
-
-Compile C, C++, or Objective C
-******************************
-
-   The C, C++, and Objective C versions of the compiler are integrated;
-the GNU C compiler can compile programs written in C, C++, or Objective
-C.
-
-   "GCC" is a common shorthand term for the GNU C compiler.  This is
-both the most general name for the compiler, and the name used when the
-emphasis is on compiling C programs.
-
-   When referring to C++ compilation, it is usual to call the compiler
-"G++".  Since there is only one compiler, it is also accurate to call
-it "GCC" no matter what the language context; however, the term "G++"
-is more useful when the emphasis is on compiling C++ programs.
-
-   We use the name "GNU CC" to refer to the compilation system as a
-whole, and more specifically to the language-independent part of the
-compiler.  For example, we refer to the optimization options as
-affecting the behavior of "GNU CC" or sometimes just "the compiler".
-
-   Front ends for other languages, such as Ada 9X, Fortran, Modula-3,
-and Pascal, are under development.  These front-ends, like that for
-C++, are built in subdirectories of GNU CC and link to it.  The result
-is an integrated compiler that can compile programs written in C, C++,
-Objective C, or any of the languages for which you have installed front
-ends.
-
-   In this manual, we only discuss the options for the C, Objective-C,
-and C++ compilers and those of the GNU CC core.  Consult the
-documentation of the other front ends for the options to use when
-compiling programs written in other languages.
-
-   G++ is a *compiler*, not merely a preprocessor.  G++ builds object
-code directly from your C++ program source.  There is no intermediate C
-version of the program.  (By contrast, for example, some other
-implementations use a program that generates a C program from your C++
-source.)  Avoiding an intermediate C representation of the program means
-that you get better object code, and better debugging information.  The
-GNU debugger, GDB, works with this information in the object code to
-give you comprehensive C++ source-level editing capabilities (*note C
-and C++: (gdb.info)C.).
-
-\1f
-File: gcc.info,  Node: Invoking GCC,  Next: Installation,  Prev: G++ and GCC,  Up: Top
-
-GNU CC Command Options
-**********************
-
-   When you invoke GNU CC, it normally does preprocessing, compilation,
-assembly and linking.  The "overall options" allow you to stop this
-process at an intermediate stage.  For example, the `-c' option says
-not to run the linker.  Then the output consists of object files output
-by the assembler.
-
-   Other options are passed on to one stage of processing.  Some options
-control the preprocessor and others the compiler itself.  Yet other
-options control the assembler and linker; most of these are not
-documented here, since you rarely need to use any of them.
-
-   Most of the command line options that you can use with GNU CC are
-useful for C programs; when an option is only useful with another
-language (usually C++), the explanation says so explicitly.  If the
-description for a particular option does not mention a source language,
-you can use that option with all supported languages.
-
-   *Note Compiling C++ Programs: Invoking G++, for a summary of special
-options for compiling C++ programs.
-
-   The `gcc' program accepts options and file names as operands.  Many
-options have multiletter names; therefore multiple single-letter options
-may *not* be grouped: `-dr' is very different from `-d -r'.
-
-   You can mix options and other arguments.  For the most part, the
-order you use doesn't matter.  Order does matter when you use several
-options of the same kind; for example, if you specify `-L' more than
-once, the directories are searched in the order specified.
-
-   Many options have long names starting with `-f' or with `-W'--for
-example, `-fforce-mem', `-fstrength-reduce', `-Wformat' and so on.
-Most of these have both positive and negative forms; the negative form
-of `-ffoo' would be `-fno-foo'.  This manual documents only one of
-these two forms, whichever one is not the default.
-
-* Menu:
-
-* Option Summary::     Brief list of all options, without explanations.
-* Overall Options::     Controlling the kind of output:
-                        an executable, object files, assembler files,
-                        or preprocessed source.
-* Invoking G++::       Compiling C++ programs.
-* C Dialect Options::   Controlling the variant of C language compiled.
-* C++ Dialect Options:: Variations on C++.
-* Warning Options::     How picky should the compiler be?
-* Debugging Options::   Symbol tables, measurements, and debugging dumps.
-* Optimize Options::    How much optimization?
-* Preprocessor Options:: Controlling header files and macro definitions.
-                         Also, getting dependency information for Make.
-* Assembler Options::   Passing options to the assembler.
-* Link Options::        Specifying libraries and so on.
-* Directory Options::   Where to find header files and libraries.
-                        Where to find the compiler executable files.
-* Target Options::      Running a cross-compiler, or an old version of GNU CC.
-* Submodel Options::    Specifying minor hardware or convention variations,
-                        such as 68010 vs 68020.
-* Code Gen Options::    Specifying conventions for function calls, data layout
-                        and register usage.
-* Environment Variables:: Env vars that affect GNU CC.
-* Running Protoize::    Automatically adding or removing function prototypes.
-
-\1f
-File: gcc.info,  Node: Option Summary,  Next: Overall Options,  Up: Invoking GCC
-
-Option Summary
-==============
-
-   Here is a summary of all the options, grouped by type.  Explanations
-are in the following sections.
-
-*Overall Options*
-     *Note Options Controlling the Kind of Output: Overall Options.
-          -c  -S  -E  -o FILE  -pipe  -v  -x LANGUAGE
-
-*C Language Options*
-     *Note Options Controlling C Dialect: C Dialect Options.
-          -ansi  -fallow-single-precision  -fcond-mismatch  -fno-asm
-          -fno-builtin  -ffreestanding  -fhosted  -fsigned-bitfields  -fsigned-char
-          -funsigned-bitfields  -funsigned-char  -fwritable-strings
-          -traditional  -traditional-cpp  -trigraphs
-
-*C++ Language Options*
-     *Note Options Controlling C++ Dialect: C++ Dialect Options.
-          -fall-virtual  -fdollars-in-identifiers  -felide-constructors
-          -fenum-int-equiv  -fexternal-templates  -ffor-scope  -fno-for-scope
-          -fhandle-signatures  -fmemoize-lookups  -fname-mangling-version-N
-          -fno-default-inline  -fno-gnu-keywords -fnonnull-objects -fguiding-decls
-          -foperator-names  -fstrict-prototype  -fthis-is-variable
-          -ftemplate-depth-N  -nostdinc++  -traditional  +eN
-
-*Warning Options*
-     *Note Options to Request or Suppress Warnings: Warning Options.
-          -fsyntax-only  -pedantic  -pedantic-errors
-          -w  -W  -Wall  -Waggregate-return  -Wbad-function-cast
-          -Wcast-align  -Wcast-qual  -Wchar-subscript  -Wcomment
-          -Wconversion  -Werror  -Wformat
-          -Wid-clash-LEN  -Wimplicit -Wimplicit-int
-          -Wimplicit-function-declarations -Wimport  -Winline
-          -Wlarger-than-LEN  -Wmain  -Wmissing-declarations
-          -Wmissing-prototypes  -Wnested-externs
-          -Wno-import  -Woverloaded-virtual  -Wparentheses
-          -Wpointer-arith  -Wredundant-decls  -Wreorder  -Wreturn-type  -Wshadow
-          -Wsign-compare  -Wstrict-prototypes  -Wswitch  -Wsynth
-          -Wtemplate-debugging  -Wtraditional  -Wtrigraphs
-          -Wundef  -Wuninitialized  -Wunused  -Wwrite-strings
-
-*Debugging Options*
-     *Note Options for Debugging Your Program or GCC: Debugging Options.
-          -a  -ax  -dLETTERS  -fpretend-float
-          -fprofile-arcs  -ftest-coverage
-          -g  -gLEVEL  -gcoff  -gdwarf  -gdwarf-1  -gdwarf-1+  -gdwarf-2
-          -ggdb  -gstabs  -gstabs+  -gxcoff  -gxcoff+
-          -p  -pg  -print-file-name=LIBRARY  -print-libgcc-file-name
-          -print-prog-name=PROGRAM  -print-search-dirs  -save-temps
-
-*Optimization Options*
-     *Note Options that Control Optimization: Optimize Options.
-          -fbranch-probabilities
-          -fcaller-saves  -fcse-follow-jumps  -fcse-skip-blocks
-          -fdelayed-branch   -fexpensive-optimizations
-          -ffast-math  -ffloat-store  -fforce-addr  -fforce-mem
-          -ffunction-sections  -finline-functions
-          -fkeep-inline-functions  -fno-default-inline
-          -fno-defer-pop  -fno-function-cse
-          -fno-inline  -fno-peephole  -fomit-frame-pointer
-          -frerun-cse-after-loop  -fschedule-insns
-          -fschedule-insns2  -fstrength-reduce  -fthread-jumps
-          -funroll-all-loops  -funroll-loops
-          -O  -O0  -O1  -O2  -O3
-
-*Preprocessor Options*
-     *Note Options Controlling the Preprocessor: Preprocessor Options.
-          -AQUESTION(ANSWER)  -C  -dD  -dM  -dN
-          -DMACRO[=DEFN]  -E  -H
-          -idirafter DIR
-          -include FILE  -imacros FILE
-          -iprefix FILE  -iwithprefix DIR
-          -iwithprefixbefore DIR  -isystem DIR
-          -M  -MD  -MM  -MMD  -MG  -nostdinc  -P  -trigraphs
-          -undef  -UMACRO  -Wp,OPTION
-
-*Assembler Option*
-     *Note Passing Options to the Assembler: Assembler Options.
-          -Wa,OPTION
-
-*Linker Options*
-     *Note Options for Linking: Link Options.
-          OBJECT-FILE-NAME  -lLIBRARY
-          -nostartfiles  -nodefaultlibs  -nostdlib
-          -s  -static  -shared  -symbolic
-          -Wl,OPTION  -Xlinker OPTION
-          -u SYMBOL
-
-*Directory Options*
-     *Note Options for Directory Search: Directory Options.
-          -BPREFIX  -IDIR  -I-  -LDIR  -specs=FILE
-
-*Target Options*
-     *Note Target Options::.
-          -b MACHINE  -V VERSION
-
-*Machine Dependent Options*
-     *Note Hardware Models and Configurations: Submodel Options.
-          *M680x0 Options*
-          -m68000  -m68020  -m68020-40  -m68020-60  -m68030  -m68040
-          -m68060  -m5200  -m68881  -mbitfield  -mc68000  -mc68020  -mfpa
-          -mnobitfield  -mrtd  -mshort  -msoft-float  -malign-int
-          
-          *VAX Options*
-          -mg  -mgnu  -munix
-          
-          *SPARC Options*
-          -mcpu=CPU TYPE
-          -mtune=CPU TYPE
-          -mcmodel=CODE MODEL
-          -malign-jumps=NUM  -malign-loops=NUM
-          -malign-functions=NUM
-          -m32  -m64
-          -mapp-regs  -mbroken-saverestore  -mcypress  -mepilogue
-          -mflat  -mfpu  -mhard-float  -mhard-quad-float
-          -mimpure-text  -mlive-g0  -mno-app-regs  -mno-epilogue
-          -mno-flat  -mno-fpu  -mno-impure-text
-          -mno-stack-bias  -mno-unaligned-doubles
-          -msoft-float  -msoft-quad-float  -msparclite  -mstack-bias
-          -msupersparc  -munaligned-doubles  -mv8
-          
-          *Convex Options*
-          -mc1  -mc2  -mc32  -mc34  -mc38
-          -margcount  -mnoargcount
-          -mlong32  -mlong64
-          -mvolatile-cache  -mvolatile-nocache
-          
-          *AMD29K Options*
-          -m29000  -m29050  -mbw  -mnbw  -mdw  -mndw
-          -mlarge  -mnormal  -msmall
-          -mkernel-registers  -mno-reuse-arg-regs
-          -mno-stack-check  -mno-storem-bug
-          -mreuse-arg-regs  -msoft-float  -mstack-check
-          -mstorem-bug  -muser-registers
-          
-          *ARM Options*
-          -mapcs-frame  -mapcs-26  -mapcs-32
-          -mlittle-endian  -mbig-endian  -mwords-little-endian
-          -mshort-load-bytes  -mno-short-load-bytes
-          -msoft-float  -mhard-float
-          -mbsd  -mxopen  -mno-symrename
-          
-          *M32R/D Options*
-          -mcode-model=MODEL TYPE  -msdata=SDATA TYPE
-          -G NUM
-          
-          *M88K Options*
-          -m88000  -m88100  -m88110  -mbig-pic
-          -mcheck-zero-division  -mhandle-large-shift
-          -midentify-revision  -mno-check-zero-division
-          -mno-ocs-debug-info  -mno-ocs-frame-position
-          -mno-optimize-arg-area  -mno-serialize-volatile
-          -mno-underscores  -mocs-debug-info
-          -mocs-frame-position  -moptimize-arg-area
-          -mserialize-volatile  -mshort-data-NUM  -msvr3
-          -msvr4  -mtrap-large-shift  -muse-div-instruction
-          -mversion-03.00  -mwarn-passed-structs
-          
-          *RS/6000 and PowerPC Options*
-          -mcpu=CPU TYPE
-          -mtune=CPU TYPE
-          -mpower  -mno-power  -mpower2  -mno-power2
-          -mpowerpc  -mno-powerpc
-          -mpowerpc-gpopt  -mno-powerpc-gpopt
-          -mpowerpc-gfxopt  -mno-powerpc-gfxopt
-          -mnew-mnemonics  -mno-new-mnemonics
-          -mfull-toc   -mminimal-toc  -mno-fop-in-toc  -mno-sum-in-toc
-          -mxl-call  -mno-xl-call  -mthreads  -mpe
-          -msoft-float  -mhard-float  -mmultiple  -mno-multiple
-          -mstring  -mno-string  -mupdate  -mno-update
-          -mfused-madd  -mno-fused-madd  -mbit-align  -mno-bit-align
-          -mstrict-align  -mno-strict-align  -mrelocatable
-          -mno-relocatable  -mrelocatable-lib  -mno-relocatable-lib
-          -mtoc  -mno-toc  -mtraceback  -mno-traceback
-          -mlittle  -mlittle-endian  -mbig  -mbig-endian
-          -mcall-aix  -mcall-sysv  -mprototype  -mno-prototype
-          -msim  -mmvme  -mads  -myellowknife  -memb
-          -msdata  -msdata=OPT  -G NUM
-          
-          *RT Options*
-          -mcall-lib-mul  -mfp-arg-in-fpregs  -mfp-arg-in-gregs
-          -mfull-fp-blocks  -mhc-struct-return  -min-line-mul
-          -mminimum-fp-blocks  -mnohc-struct-return
-          
-          *MIPS Options*
-          -mabicalls  -mcpu=CPU TYPE  -membedded-data
-          -membedded-pic  -mfp32  -mfp64  -mgas  -mgp32  -mgp64
-          -mgpopt  -mhalf-pic  -mhard-float  -mint64  -mips1
-          -mips2  -mips3  -mlong64  -mlong-calls  -mmemcpy
-          -mmips-as  -mmips-tfile  -mno-abicalls
-          -mno-embedded-data  -mno-embedded-pic
-          -mno-gpopt  -mno-long-calls
-          -mno-memcpy  -mno-mips-tfile  -mno-rnames  -mno-stats
-          -mrnames  -msoft-float
-          -m4650  -msingle-float  -mmad
-          -mstats  -EL  -EB  -G NUM  -nocpp
-          
-          *i386 Options*
-          -m486  -m386  -mieee-fp  -mno-fancy-math-387
-          -mno-fp-ret-in-387  -msoft-float  -msvr3-shlib
-          -mno-wide-multiply  -mrtd  -malign-double
-          -mreg-alloc=LIST  -mregparm=NUM
-          -malign-jumps=NUM  -malign-loops=NUM
-          -malign-functions=NUM
-          
-          *HPPA Options*
-          -mbig-switch  -mdisable-fpregs  -mdisable-indexing  -mfast-indirect-calls
-          -mgas  -mjump-in-delay  -mlong-load-store  -mno-big-switch  -mno-disable-fpregs
-          -mno-disable-indexing  -mno-fast-indirect-calls  -mno-gas
-          -mno-jump-in-delay
-          -mno-long-load-store
-          -mno-portable-runtime  -mno-soft-float  -mno-space  -mno-space-regs
-          -msoft-float
-          -mpa-risc-1-0  -mpa-risc-1-1  -mportable-runtime
-          -mschedule=LIST  -mspace  -mspace-regs
-          
-          *Intel 960 Options*
-          -mCPU TYPE  -masm-compat  -mclean-linkage
-          -mcode-align  -mcomplex-addr  -mleaf-procedures
-          -mic-compat  -mic2.0-compat  -mic3.0-compat
-          -mintel-asm  -mno-clean-linkage  -mno-code-align
-          -mno-complex-addr  -mno-leaf-procedures
-          -mno-old-align  -mno-strict-align  -mno-tail-call
-          -mnumerics  -mold-align  -msoft-float  -mstrict-align
-          -mtail-call
-          
-          *DEC Alpha Options*
-          -mfp-regs  -mno-fp-regs
-          -mno-soft-float  -msoft-float
-          -mieee  -mieee-with-inexact  -mieee-conformant
-          -mfp-trap-mode  -mfp-rounding-mode  -mtrap-precision
-          -mbuild-constants
-          
-          *Clipper Options*
-          -mc300  -mc400
-          
-          *H8/300 Options*
-          -mrelax  -mh -ms -mint32  -malign-300
-          
-          *SH Options*
-          -m1  -m2  -m3  -m3e  -mb  -ml  -mrelax
-          
-          *System V Options*
-          -Qy  -Qn  -YP,PATHS  -Ym,DIR
-          
-          *V850 Options*
-          -mlong-calls -mno-long-calls -mep -mno-ep
-          -mprolog-function -mno-prolog-function -mspace
-          -mtda=N -msda=N -mzda=N
-          -mv850 -mbig-switch
-
-*Code Generation Options*
-     *Note Options for Code Generation Conventions: Code Gen Options.
-          -fcall-saved-REG  -fcall-used-REG
-          -ffixed-REG  -finhibit-size-directive
-          -fcheck-memory-usage  -fprefix-function-name
-          -fno-common  -fno-ident  -fno-gnu-linker
-          -fpcc-struct-return  -fpic  -fPIC
-          -freg-struct-return  -fshared-data  -fshort-enums
-          -fshort-double  -fvolatile  -fvolatile-global
-          -fverbose-asm  -fpack-struct  -fstack-check  +e0  +e1
-
-* Menu:
-
-* Overall Options::     Controlling the kind of output:
-                        an executable, object files, assembler files,
-                        or preprocessed source.
-* C Dialect Options::   Controlling the variant of C language compiled.
-* C++ Dialect Options:: Variations on C++.
-* Warning Options::     How picky should the compiler be?
-* Debugging Options::   Symbol tables, measurements, and debugging dumps.
-* Optimize Options::    How much optimization?
-* Preprocessor Options:: Controlling header files and macro definitions.
-                         Also, getting dependency information for Make.
-* Assembler Options::   Passing options to the assembler.
-* Link Options::        Specifying libraries and so on.
-* Directory Options::   Where to find header files and libraries.
-                        Where to find the compiler executable files.
-* Target Options::      Running a cross-compiler, or an old version of GNU CC.
-
-\1f
-File: gcc.info,  Node: Overall Options,  Next: Invoking G++,  Prev: Option Summary,  Up: Invoking GCC
-
-Options Controlling the Kind of Output
-======================================
-
-   Compilation can involve up to four stages: preprocessing, compilation
-proper, assembly and linking, always in that order.  The first three
-stages apply to an individual source file, and end by producing an
-object file; linking combines all the object files (those newly
-compiled, and those specified as input) into an executable file.
-
-   For any given input file, the file name suffix determines what kind
-of compilation is done:
-
-`FILE.c'
-     C source code which must be preprocessed.
-
-`FILE.i'
-     C source code which should not be preprocessed.
-
-`FILE.ii'
-     C++ source code which should not be preprocessed.
-
-`FILE.m'
-     Objective-C source code.  Note that you must link with the library
-     `libobjc.a' to make an Objective-C program work.
-
-`FILE.h'
-     C header file (not to be compiled or linked).
-
-`FILE.cc'
-`FILE.cxx'
-`FILE.cpp'
-`FILE.C'
-     C++ source code which must be preprocessed.  Note that in `.cxx',
-     the last two letters must both be literally `x'.  Likewise, `.C'
-     refers to a literal capital C.
-
-`FILE.s'
-     Assembler code.
-
-`FILE.S'
-     Assembler code which must be preprocessed.
-
-`OTHER'
-     An object file to be fed straight into linking.  Any file name
-     with no recognized suffix is treated this way.
-
-   You can specify the input language explicitly with the `-x' option:
-
-`-x LANGUAGE'
-     Specify explicitly the LANGUAGE for the following input files
-     (rather than letting the compiler choose a default based on the
-     file name suffix).  This option applies to all following input
-     files until the next `-x' option.  Possible values for LANGUAGE
-     are:
-          c  objective-c  c++
-          c-header  cpp-output  c++-cpp-output
-          assembler  assembler-with-cpp
-
-`-x none'
-     Turn off any specification of a language, so that subsequent files
-     are handled according to their file name suffixes (as they are if
-     `-x' has not been used at all).
-
-   If you only want some of the stages of compilation, you can use `-x'
-(or filename suffixes) to tell `gcc' where to start, and one of the
-options `-c', `-S', or `-E' to say where `gcc' is to stop.  Note that
-some combinations (for example, `-x cpp-output -E' instruct `gcc' to do
-nothing at all.
-
-`-c'
-     Compile or assemble the source files, but do not link.  The linking
-     stage simply is not done.  The ultimate output is in the form of an
-     object file for each source file.
-
-     By default, the object file name for a source file is made by
-     replacing the suffix `.c', `.i', `.s', etc., with `.o'.
-
-     Unrecognized input files, not requiring compilation or assembly,
-     are ignored.
-
-`-S'
-     Stop after the stage of compilation proper; do not assemble.  The
-     output is in the form of an assembler code file for each
-     non-assembler input file specified.
-
-     By default, the assembler file name for a source file is made by
-     replacing the suffix `.c', `.i', etc., with `.s'.
-
-     Input files that don't require compilation are ignored.
-
-`-E'
-     Stop after the preprocessing stage; do not run the compiler
-     proper.  The output is in the form of preprocessed source code,
-     which is sent to the standard output.
-
-     Input files which don't require preprocessing are ignored.
-
-`-o FILE'
-     Place output in file FILE.  This applies regardless to whatever
-     sort of output is being produced, whether it be an executable file,
-     an object file, an assembler file or preprocessed C code.
-
-     Since only one output file can be specified, it does not make
-     sense to use `-o' when compiling more than one input file, unless
-     you are producing an executable file as output.
-
-     If `-o' is not specified, the default is to put an executable file
-     in `a.out', the object file for `SOURCE.SUFFIX' in `SOURCE.o', its
-     assembler file in `SOURCE.s', and all preprocessed C source on
-     standard output.
-
-`-v'
-     Print (on standard error output) the commands executed to run the
-     stages of compilation.  Also print the version number of the
-     compiler driver program and of the preprocessor and the compiler
-     proper.
-
-`-pipe'
-     Use pipes rather than temporary files for communication between the
-     various stages of compilation.  This fails to work on some systems
-     where the assembler is unable to read from a pipe; but the GNU
-     assembler has no trouble.
-
-\1f
-File: gcc.info,  Node: Invoking G++,  Next: C Dialect Options,  Prev: Overall Options,  Up: Invoking GCC
-
-Compiling C++ Programs
-======================
-
-   C++ source files conventionally use one of the suffixes `.C', `.cc',
-`cpp', or `.cxx'; preprocessed C++ files use the suffix `.ii'.  GNU CC
-recognizes files with these names and compiles them as C++ programs
-even if you call the compiler the same way as for compiling C programs
-(usually with the name `gcc').
-
-   However, C++ programs often require class libraries as well as a
-compiler that understands the C++ language--and under some
-circumstances, you might want to compile programs from standard input,
-or otherwise without a suffix that flags them as C++ programs.  `g++'
-is a program that calls GNU CC with the default language set to C++,
-and automatically specifies linking against the GNU class library
-libg++.  (1) On many systems, the script `g++' is also installed with
-the name `c++'.
-
-   When you compile C++ programs, you may specify many of the same
-command-line options that you use for compiling programs in any
-language; or command-line options meaningful for C and related
-languages; or options that are meaningful only for C++ programs.  *Note
-Options Controlling C Dialect: C Dialect Options, for explanations of
-options for languages related to C.  *Note Options Controlling C++
-Dialect: C++ Dialect Options, for explanations of options that are
-meaningful only for C++ programs.
-
-   ---------- Footnotes ----------
-
-   (1) Prior to release 2 of the compiler, there was a separate `g++'
-compiler.  That version was based on GNU CC, but not integrated with
-it.  Versions of `g++' with a `1.XX' version number--for example, `g++'
-version 1.37 or 1.42--are much less reliable than the versions
-integrated with GCC 2.  Moreover, combining G++ `1.XX' with a version 2
-GCC will simply not work.
-
-\1f
-File: gcc.info,  Node: C Dialect Options,  Next: C++ Dialect Options,  Prev: Invoking G++,  Up: Invoking GCC
-
-Options Controlling C Dialect
-=============================
-
-   The following options control the dialect of C (or languages derived
-from C, such as C++ and Objective C) that the compiler accepts:
-
-`-ansi'
-     Support all ANSI standard C programs.
-
-     This turns off certain features of GNU C that are incompatible
-     with ANSI C, such as the `asm', `inline' and `typeof' keywords, and
-     predefined macros such as `unix' and `vax' that identify the type
-     of system you are using.  It also enables the undesirable and
-     rarely used ANSI trigraph feature, and it disables recognition of
-     C++ style `//' comments.
-
-     The alternate keywords `__asm__', `__extension__', `__inline__'
-     and `__typeof__' continue to work despite `-ansi'.  You would not
-     want to use them in an ANSI C program, of course, but it is useful
-     to put them in header files that might be included in compilations
-     done with `-ansi'.  Alternate predefined macros such as `__unix__'
-     and `__vax__' are also available, with or without `-ansi'.
-
-     The `-ansi' option does not cause non-ANSI programs to be rejected
-     gratuitously.  For that, `-pedantic' is required in addition to
-     `-ansi'.  *Note Warning Options::.
-
-     The macro `__STRICT_ANSI__' is predefined when the `-ansi' option
-     is used.  Some header files may notice this macro and refrain from
-     declaring certain functions or defining certain macros that the
-     ANSI standard doesn't call for; this is to avoid interfering with
-     any programs that might use these names for other things.
-
-     The functions `alloca', `abort', `exit', and `_exit' are not
-     builtin functions when `-ansi' is used.
-
-`-fno-asm'
-     Do not recognize `asm', `inline' or `typeof' as a keyword, so that
-     code can use these words as identifiers.  You can use the keywords
-     `__asm__', `__inline__' and `__typeof__' instead.  `-ansi' implies
-     `-fno-asm'.
-
-     In C++, this switch only affects the `typeof' keyword, since `asm'
-     and `inline' are standard keywords.  You may want to use the
-     `-fno-gnu-keywords' flag instead, as it also disables the other,
-     C++-specific, extension keywords such as `headof'.
-
-`-fno-builtin'
-     Don't recognize builtin functions that do not begin with two
-     leading underscores.  Currently, the functions affected include
-     `abort', `abs', `alloca', `cos', `exit', `fabs', `ffs', `labs',
-     `memcmp', `memcpy', `sin', `sqrt', `strcmp', `strcpy', and
-     `strlen'.
-
-     GCC normally generates special code to handle certain builtin
-     functions more efficiently; for instance, calls to `alloca' may
-     become single instructions that adjust the stack directly, and
-     calls to `memcpy' may become inline copy loops.  The resulting
-     code is often both smaller and faster, but since the function
-     calls no longer appear as such, you cannot set a breakpoint on
-     those calls, nor can you change the behavior of the functions by
-     linking with a different library.
-
-     The `-ansi' option prevents `alloca' and `ffs' from being builtin
-     functions, since these functions do not have an ANSI standard
-     meaning.
-
-`-fhosted'
-     Assert that compilation takes place in a hosted environment.  This
-     implies `-fbuiltin'.  A hosted environment is one in which the
-     entire standard library is available, and in which `main' has a
-     return type of `int'.  Examples are nearly everything except a
-     kernel.  This is equivalent to `-fno-freestanding'.
-
-`-ffreestanding'
-     Assert that compilation takes place in a freestanding environment.
-     This implies `-fno-builtin'.  A freestanding environment is one
-     in which the standard library may not exist, and program startup
-     may not necessarily be at `main'.  The most obvious example is an
-     OS kernel.  This is equivalent to `-fno-hosted'.
-
-`-trigraphs'
-     Support ANSI C trigraphs.  You don't want to know about this
-     brain-damage.  The `-ansi' option implies `-trigraphs'.
-
-`-traditional'
-     Attempt to support some aspects of traditional C compilers.
-     Specifically:
-
-        * All `extern' declarations take effect globally even if they
-          are written inside of a function definition.  This includes
-          implicit declarations of functions.
-
-        * The newer keywords `typeof', `inline', `signed', `const' and
-          `volatile' are not recognized.  (You can still use the
-          alternative keywords such as `__typeof__', `__inline__', and
-          so on.)
-
-        * Comparisons between pointers and integers are always allowed.
-
-        * Integer types `unsigned short' and `unsigned char' promote to
-          `unsigned int'.
-
-        * Out-of-range floating point literals are not an error.
-
-        * Certain constructs which ANSI regards as a single invalid
-          preprocessing number, such as `0xe-0xd', are treated as
-          expressions instead.
-
-        * String "constants" are not necessarily constant; they are
-          stored in writable space, and identical looking constants are
-          allocated separately.  (This is the same as the effect of
-          `-fwritable-strings'.)
-
-        * All automatic variables not declared `register' are preserved
-          by `longjmp'.  Ordinarily, GNU C follows ANSI C: automatic
-          variables not declared `volatile' may be clobbered.
-
-        * The character escape sequences `\x' and `\a' evaluate as the
-          literal characters `x' and `a' respectively.  Without
-          `-traditional', `\x' is a prefix for the hexadecimal
-          representation of a character, and `\a' produces a bell.
-
-        * In C++ programs, assignment to `this' is permitted with
-          `-traditional'.  (The option `-fthis-is-variable' also has
-          this effect.)
-
-     You may wish to use `-fno-builtin' as well as `-traditional' if
-     your program uses names that are normally GNU C builtin functions
-     for other purposes of its own.
-
-     You cannot use `-traditional' if you include any header files that
-     rely on ANSI C features.  Some vendors are starting to ship
-     systems with ANSI C header files and you cannot use `-traditional'
-     on such systems to compile files that include any system headers.
-
-     The `-traditional' option also enables the `-traditional-cpp'
-     option, which is described next.
-
-`-traditional-cpp'
-     Attempt to support some aspects of traditional C preprocessors.
-     Specifically:
-
-        * Comments convert to nothing at all, rather than to a space.
-          This allows traditional token concatenation.
-
-        * In a preprocessing directive, the `#' symbol must appear as
-          the first character of a line.
-
-        * Macro arguments are recognized within string constants in a
-          macro definition (and their values are stringified, though
-          without additional quote marks, when they appear in such a
-          context).  The preprocessor always considers a string
-          constant to end at a newline.
-
-        * The predefined macro `__STDC__' is not defined when you use
-          `-traditional', but `__GNUC__' is (since the GNU extensions
-          which `__GNUC__' indicates are not affected by
-          `-traditional').  If you need to write header files that work
-          differently depending on whether `-traditional' is in use, by
-          testing both of these predefined macros you can distinguish
-          four situations: GNU C, traditional GNU C, other ANSI C
-          compilers, and other old C compilers.  The predefined macro
-          `__STDC_VERSION__' is also not defined when you use
-          `-traditional'.  *Note Standard Predefined Macros:
-          (cpp.info)Standard Predefined, for more discussion of these
-          and other predefined macros.
-
-        * The preprocessor considers a string constant to end at a
-          newline (unless the newline is escaped with `\').  (Without
-          `-traditional', string constants can contain the newline
-          character as typed.)
-
-`-fcond-mismatch'
-     Allow conditional expressions with mismatched types in the second
-     and third arguments.  The value of such an expression is void.
-
-`-funsigned-char'
-     Let the type `char' be unsigned, like `unsigned char'.
-
-     Each kind of machine has a default for what `char' should be.  It
-     is either like `unsigned char' by default or like `signed char' by
-     default.
-
-     Ideally, a portable program should always use `signed char' or
-     `unsigned char' when it depends on the signedness of an object.
-     But many programs have been written to use plain `char' and expect
-     it to be signed, or expect it to be unsigned, depending on the
-     machines they were written for.  This option, and its inverse, let
-     you make such a program work with the opposite default.
-
-     The type `char' is always a distinct type from each of `signed
-     char' or `unsigned char', even though its behavior is always just
-     like one of those two.
-
-`-fsigned-char'
-     Let the type `char' be signed, like `signed char'.
-
-     Note that this is equivalent to `-fno-unsigned-char', which is the
-     negative form of `-funsigned-char'.  Likewise, the option
-     `-fno-signed-char' is equivalent to `-funsigned-char'.
-
-     You may wish to use `-fno-builtin' as well as `-traditional' if
-     your program uses names that are normally GNU C builtin functions
-     for other purposes of its own.
-
-     You cannot use `-traditional' if you include any header files that
-     rely on ANSI C features.  Some vendors are starting to ship
-     systems with ANSI C header files and you cannot use `-traditional'
-     on such systems to compile files that include any system headers.
-
-`-fsigned-bitfields'
-`-funsigned-bitfields'
-`-fno-signed-bitfields'
-`-fno-unsigned-bitfields'
-     These options control whether a bitfield is signed or unsigned,
-     when the declaration does not use either `signed' or `unsigned'.
-     By default, such a bitfield is signed, because this is consistent:
-     the basic integer types such as `int' are signed types.
-
-     However, when `-traditional' is used, bitfields are all unsigned
-     no matter what.
-
-`-fwritable-strings'
-     Store string constants in the writable data segment and don't
-     uniquize them.  This is for compatibility with old programs which
-     assume they can write into string constants.  The option
-     `-traditional' also has this effect.
-
-     Writing into string constants is a very bad idea; "constants"
-     should be constant.
-
-`-fallow-single-precision'
-     Do not promote single precision math operations to double
-     precision, even when compiling with `-traditional'.
-
-     Traditional K&R C promotes all floating point operations to double
-     precision, regardless of the sizes of the operands.   On the
-     architecture for which you are compiling, single precision may be
-     faster than double precision.   If you must use `-traditional',
-     but want to use single precision operations when the operands are
-     single precision, use this option.   This option has no effect
-     when compiling with ANSI or GNU C conventions (the default).
-
-\1f
-File: gcc.info,  Node: C++ Dialect Options,  Next: Warning Options,  Prev: C Dialect Options,  Up: Invoking GCC
-
-Options Controlling C++ Dialect
-===============================
-
-   This section describes the command-line options that are only
-meaningful for C++ programs; but you can also use most of the GNU
-compiler options regardless of what language your program is in.  For
-example, you might compile a file `firstClass.C' like this:
-
-     g++ -g -felide-constructors -O -c firstClass.C
-
-In this example, only `-felide-constructors' is an option meant only
-for C++ programs; you can use the other options with any language
-supported by GNU CC.
-
-   Here is a list of options that are *only* for compiling C++ programs:
-
-`-fno-access-control'
-     Turn off all access checking.  This switch is mainly useful for
-     working around bugs in the access control code.
-
-`-fall-virtual'
-     Treat all possible member functions as virtual, implicitly.  All
-     member functions (except for constructor functions and `new' or
-     `delete' member operators) are treated as virtual functions of the
-     class where they appear.
-
-     This does not mean that all calls to these member functions will
-     be made through the internal table of virtual functions.  Under
-     some circumstances, the compiler can determine that a call to a
-     given virtual function can be made directly; in these cases the
-     calls are direct in any case.
-
-`-fcheck-new'
-     Check that the pointer returned by `operator new' is non-null
-     before attempting to modify the storage allocated.  The current
-     Working Paper requires that `operator new' never return a null
-     pointer, so this check is normally unnecessary.
-
-`-fconserve-space'
-     Put uninitialized or runtime-initialized global variables into the
-     common segment, as C does.  This saves space in the executable at
-     the cost of not diagnosing duplicate definitions.  If you compile
-     with this flag and your program mysteriously crashes after
-     `main()' has completed, you may have an object that is being
-     destroyed twice because two definitions were merged.
-
-`-fdollars-in-identifiers'
-     Accept `$' in identifiers.  You can also explicitly prohibit use of
-     `$' with the option `-fno-dollars-in-identifiers'.  (GNU C allows
-     `$' by default on most target systems, but there are a few
-     exceptions.)  Traditional C allowed the character `$' to form part
-     of identifiers.  However, ANSI C and C++ forbid `$' in identifiers.
-
-`-fenum-int-equiv'
-     Anachronistically permit implicit conversion of `int' to
-     enumeration types.  Current C++ allows conversion of `enum' to
-     `int', but not the other way around.
-
-`-fexternal-templates'
-     Cause template instantiations to obey `#pragma interface' and
-     `implementation'; template instances are emitted or not according
-     to the location of the template definition.  *Note Template
-     Instantiation::, for more information.
-
-     This option is deprecated.
-
-`-falt-external-templates'
-     Similar to -fexternal-templates, but template instances are
-     emitted or not according to the place where they are first
-     instantiated.  *Note Template Instantiation::, for more
-     information.
-
-     This option is deprecated.
-
-`-ffor-scope'
-`-fno-for-scope'
-     If -ffor-scope is specified, the scope of variables declared in a
-     for-init-statement is limited to the `for' loop itself, as
-     specified by the draft C++ standard.  If -fno-for-scope is
-     specified, the scope of variables declared in a for-init-statement
-     extends to the end of the enclosing scope, as was the case in old
-     versions of gcc, and other (traditional) implementations of C++.
-
-     The default if neither flag is given to follow the standard, but
-     to allow and give a warning for old-style code that would
-     otherwise be invalid, or have different behavior.
-
-`-fno-gnu-keywords'
-     Do not recognize `classof', `headof', `signature', `sigof' or
-     `typeof' as a keyword, so that code can use these words as
-     identifiers.  You can use the keywords `__classof__',
-     `__headof__', `__signature__', `__sigof__', and `__typeof__'
-     instead.  `-ansi' implies `-fno-gnu-keywords'.
-
-`-fguiding-decls'
-     Treat a function declaration with the same type as a potential
-     function template instantiation as though it declares that
-     instantiation, not a normal function.  If a definition is given
-     for the function later in the translation unit (or another
-     translation unit if the target supports weak symbols), that
-     definition will be used; otherwise the template will be
-     instantiated.  This behavior reflects the C++ language prior to
-     September 1996, when guiding declarations were removed.
-
-     This option implies `-fname-mangling-version-0', and will not work
-     with other name mangling versions.
-
-`-fno-implicit-templates'
-     Never emit code for templates which are instantiated implicitly
-     (i.e. by use); only emit code for explicit instantiations.  *Note
-     Template Instantiation::, for more information.
-
-`-fhandle-signatures'
-     Recognize the `signature' and `sigof' keywords for specifying
-     abstract types.  The default (`-fno-handle-signatures') is not to
-     recognize them.  *Note Type Abstraction using Signatures: C++
-     Signatures.
-
-`-fhuge-objects'
-     Support virtual function calls for objects that exceed the size
-     representable by a `short int'.  Users should not use this flag by
-     default; if you need to use it, the compiler will tell you so.  If
-     you compile any of your code with this flag, you must compile
-     *all* of your code with this flag (including libg++, if you use
-     it).
-
-     This flag is not useful when compiling with -fvtable-thunks.
-
-`-fno-implement-inlines'
-     To save space, do not emit out-of-line copies of inline functions
-     controlled by `#pragma implementation'.  This will cause linker
-     errors if these functions are not inlined everywhere they are
-     called.
-
-`-fmemoize-lookups'
-`-fsave-memoized'
-     Use heuristics to compile faster.  These heuristics are not
-     enabled by default, since they are only effective for certain
-     input files.  Other input files compile more slowly.
-
-     The first time the compiler must build a call to a member function
-     (or reference to a data member), it must (1) determine whether the
-     class implements member functions of that name; (2) resolve which
-     member function to call (which involves figuring out what sorts of
-     type conversions need to be made); and (3) check the visibility of
-     the member function to the caller.  All of this adds up to slower
-     compilation.  Normally, the second time a call is made to that
-     member function (or reference to that data member), it must go
-     through the same lengthy process again.  This means that code like
-     this:
-
-          cout << "This " << p << " has " << n << " legs.\n";
-
-     makes six passes through all three steps.  By using a software
-     cache, a "hit" significantly reduces this cost.  Unfortunately,
-     using the cache introduces another layer of mechanisms which must
-     be implemented, and so incurs its own overhead.
-     `-fmemoize-lookups' enables the software cache.
-
-     Because access privileges (visibility) to members and member
-     functions may differ from one function context to the next, G++
-     may need to flush the cache.  With the `-fmemoize-lookups' flag,
-     the cache is flushed after every function that is compiled.  The
-     `-fsave-memoized' flag enables the same software cache, but when
-     the compiler determines that the context of the last function
-     compiled would yield the same access privileges of the next
-     function to compile, it preserves the cache.  This is most helpful
-     when defining many member functions for the same class: with the
-     exception of member functions which are friends of other classes,
-     each member function has exactly the same access privileges as
-     every other, and the cache need not be flushed.
-
-     The code that implements these flags has rotted; you should
-     probably avoid using them.
-
-`-fstrict-prototype'
-     Within an `extern "C"' linkage specification, treat a function
-     declaration with no arguments, such as `int foo ();', as declaring
-     the function to take no arguments.  Normally, such a declaration
-     means that the function `foo' can take any combination of
-     arguments, as in C.  `-pedantic' implies `-fstrict-prototype'
-     unless overridden with `-fno-strict-prototype'.
-
-     This flag no longer affects declarations with C++ linkage.
-
-`-fname-mangling-version-N'
-     Control the way in which names are mangled.  Version 0 is
-     compatible with versions of g++ before 2.8.  Version 1 is the
-     default.  Version 1 will allow correct mangling of function
-     templates.  For example, version 0 mangling does not mangle
-     foo<int, double> and foo<int, char> given this declaration:
-
-          template <class T, class U> void foo(T t);
-
-`-fno-nonnull-objects'
-     Don't assume that a reference is initialized to refer to a valid
-     object.  Although the current C++ Working Paper prohibits null
-     references, some old code may rely on them, and you can use
-     `-fno-nonnull-objects' to turn on checking.
-
-     At the moment, the compiler only does this checking for
-     conversions to virtual base classes.
-
-`-foperator-names'
-     Recognize the operator name keywords `and', `bitand', `bitor',
-     `compl', `not', `or' and `xor' as synonyms for the symbols they
-     refer to.  `-ansi' implies `-foperator-names'.
-
-`-fthis-is-variable'
-     Permit assignment to `this'.  The incorporation of user-defined
-     free store management into C++ has made assignment to `this' an
-     anachronism.  Therefore, by default it is invalid to assign to
-     `this' within a class member function; that is, GNU C++ treats
-     `this' in a member function of class `X' as a non-lvalue of type
-     `X *'.  However, for backwards compatibility, you can make it
-     valid with `-fthis-is-variable'.
-
-`-fvtable-thunks'
-     Use `thunks' to implement the virtual function dispatch table
-     (`vtable').  The traditional (cfront-style) approach to
-     implementing vtables was to store a pointer to the function and two
-     offsets for adjusting the `this' pointer at the call site.  Newer
-     implementations store a single pointer to a `thunk' function which
-     does any necessary adjustment and then calls the target function.
-
-     This option also enables a heuristic for controlling emission of
-     vtables; if a class has any non-inline virtual functions, the
-     vtable will be emitted in the translation unit containing the
-     first one of those.
-
-`-ftemplate-depth-N'
-     Set the maximum instantiation depth for template classes to N.  A
-     limit on the template instantiation depth is needed to detect
-     endless recursions during template class instantiation. ANSI/ISO
-     C++ conforming programs must not rely on a maximum depth greater
-     than 17.
-
-`-nostdinc++'
-     Do not search for header files in the standard directories
-     specific to C++, but do still search the other standard
-     directories.  (This option is used when building libg++.)
-
-`-traditional'
-     For C++ programs (in addition to the effects that apply to both C
-     and C++), this has the same effect as `-fthis-is-variable'.  *Note
-     Options Controlling C Dialect: C Dialect Options.
-
-   In addition, these optimization, warning, and code generation options
-have meanings only for C++ programs:
-
-`-fno-default-inline'
-     Do not assume `inline' for functions defined inside a class scope.
-     *Note Options That Control Optimization: Optimize Options.
-
-`-Woverloaded-virtual'
-`-Wtemplate-debugging'
-     Warnings that apply only to C++ programs.  *Note Options to
-     Request or Suppress Warnings: Warning Options.
-
-`-Weffc++'
-     Warn about violation of some style rules from Effective C++ by
-     Scott Myers.
-
-`+eN'
-     Control how virtual function definitions are used, in a fashion
-     compatible with `cfront' 1.x.  *Note Options for Code Generation
-     Conventions: Code Gen Options.
-
diff --git a/gcc/gcc.info-10 b/gcc/gcc.info-10
deleted file mode 100644 (file)
index a7a7c0c..0000000
+++ /dev/null
@@ -1,1079 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Inline,  Next: Extended Asm,  Prev: Alignment,  Up: C Extensions
-
-An Inline Function is As Fast As a Macro
-========================================
-
-   By declaring a function `inline', you can direct GNU CC to integrate
-that function's code into the code for its callers.  This makes
-execution faster by eliminating the function-call overhead; in
-addition, if any of the actual argument values are constant, their known
-values may permit simplifications at compile time so that not all of the
-inline function's code needs to be included.  The effect on code size is
-less predictable; object code may be larger or smaller with function
-inlining, depending on the particular case.  Inlining of functions is an
-optimization and it really "works" only in optimizing compilation.  If
-you don't use `-O', no function is really inline.
-
-   To declare a function inline, use the `inline' keyword in its
-declaration, like this:
-
-     inline int
-     inc (int *a)
-     {
-       (*a)++;
-     }
-
-   (If you are writing a header file to be included in ANSI C programs,
-write `__inline__' instead of `inline'.  *Note Alternate Keywords::.)
-
-   You can also make all "simple enough" functions inline with the
-option `-finline-functions'.  Note that certain usages in a function
-definition can make it unsuitable for inline substitution.
-
-   Note that in C and Objective C, unlike C++, the `inline' keyword
-does not affect the linkage of the function.
-
-   GNU CC automatically inlines member functions defined within the
-class body of C++ programs even if they are not explicitly declared
-`inline'.  (You can override this with `-fno-default-inline'; *note
-Options Controlling C++ Dialect: C++ Dialect Options..)
-
-   When a function is both inline and `static', if all calls to the
-function are integrated into the caller, and the function's address is
-never used, then the function's own assembler code is never referenced.
-In this case, GNU CC does not actually output assembler code for the
-function, unless you specify the option `-fkeep-inline-functions'.
-Some calls cannot be integrated for various reasons (in particular,
-calls that precede the function's definition cannot be integrated, and
-neither can recursive calls within the definition).  If there is a
-nonintegrated call, then the function is compiled to assembler code as
-usual.  The function must also be compiled as usual if the program
-refers to its address, because that can't be inlined.
-
-   When an inline function is not `static', then the compiler must
-assume that there may be calls from other source files; since a global
-symbol can be defined only once in any program, the function must not
-be defined in the other source files, so the calls therein cannot be
-integrated.  Therefore, a non-`static' inline function is always
-compiled on its own in the usual fashion.
-
-   If you specify both `inline' and `extern' in the function
-definition, then the definition is used only for inlining.  In no case
-is the function compiled on its own, not even if you refer to its
-address explicitly.  Such an address becomes an external reference, as
-if you had only declared the function, and had not defined it.
-
-   This combination of `inline' and `extern' has almost the effect of a
-macro.  The way to use it is to put a function definition in a header
-file with these keywords, and put another copy of the definition
-(lacking `inline' and `extern') in a library file.  The definition in
-the header file will cause most calls to the function to be inlined.
-If any uses of the function remain, they will refer to the single copy
-in the library.
-
-   GNU C does not inline any functions when not optimizing.  It is not
-clear whether it is better to inline or not, in this case, but we found
-that a correct implementation when not optimizing was difficult.  So we
-did the easy thing, and turned it off.
-
-\1f
-File: gcc.info,  Node: Extended Asm,  Next: Asm Labels,  Prev: Inline,  Up: C Extensions
-
-Assembler Instructions with C Expression Operands
-=================================================
-
-   In an assembler instruction using `asm', you can now specify the
-operands of the instruction using C expressions.  This means no more
-guessing which registers or memory locations will contain the data you
-want to use.
-
-   You must specify an assembler instruction template much like what
-appears in a machine description, plus an operand constraint string for
-each operand.
-
-   For example, here is how to use the 68881's `fsinx' instruction:
-
-     asm ("fsinx %1,%0" : "=f" (result) : "f" (angle));
-
-Here `angle' is the C expression for the input operand while `result'
-is that of the output operand.  Each has `"f"' as its operand
-constraint, saying that a floating point register is required.  The `='
-in `=f' indicates that the operand is an output; all output operands'
-constraints must use `='.  The constraints use the same language used
-in the machine description (*note Constraints::.).
-
-   Each operand is described by an operand-constraint string followed
-by the C expression in parentheses.  A colon separates the assembler
-template from the first output operand, and another separates the last
-output operand from the first input, if any.  Commas separate output
-operands and separate inputs.  The total number of operands is limited
-to ten or to the maximum number of operands in any instruction pattern
-in the machine description, whichever is greater.
-
-   If there are no output operands, and there are input operands, then
-there must be two consecutive colons surrounding the place where the
-output operands would go.
-
-   Output operand expressions must be lvalues; the compiler can check
-this.  The input operands need not be lvalues.  The compiler cannot
-check whether the operands have data types that are reasonable for the
-instruction being executed.  It does not parse the assembler
-instruction template and does not know what it means, or whether it is
-valid assembler input.  The extended `asm' feature is most often used
-for machine instructions that the compiler itself does not know exist.
-If the output expression cannot be directly addressed (for example, it
-is a bit field), your constraint must allow a register.  In that case,
-GNU CC will use the register as the output of the `asm', and then store
-that register into the output.
-
-   The ordinary output operands must be write-only; GNU CC will assume
-that the values in these operands before the instruction are dead and
-need not be generated.  Extended asm supports input-output or
-read-write operands.  Use the constraint character `+' to indicate such
-an operand and list it with the output operands.
-
-   When the constraints for the read-write operand (or the operand in
-which only some of the bits are to be changed) allows a register, you
-may, as an alternative, logically split its function into two separate
-operands, one input operand and one write-only output operand.  The
-connection between them is expressed by constraints which say they need
-to be in the same location when the instruction executes.  You can use
-the same C expression for both operands, or different expressions.  For
-example, here we write the (fictitious) `combine' instruction with
-`bar' as its read-only source operand and `foo' as its read-write
-destination:
-
-     asm ("combine %2,%0" : "=r" (foo) : "0" (foo), "g" (bar));
-
-The constraint `"0"' for operand 1 says that it must occupy the same
-location as operand 0.  A digit in constraint is allowed only in an
-input operand, and it must refer to an output operand.
-
-   Only a digit in the constraint can guarantee that one operand will
-be in the same place as another.  The mere fact that `foo' is the value
-of both operands is not enough to guarantee that they will be in the
-same place in the generated assembler code.  The following would not
-work:
-
-     asm ("combine %2,%0" : "=r" (foo) : "r" (foo), "g" (bar));
-
-   Various optimizations or reloading could cause operands 0 and 1 to
-be in different registers; GNU CC knows no reason not to do so.  For
-example, the compiler might find a copy of the value of `foo' in one
-register and use it for operand 1, but generate the output operand 0 in
-a different register (copying it afterward to `foo''s own address).  Of
-course, since the register for operand 1 is not even mentioned in the
-assembler code, the result will not work, but GNU CC can't tell that.
-
-   Some instructions clobber specific hard registers.  To describe
-this, write a third colon after the input operands, followed by the
-names of the clobbered hard registers (given as strings).  Here is a
-realistic example for the Vax:
-
-     asm volatile ("movc3 %0,%1,%2"
-                   : /* no outputs */
-                   : "g" (from), "g" (to), "g" (count)
-                   : "r0", "r1", "r2", "r3", "r4", "r5");
-
-   If you refer to a particular hardware register from the assembler
-code, then you will probably have to list the register after the third
-colon to tell the compiler that the register's value is modified.  In
-many assemblers, the register names begin with `%'; to produce one `%'
-in the assembler code, you must write `%%' in the input.
-
-   If your assembler instruction can alter the condition code register,
-add `cc' to the list of clobbered registers.  GNU CC on some machines
-represents the condition codes as a specific hardware register; `cc'
-serves to name this register.  On other machines, the condition code is
-handled differently, and specifying `cc' has no effect.  But it is
-valid no matter what the machine.
-
-   If your assembler instruction modifies memory in an unpredictable
-fashion, add `memory' to the list of clobbered registers.  This will
-cause GNU CC to not keep memory values cached in registers across the
-assembler instruction.
-
-   You can put multiple assembler instructions together in a single
-`asm' template, separated either with newlines (written as `\n') or with
-semicolons if the assembler allows such semicolons.  The GNU assembler
-allows semicolons and all Unix assemblers seem to do so.  The input
-operands are guaranteed not to use any of the clobbered registers, and
-neither will the output operands' addresses, so you can read and write
-the clobbered registers as many times as you like.  Here is an example
-of multiple instructions in a template; it assumes that the subroutine
-`_foo' accepts arguments in registers 9 and 10:
-
-     asm ("movl %0,r9;movl %1,r10;call _foo"
-          : /* no outputs */
-          : "g" (from), "g" (to)
-          : "r9", "r10");
-
-   Unless an output operand has the `&' constraint modifier, GNU CC may
-allocate it in the same register as an unrelated input operand, on the
-assumption that the inputs are consumed before the outputs are produced.
-This assumption may be false if the assembler code actually consists of
-more than one instruction.  In such a case, use `&' for each output
-operand that may not overlap an input.  *Note Modifiers::.
-
-   If you want to test the condition code produced by an assembler
-instruction, you must include a branch and a label in the `asm'
-construct, as follows:
-
-     asm ("clr %0;frob %1;beq 0f;mov #1,%0;0:"
-          : "g" (result)
-          : "g" (input));
-
-This assumes your assembler supports local labels, as the GNU assembler
-and most Unix assemblers do.
-
-   Speaking of labels, jumps from one `asm' to another are not
-supported.  The compiler's optimizers do not know about these jumps,
-and therefore they cannot take account of them when deciding how to
-optimize.
-
-   Usually the most convenient way to use these `asm' instructions is to
-encapsulate them in macros that look like functions.  For example,
-
-     #define sin(x)       \
-     ({ double __value, __arg = (x);   \
-        asm ("fsinx %1,%0": "=f" (__value): "f" (__arg));  \
-        __value; })
-
-Here the variable `__arg' is used to make sure that the instruction
-operates on a proper `double' value, and to accept only those arguments
-`x' which can convert automatically to a `double'.
-
-   Another way to make sure the instruction operates on the correct
-data type is to use a cast in the `asm'.  This is different from using a
-variable `__arg' in that it converts more different types.  For
-example, if the desired type were `int', casting the argument to `int'
-would accept a pointer with no complaint, while assigning the argument
-to an `int' variable named `__arg' would warn about using a pointer
-unless the caller explicitly casts it.
-
-   If an `asm' has output operands, GNU CC assumes for optimization
-purposes that the instruction has no side effects except to change the
-output operands.  This does not mean that instructions with a side
-effect cannot be used, but you must be careful, because the compiler
-may eliminate them if the output operands aren't used, or move them out
-of loops, or replace two with one if they constitute a common
-subexpression.  Also, if your instruction does have a side effect on a
-variable that otherwise appears not to change, the old value of the
-variable may be reused later if it happens to be found in a register.
-
-   You can prevent an `asm' instruction from being deleted, moved
-significantly, or combined, by writing the keyword `volatile' after the
-`asm'.  For example:
-
-     #define set_priority(x)  \
-     asm volatile ("set_priority %0": /* no outputs */ : "g" (x))
-
-An instruction without output operands will not be deleted or moved
-significantly, regardless, unless it is unreachable.
-
-   Note that even a volatile `asm' instruction can be moved in ways
-that appear insignificant to the compiler, such as across jump
-instructions.  You can't expect a sequence of volatile `asm'
-instructions to remain perfectly consecutive.  If you want consecutive
-output, use a single `asm'.
-
-   It is a natural idea to look for a way to give access to the
-condition code left by the assembler instruction.  However, when we
-attempted to implement this, we found no way to make it work reliably.
-The problem is that output operands might need reloading, which would
-result in additional following "store" instructions.  On most machines,
-these instructions would alter the condition code before there was time
-to test it.  This problem doesn't arise for ordinary "test" and
-"compare" instructions because they don't have any output operands.
-
-   If you are writing a header file that should be includable in ANSI C
-programs, write `__asm__' instead of `asm'.  *Note Alternate Keywords::.
-
-\1f
-File: gcc.info,  Node: Asm Labels,  Next: Explicit Reg Vars,  Prev: Extended Asm,  Up: C Extensions
-
-Controlling Names Used in Assembler Code
-========================================
-
-   You can specify the name to be used in the assembler code for a C
-function or variable by writing the `asm' (or `__asm__') keyword after
-the declarator as follows:
-
-     int foo asm ("myfoo") = 2;
-
-This specifies that the name to be used for the variable `foo' in the
-assembler code should be `myfoo' rather than the usual `_foo'.
-
-   On systems where an underscore is normally prepended to the name of
-a C function or variable, this feature allows you to define names for
-the linker that do not start with an underscore.
-
-   You cannot use `asm' in this way in a function *definition*; but you
-can get the same effect by writing a declaration for the function
-before its definition and putting `asm' there, like this:
-
-     extern func () asm ("FUNC");
-     
-     func (x, y)
-          int x, y;
-     ...
-
-   It is up to you to make sure that the assembler names you choose do
-not conflict with any other assembler symbols.  Also, you must not use a
-register name; that would produce completely invalid assembler code.
-GNU CC does not as yet have the ability to store static variables in
-registers.  Perhaps that will be added.
-
-\1f
-File: gcc.info,  Node: Explicit Reg Vars,  Next: Alternate Keywords,  Prev: Asm Labels,  Up: C Extensions
-
-Variables in Specified Registers
-================================
-
-   GNU C allows you to put a few global variables into specified
-hardware registers.  You can also specify the register in which an
-ordinary register variable should be allocated.
-
-   * Global register variables reserve registers throughout the program.
-     This may be useful in programs such as programming language
-     interpreters which have a couple of global variables that are
-     accessed very often.
-
-   * Local register variables in specific registers do not reserve the
-     registers.  The compiler's data flow analysis is capable of
-     determining where the specified registers contain live values, and
-     where they are available for other uses.
-
-     These local variables are sometimes convenient for use with the
-     extended `asm' feature (*note Extended Asm::.), if you want to
-     write one output of the assembler instruction directly into a
-     particular register.  (This will work provided the register you
-     specify fits the constraints specified for that operand in the
-     `asm'.)
-
-* Menu:
-
-* Global Reg Vars::
-* Local Reg Vars::
-
-\1f
-File: gcc.info,  Node: Global Reg Vars,  Next: Local Reg Vars,  Up: Explicit Reg Vars
-
-Defining Global Register Variables
-----------------------------------
-
-   You can define a global register variable in GNU C like this:
-
-     register int *foo asm ("a5");
-
-Here `a5' is the name of the register which should be used.  Choose a
-register which is normally saved and restored by function calls on your
-machine, so that library routines will not clobber it.
-
-   Naturally the register name is cpu-dependent, so you would need to
-conditionalize your program according to cpu type.  The register `a5'
-would be a good choice on a 68000 for a variable of pointer type.  On
-machines with register windows, be sure to choose a "global" register
-that is not affected magically by the function call mechanism.
-
-   In addition, operating systems on one type of cpu may differ in how
-they name the registers; then you would need additional conditionals.
-For example, some 68000 operating systems call this register `%a5'.
-
-   Eventually there may be a way of asking the compiler to choose a
-register automatically, but first we need to figure out how it should
-choose and how to enable you to guide the choice.  No solution is
-evident.
-
-   Defining a global register variable in a certain register reserves
-that register entirely for this use, at least within the current
-compilation.  The register will not be allocated for any other purpose
-in the functions in the current compilation.  The register will not be
-saved and restored by these functions.  Stores into this register are
-never deleted even if they would appear to be dead, but references may
-be deleted or moved or simplified.
-
-   It is not safe to access the global register variables from signal
-handlers, or from more than one thread of control, because the system
-library routines may temporarily use the register for other things
-(unless you recompile them specially for the task at hand).
-
-   It is not safe for one function that uses a global register variable
-to call another such function `foo' by way of a third function `lose'
-that was compiled without knowledge of this variable (i.e. in a
-different source file in which the variable wasn't declared).  This is
-because `lose' might save the register and put some other value there.
-For example, you can't expect a global register variable to be
-available in the comparison-function that you pass to `qsort', since
-`qsort' might have put something else in that register.  (If you are
-prepared to recompile `qsort' with the same global register variable,
-you can solve this problem.)
-
-   If you want to recompile `qsort' or other source files which do not
-actually use your global register variable, so that they will not use
-that register for any other purpose, then it suffices to specify the
-compiler option `-ffixed-REG'.  You need not actually add a global
-register declaration to their source code.
-
-   A function which can alter the value of a global register variable
-cannot safely be called from a function compiled without this variable,
-because it could clobber the value the caller expects to find there on
-return.  Therefore, the function which is the entry point into the part
-of the program that uses the global register variable must explicitly
-save and restore the value which belongs to its caller.
-
-   On most machines, `longjmp' will restore to each global register
-variable the value it had at the time of the `setjmp'.  On some
-machines, however, `longjmp' will not change the value of global
-register variables.  To be portable, the function that called `setjmp'
-should make other arrangements to save the values of the global register
-variables, and to restore them in a `longjmp'.  This way, the same
-thing will happen regardless of what `longjmp' does.
-
-   All global register variable declarations must precede all function
-definitions.  If such a declaration could appear after function
-definitions, the declaration would be too late to prevent the register
-from being used for other purposes in the preceding functions.
-
-   Global register variables may not have initial values, because an
-executable file has no means to supply initial contents for a register.
-
-   On the Sparc, there are reports that g3 ... g7 are suitable
-registers, but certain library functions, such as `getwd', as well as
-the subroutines for division and remainder, modify g3 and g4.  g1 and
-g2 are local temporaries.
-
-   On the 68000, a2 ... a5 should be suitable, as should d2 ... d7.  Of
-course, it will not do to use more than a few of those.
-
-\1f
-File: gcc.info,  Node: Local Reg Vars,  Prev: Global Reg Vars,  Up: Explicit Reg Vars
-
-Specifying Registers for Local Variables
-----------------------------------------
-
-   You can define a local register variable with a specified register
-like this:
-
-     register int *foo asm ("a5");
-
-Here `a5' is the name of the register which should be used.  Note that
-this is the same syntax used for defining global register variables,
-but for a local variable it would appear within a function.
-
-   Naturally the register name is cpu-dependent, but this is not a
-problem, since specific registers are most often useful with explicit
-assembler instructions (*note Extended Asm::.).  Both of these things
-generally require that you conditionalize your program according to cpu
-type.
-
-   In addition, operating systems on one type of cpu may differ in how
-they name the registers; then you would need additional conditionals.
-For example, some 68000 operating systems call this register `%a5'.
-
-   Eventually there may be a way of asking the compiler to choose a
-register automatically, but first we need to figure out how it should
-choose and how to enable you to guide the choice.  No solution is
-evident.
-
-   Defining such a register variable does not reserve the register; it
-remains available for other uses in places where flow control determines
-the variable's value is not live.  However, these registers are made
-unavailable for use in the reload pass.  I would not be surprised if
-excessive use of this feature leaves the compiler too few available
-registers to compile certain functions.
-
-\1f
-File: gcc.info,  Node: Alternate Keywords,  Next: Incomplete Enums,  Prev: Explicit Reg Vars,  Up: C Extensions
-
-Alternate Keywords
-==================
-
-   The option `-traditional' disables certain keywords; `-ansi'
-disables certain others.  This causes trouble when you want to use GNU C
-extensions, or ANSI C features, in a general-purpose header file that
-should be usable by all programs, including ANSI C programs and
-traditional ones.  The keywords `asm', `typeof' and `inline' cannot be
-used since they won't work in a program compiled with `-ansi', while
-the keywords `const', `volatile', `signed', `typeof' and `inline' won't
-work in a program compiled with `-traditional'.
-
-   The way to solve these problems is to put `__' at the beginning and
-end of each problematical keyword.  For example, use `__asm__' instead
-of `asm', `__const__' instead of `const', and `__inline__' instead of
-`inline'.
-
-   Other C compilers won't accept these alternative keywords; if you
-want to compile with another compiler, you can define the alternate
-keywords as macros to replace them with the customary keywords.  It
-looks like this:
-
-     #ifndef __GNUC__
-     #define __asm__ asm
-     #endif
-
-   `-pedantic' causes warnings for many GNU C extensions.  You can
-prevent such warnings within one expression by writing `__extension__'
-before the expression.  `__extension__' has no effect aside from this.
-
-\1f
-File: gcc.info,  Node: Incomplete Enums,  Next: Function Names,  Prev: Alternate Keywords,  Up: C Extensions
-
-Incomplete `enum' Types
-=======================
-
-   You can define an `enum' tag without specifying its possible values.
-This results in an incomplete type, much like what you get if you write
-`struct foo' without describing the elements.  A later declaration
-which does specify the possible values completes the type.
-
-   You can't allocate variables or storage using the type while it is
-incomplete.  However, you can work with pointers to that type.
-
-   This extension may not be very useful, but it makes the handling of
-`enum' more consistent with the way `struct' and `union' are handled.
-
-   This extension is not supported by GNU C++.
-
-\1f
-File: gcc.info,  Node: Function Names,  Next: Return Address,  Prev: Incomplete Enums,  Up: C Extensions
-
-Function Names as Strings
-=========================
-
-   GNU CC predefines two string variables to be the name of the current
-function.  The variable `__FUNCTION__' is the name of the function as
-it appears in the source.  The variable `__PRETTY_FUNCTION__' is the
-name of the function pretty printed in a language specific fashion.
-
-   These names are always the same in a C function, but in a C++
-function they may be different.  For example, this program:
-
-     extern "C" {
-     extern int printf (char *, ...);
-     }
-     
-     class a {
-      public:
-       sub (int i)
-         {
-           printf ("__FUNCTION__ = %s\n", __FUNCTION__);
-           printf ("__PRETTY_FUNCTION__ = %s\n", __PRETTY_FUNCTION__);
-         }
-     };
-     
-     int
-     main (void)
-     {
-       a ax;
-       ax.sub (0);
-       return 0;
-     }
-
-gives this output:
-
-     __FUNCTION__ = sub
-     __PRETTY_FUNCTION__ = int  a::sub (int)
-
-   These names are not macros: they are predefined string variables.
-For example, `#ifdef __FUNCTION__' does not have any special meaning
-inside a function, since the preprocessor does not do anything special
-with the identifier `__FUNCTION__'.
-
-\1f
-File: gcc.info,  Node: Return Address,  Prev: Function Names,  Up: C Extensions
-
-Getting the Return or Frame Address of a Function
-=================================================
-
-   These functions may be used to get information about the callers of a
-function.
-
-`__builtin_return_address (LEVEL)'
-     This function returns the return address of the current function,
-     or of one of its callers.  The LEVEL argument is number of frames
-     to scan up the call stack.  A value of `0' yields the return
-     address of the current function, a value of `1' yields the return
-     address of the caller of the current function, and so forth.
-
-     The LEVEL argument must be a constant integer.
-
-     On some machines it may be impossible to determine the return
-     address of any function other than the current one; in such cases,
-     or when the top of the stack has been reached, this function will
-     return `0'.
-
-     This function should only be used with a non-zero argument for
-     debugging purposes.
-
-`__builtin_frame_address (LEVEL)'
-     This function is similar to `__builtin_return_address', but it
-     returns the address of the function frame rather than the return
-     address of the function.  Calling `__builtin_frame_address' with a
-     value of `0' yields the frame address of the current function, a
-     value of `1' yields the frame address of the caller of the current
-     function, and so forth.
-
-     The frame is the area on the stack which holds local variables and
-     saved registers.  The frame address is normally the address of the
-     first word pushed on to the stack by the function.  However, the
-     exact definition depends upon the processor and the calling
-     convention.  If the processor has a dedicated frame pointer
-     register, and the function has a frame, then
-     `__builtin_frame_address' will return the value of the frame
-     pointer register.
-
-     The caveats that apply to `__builtin_return_address' apply to this
-     function as well.
-
-\1f
-File: gcc.info,  Node: C++ Extensions,  Next: Gcov,  Prev: C Extensions,  Up: Top
-
-Extensions to the C++ Language
-******************************
-
-   The GNU compiler provides these extensions to the C++ language (and
-you can also use most of the C language extensions in your C++
-programs).  If you want to write code that checks whether these
-features are available, you can test for the GNU compiler the same way
-as for C programs: check for a predefined macro `__GNUC__'.  You can
-also use `__GNUG__' to test specifically for GNU C++ (*note Standard
-Predefined Macros: (cpp.info)Standard Predefined.).
-
-* Menu:
-
-* Naming Results::      Giving a name to C++ function return values.
-* Min and Max::                C++ Minimum and maximum operators.
-* Destructors and Goto:: Goto is safe to use in C++ even when destructors
-                           are needed.
-* C++ Interface::       You can use a single C++ header file for both
-                         declarations and definitions.
-* Template Instantiation:: Methods for ensuring that exactly one copy of
-                         each needed template instantiation is emitted.
-* C++ Signatures::     You can specify abstract types to get subtype
-                        polymorphism independent from inheritance.
-
-\1f
-File: gcc.info,  Node: Naming Results,  Next: Min and Max,  Up: C++ Extensions
-
-Named Return Values in C++
-==========================
-
-   GNU C++ extends the function-definition syntax to allow you to
-specify a name for the result of a function outside the body of the
-definition, in C++ programs:
-
-     TYPE
-     FUNCTIONNAME (ARGS) return RESULTNAME;
-     {
-       ...
-       BODY
-       ...
-     }
-
-   You can use this feature to avoid an extra constructor call when a
-function result has a class type.  For example, consider a function
-`m', declared as `X v = m ();', whose result is of class `X':
-
-     X
-     m ()
-     {
-       X b;
-       b.a = 23;
-       return b;
-     }
-
-   Although `m' appears to have no arguments, in fact it has one
-implicit argument: the address of the return value.  At invocation, the
-address of enough space to hold `v' is sent in as the implicit argument.
-Then `b' is constructed and its `a' field is set to the value 23.
-Finally, a copy constructor (a constructor of the form `X(X&)') is
-applied to `b', with the (implicit) return value location as the
-target, so that `v' is now bound to the return value.
-
-   But this is wasteful.  The local `b' is declared just to hold
-something that will be copied right out.  While a compiler that
-combined an "elision" algorithm with interprocedural data flow analysis
-could conceivably eliminate all of this, it is much more practical to
-allow you to assist the compiler in generating efficient code by
-manipulating the return value explicitly, thus avoiding the local
-variable and copy constructor altogether.
-
-   Using the extended GNU C++ function-definition syntax, you can avoid
-the temporary allocation and copying by naming `r' as your return value
-at the outset, and assigning to its `a' field directly:
-
-     X
-     m () return r;
-     {
-       r.a = 23;
-     }
-
-The declaration of `r' is a standard, proper declaration, whose effects
-are executed *before* any of the body of `m'.
-
-   Functions of this type impose no additional restrictions; in
-particular, you can execute `return' statements, or return implicitly by
-reaching the end of the function body ("falling off the edge").  Cases
-like
-
-     X
-     m () return r (23);
-     {
-       return;
-     }
-
-(or even `X m () return r (23); { }') are unambiguous, since the return
-value `r' has been initialized in either case.  The following code may
-be hard to read, but also works predictably:
-
-     X
-     m () return r;
-     {
-       X b;
-       return b;
-     }
-
-   The return value slot denoted by `r' is initialized at the outset,
-but the statement `return b;' overrides this value.  The compiler deals
-with this by destroying `r' (calling the destructor if there is one, or
-doing nothing if there is not), and then reinitializing `r' with `b'.
-
-   This extension is provided primarily to help people who use
-overloaded operators, where there is a great need to control not just
-the arguments, but the return values of functions.  For classes where
-the copy constructor incurs a heavy performance penalty (especially in
-the common case where there is a quick default constructor), this is a
-major savings.  The disadvantage of this extension is that you do not
-control when the default constructor for the return value is called: it
-is always called at the beginning.
-
-\1f
-File: gcc.info,  Node: Min and Max,  Next: Destructors and Goto,  Prev: Naming Results,  Up: C++ Extensions
-
-Minimum and Maximum Operators in C++
-====================================
-
-   It is very convenient to have operators which return the "minimum"
-or the "maximum" of two arguments.  In GNU C++ (but not in GNU C),
-
-`A <? B'
-     is the "minimum", returning the smaller of the numeric values A
-     and B;
-
-`A >? B'
-     is the "maximum", returning the larger of the numeric values A and
-     B.
-
-   These operations are not primitive in ordinary C++, since you can
-use a macro to return the minimum of two things in C++, as in the
-following example.
-
-     #define MIN(X,Y) ((X) < (Y) ? : (X) : (Y))
-
-You might then use `int min = MIN (i, j);' to set MIN to the minimum
-value of variables I and J.
-
-   However, side effects in `X' or `Y' may cause unintended behavior.
-For example, `MIN (i++, j++)' will fail, incrementing the smaller
-counter twice.  A GNU C extension allows you to write safe macros that
-avoid this kind of problem (*note Naming an Expression's Type: Naming
-Types.).  However, writing `MIN' and `MAX' as macros also forces you to
-use function-call notation for a fundamental arithmetic operation.
-Using GNU C++ extensions, you can write `int min = i <? j;' instead.
-
-   Since `<?' and `>?' are built into the compiler, they properly
-handle expressions with side-effects;  `int min = i++ <? j++;' works
-correctly.
-
-\1f
-File: gcc.info,  Node: Destructors and Goto,  Next: C++ Interface,  Prev: Min and Max,  Up: C++ Extensions
-
-`goto' and Destructors in GNU C++
-=================================
-
-   In C++ programs, you can safely use the `goto' statement.  When you
-use it to exit a block which contains aggregates requiring destructors,
-the destructors will run before the `goto' transfers control.
-
-   The compiler still forbids using `goto' to *enter* a scope that
-requires constructors.
-
-\1f
-File: gcc.info,  Node: C++ Interface,  Next: Template Instantiation,  Prev: Destructors and Goto,  Up: C++ Extensions
-
-Declarations and Definitions in One Header
-==========================================
-
-   C++ object definitions can be quite complex.  In principle, your
-source code will need two kinds of things for each object that you use
-across more than one source file.  First, you need an "interface"
-specification, describing its structure with type declarations and
-function prototypes.  Second, you need the "implementation" itself.  It
-can be tedious to maintain a separate interface description in a header
-file, in parallel to the actual implementation.  It is also dangerous,
-since separate interface and implementation definitions may not remain
-parallel.
-
-   With GNU C++, you can use a single header file for both purposes.
-
-     *Warning:* The mechanism to specify this is in transition.  For the
-     nonce, you must use one of two `#pragma' commands; in a future
-     release of GNU C++, an alternative mechanism will make these
-     `#pragma' commands unnecessary.
-
-   The header file contains the full definitions, but is marked with
-`#pragma interface' in the source code.  This allows the compiler to
-use the header file only as an interface specification when ordinary
-source files incorporate it with `#include'.  In the single source file
-where the full implementation belongs, you can use either a naming
-convention or `#pragma implementation' to indicate this alternate use
-of the header file.
-
-`#pragma interface'
-`#pragma interface "SUBDIR/OBJECTS.h"'
-     Use this directive in *header files* that define object classes,
-     to save space in most of the object files that use those classes.
-     Normally, local copies of certain information (backup copies of
-     inline member functions, debugging information, and the internal
-     tables that implement virtual functions) must be kept in each
-     object file that includes class definitions.  You can use this
-     pragma to avoid such duplication.  When a header file containing
-     `#pragma interface' is included in a compilation, this auxiliary
-     information will not be generated (unless the main input source
-     file itself uses `#pragma implementation').  Instead, the object
-     files will contain references to be resolved at link time.
-
-     The second form of this directive is useful for the case where you
-     have multiple headers with the same name in different directories.
-     If you use this form, you must specify the same string to `#pragma
-     implementation'.
-
-`#pragma implementation'
-`#pragma implementation "OBJECTS.h"'
-     Use this pragma in a *main input file*, when you want full output
-     from included header files to be generated (and made globally
-     visible).  The included header file, in turn, should use `#pragma
-     interface'.  Backup copies of inline member functions, debugging
-     information, and the internal tables used to implement virtual
-     functions are all generated in implementation files.
-
-     If you use `#pragma implementation' with no argument, it applies to
-     an include file with the same basename(1) as your source file.
-     For example, in `allclass.cc', giving just `#pragma implementation'
-     by itself is equivalent to `#pragma implementation "allclass.h"'.
-
-     In versions of GNU C++ prior to 2.6.0 `allclass.h' was treated as
-     an implementation file whenever you would include it from
-     `allclass.cc' even if you never specified `#pragma
-     implementation'.  This was deemed to be more trouble than it was
-     worth, however, and disabled.
-
-     If you use an explicit `#pragma implementation', it must appear in
-     your source file *before* you include the affected header files.
-
-     Use the string argument if you want a single implementation file to
-     include code from multiple header files.  (You must also use
-     `#include' to include the header file; `#pragma implementation'
-     only specifies how to use the file--it doesn't actually include
-     it.)
-
-     There is no way to split up the contents of a single header file
-     into multiple implementation files.
-
-   `#pragma implementation' and `#pragma interface' also have an effect
-on function inlining.
-
-   If you define a class in a header file marked with `#pragma
-interface', the effect on a function defined in that class is similar to
-an explicit `extern' declaration--the compiler emits no code at all to
-define an independent version of the function.  Its definition is used
-only for inlining with its callers.
-
-   Conversely, when you include the same header file in a main source
-file that declares it as `#pragma implementation', the compiler emits
-code for the function itself; this defines a version of the function
-that can be found via pointers (or by callers compiled without
-inlining).  If all calls to the function can be inlined, you can avoid
-emitting the function by compiling with `-fno-implement-inlines'.  If
-any calls were not inlined, you will get linker errors.
-
-   ---------- Footnotes ----------
-
-   (1) A file's "basename" was the name stripped of all leading path
-information and of trailing suffixes, such as `.h' or `.C' or `.cc'.
-
-\1f
-File: gcc.info,  Node: Template Instantiation,  Next: C++ Signatures,  Prev: C++ Interface,  Up: C++ Extensions
-
-Where's the Template?
-=====================
-
-   C++ templates are the first language feature to require more
-intelligence from the environment than one usually finds on a UNIX
-system.  Somehow the compiler and linker have to make sure that each
-template instance occurs exactly once in the executable if it is needed,
-and not at all otherwise.  There are two basic approaches to this
-problem, which I will refer to as the Borland model and the Cfront
-model.
-
-Borland model
-     Borland C++ solved the template instantiation problem by adding
-     the code equivalent of common blocks to their linker; the compiler
-     emits template instances in each translation unit that uses them,
-     and the linker collapses them together.  The advantage of this
-     model is that the linker only has to consider the object files
-     themselves; there is no external complexity to worry about.  This
-     disadvantage is that compilation time is increased because the
-     template code is being compiled repeatedly.  Code written for this
-     model tends to include definitions of all templates in the header
-     file, since they must be seen to be instantiated.
-
-Cfront model
-     The AT&T C++ translator, Cfront, solved the template instantiation
-     problem by creating the notion of a template repository, an
-     automatically maintained place where template instances are
-     stored.  A more modern version of the repository works as follows:
-     As individual object files are built, the compiler places any
-     template definitions and instantiations encountered in the
-     repository.  At link time, the link wrapper adds in the objects in
-     the repository and compiles any needed instances that were not
-     previously emitted.  The advantages of this model are more optimal
-     compilation speed and the ability to use the system linker; to
-     implement the Borland model a compiler vendor also needs to
-     replace the linker.  The disadvantages are vastly increased
-     complexity, and thus potential for error; for some code this can be
-     just as transparent, but in practice it can been very difficult to
-     build multiple programs in one directory and one program in
-     multiple directories.  Code written for this model tends to
-     separate definitions of non-inline member templates into a
-     separate file, which should be compiled separately.
-
-   When used with GNU ld version 2.8 or later on an ELF system such as
-Linux/GNU or Solaris 2, or on Microsoft Windows, g++ supports the
-Borland model.  On other systems, g++ implements neither automatic
-model.
-
-   A future version of g++ will support a hybrid model whereby the
-compiler will emit any instantiations for which the template definition
-is included in the compile, and store template definitions and
-instantiation context information into the object file for the rest.
-The link wrapper will extract that information as necessary and invoke
-the compiler to produce the remaining instantiations.  The linker will
-then combine duplicate instantiations.
-
-   In the mean time, you have the following options for dealing with
-template instantiations:
-
-  1. Compile your code with `-fno-implicit-templates' to disable the
-     implicit generation of template instances, and explicitly
-     instantiate all the ones you use.  This approach requires more
-     knowledge of exactly which instances you need than do the others,
-     but it's less mysterious and allows greater control.  You can
-     scatter the explicit instantiations throughout your program,
-     perhaps putting them in the translation units where the instances
-     are used or the translation units that define the templates
-     themselves; you can put all of the explicit instantiations you
-     need into one big file; or you can create small files like
-
-          #include "Foo.h"
-          #include "Foo.cc"
-          
-          template class Foo<int>;
-          template ostream& operator <<
-                          (ostream&, const Foo<int>&);
-
-     for each of the instances you need, and create a template
-     instantiation library from those.
-
-     If you are using Cfront-model code, you can probably get away with
-     not using `-fno-implicit-templates' when compiling files that don't
-     `#include' the member template definitions.
-
-     If you use one big file to do the instantiations, you may want to
-     compile it without `-fno-implicit-templates' so you get all of the
-     instances required by your explicit instantiations (but not by any
-     other files) without having to specify them as well.
-
-     g++ has extended the template instantiation syntax outlined in the
-     Working Paper to allow forward declaration of explicit
-     instantiations, explicit instantiation of members of template
-     classes and instantiation of the compiler support data for a
-     template class (i.e. the vtable) without instantiating any of its
-     members:
-
-          extern template int max (int, int);
-          template void Foo<int>::f ();
-          inline template class Foo<int>;
-
-  2. Do nothing.  Pretend g++ does implement automatic instantiation
-     management.  Code written for the Borland model will work fine, but
-     each translation unit will contain instances of each of the
-     templates it uses.  In a large program, this can lead to an
-     unacceptable amount of code duplication.
-
-  3. Add `#pragma interface' to all files containing template
-     definitions.  For each of these files, add `#pragma implementation
-     "FILENAME"' to the top of some `.C' file which `#include's it.
-     Then compile everything with `-fexternal-templates'.  The
-     templates will then only be expanded in the translation unit which
-     implements them (i.e. has a `#pragma implementation' line for the
-     file where they live); all other files will use external
-     references.  If you're lucky, everything should work properly.  If
-     you get undefined symbol errors, you need to make sure that each
-     template instance which is used in the program is used in the file
-     which implements that template.  If you don't have any use for a
-     particular instance in that file, you can just instantiate it
-     explicitly, using the syntax from the latest C++ working paper:
-
-          template class A<int>;
-          template ostream& operator << (ostream&, const A<int>&);
-
-     This strategy will work with code written for either model.  If
-     you are using code written for the Cfront model, the file
-     containing a class template and the file containing its member
-     templates should be implemented in the same translation unit.
-
-     A slight variation on this approach is to instead use the flag
-     `-falt-external-templates'; this flag causes template instances to
-     be emitted in the translation unit that implements the header
-     where they are first instantiated, rather than the one which
-     implements the file where the templates are defined.  This header
-     must be the same in all translation units, or things are likely to
-     break.
-
-     *Note Declarations and Definitions in One Header: C++ Interface,
-     for more discussion of these pragmas.
-
diff --git a/gcc/gcc.info-11 b/gcc/gcc.info-11
deleted file mode 100644 (file)
index a23d4dc..0000000
+++ /dev/null
@@ -1,1162 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: C++ Signatures,  Prev: Template Instantiation,  Up: C++ Extensions
-
-Type Abstraction using Signatures
-=================================
-
-   In GNU C++, you can use the keyword `signature' to define a
-completely abstract class interface as a datatype.  You can connect this
-abstraction with actual classes using signature pointers.  If you want
-to use signatures, run the GNU compiler with the `-fhandle-signatures'
-command-line option.  (With this option, the compiler reserves a second
-keyword `sigof' as well, for a future extension.)
-
-   Roughly, signatures are type abstractions or interfaces of classes.
-Some other languages have similar facilities.  C++ signatures are
-related to ML's signatures, Haskell's type classes, definition modules
-in Modula-2, interface modules in Modula-3, abstract types in Emerald,
-type modules in Trellis/Owl, categories in Scratchpad II, and types in
-POOL-I.  For a more detailed discussion of signatures, see `Signatures:
-A Language Extension for Improving Type Abstraction and Subtype
-Polymorphism in C++' by Gerald Baumgartner and Vincent F. Russo (Tech
-report CSD-TR-95-051, Dept. of Computer Sciences, Purdue University,
-August 1995, a slightly improved version appeared in
-*Software--Practice & Experience*, 25(8), pp. 863-889, August 1995).
-You can get the tech report by anonymous FTP from `ftp.cs.purdue.edu'
-in `pub/gb/Signature-design.ps.gz'.
-
-   Syntactically, a signature declaration is a collection of member
-function declarations and nested type declarations.  For example, this
-signature declaration defines a new abstract type `S' with member
-functions `int foo ()' and `int bar (int)':
-
-     signature S
-     {
-       int foo ();
-       int bar (int);
-     };
-
-   Since signature types do not include implementation definitions, you
-cannot write an instance of a signature directly.  Instead, you can
-define a pointer to any class that contains the required interfaces as a
-"signature pointer".  Such a class "implements" the signature type.
-
-   To use a class as an implementation of `S', you must ensure that the
-class has public member functions `int foo ()' and `int bar (int)'.
-The class can have other member functions as well, public or not; as
-long as it offers what's declared in the signature, it is suitable as
-an implementation of that signature type.
-
-   For example, suppose that `C' is a class that meets the requirements
-of signature `S' (`C' "conforms to" `S').  Then
-
-     C obj;
-     S * p = &obj;
-
-defines a signature pointer `p' and initializes it to point to an
-object of type `C'.  The member function call `int i = p->foo ();'
-executes `obj.foo ()'.
-
-   Abstract virtual classes provide somewhat similar facilities in
-standard C++.  There are two main advantages to using signatures
-instead:
-
-  1. Subtyping becomes independent from inheritance.  A class or
-     signature type `T' is a subtype of a signature type `S'
-     independent of any inheritance hierarchy as long as all the member
-     functions declared in `S' are also found in `T'.  So you can
-     define a subtype hierarchy that is completely independent from any
-     inheritance (implementation) hierarchy, instead of being forced to
-     use types that mirror the class inheritance hierarchy.
-
-  2. Signatures allow you to work with existing class hierarchies as
-     implementations of a signature type.  If those class hierarchies
-     are only available in compiled form, you're out of luck with
-     abstract virtual classes, since an abstract virtual class cannot
-     be retrofitted on top of existing class hierarchies.  So you would
-     be required to write interface classes as subtypes of the abstract
-     virtual class.
-
-   There is one more detail about signatures.  A signature declaration
-can contain member function *definitions* as well as member function
-declarations.  A signature member function with a full definition is
-called a *default implementation*; classes need not contain that
-particular interface in order to conform.  For example, a class `C' can
-conform to the signature
-
-     signature T
-     {
-       int f (int);
-       int f0 () { return f (0); };
-     };
-
-whether or not `C' implements the member function `int f0 ()'.  If you
-define `C::f0', that definition takes precedence; otherwise, the
-default implementation `S::f0' applies.
-
-\1f
-File: gcc.info,  Node: Gcov,  Next: Trouble,  Prev: C++ Extensions,  Up: Top
-
-`gcov': a Test Coverage Program
-*******************************
-
-   `gcov' is a tool you can use in conjunction with GNU CC to test code
-coverage in your programs.
-
-   This chapter describes version 1.5 of `gcov'.
-
-* Menu:
-
-* Gcov Intro::                         Introduction to gcov.
-* Invoking Gcov::              How to use gcov.
-* Gcov and Optimization::       Using gcov with GCC optimization.
-* Gcov Data Files::             The files used by gcov.
-
-\1f
-File: gcc.info,  Node: Gcov Intro,  Next: Invoking Gcov,  Up: Gcov
-
-Introduction to `gcov'
-======================
-
-   `gcov' is a test coverage program.  Use it in concert with GNU CC to
-analyze your programs to help create more efficient, faster running
-code.  You can use `gcov' as a profiling tool to help discover where
-your optimization efforts will best affect your code.  You can also use
-`gcov' along with the other profiling tool, `gprof', to assess which
-parts of your code use the greatest amount of computing time.
-
-   Profiling tools help you analyze your code's performance.  Using a
-profiler such as `gcov' or `gprof', you can find out some basic
-performance statistics, such as:
-
-   * how often each line of code executes
-
-   * what lines of code are actually executed
-
-   * how much computing time each section of code uses
-
-   Once you know these things about how your code works when compiled,
-you can look at each module to see which modules should be optimized.
-`gcov' helps you determine where to work on optimization.
-
-   Software developers also use coverage testing in concert with
-testsuites, to make sure software is actually good enough for a release.
-Testsuites can verify that a program works as expected; a coverage
-program tests to see how much of the program is exercised by the
-testsuite.  Developers can then determine what kinds of test cases need
-to be added to the testsuites to create both better testing and a better
-final product.
-
-   You should compile your code without optimization if you plan to use
-`gcov' because the optimization, by combining some lines of code into
-one function, may not give you as much information as you need to look
-for `hot spots' where the code is using a great deal of computer time.
-Likewise, because `gcov' accumulates statistics by line (at the lowest
-resolution), it works best with a programming style that places only
-one statement on each line.  If you use complicated macros that expand
-to loops or to other control structures, the statistics are less
-helpful--they only report on the line where the macro call appears.  If
-your complex macros behave like functions, you can replace them with
-inline functions to solve this problem.
-
-   `gcov' creates a logfile called `SOURCEFILE.gcov' which indicates
-how many times each line of a source file `SOURCEFILE.c' has executed.
-You can use these logfiles along with `gprof' to aid in fine-tuning the
-performance of your programs.  `gprof' gives timing information you can
-use along with the information you get from `gcov'.
-
-   `gcov' works only on code compiled with GNU CC.  It is not
-compatible with any other profiling or test coverage mechanism.
-
-\1f
-File: gcc.info,  Node: Invoking Gcov,  Next: Gcov and Optimization,  Prev: Gcov Intro,  Up: Gcov
-
-Invoking gcov
-=============
-
-     gcov [-b] [-v] [-n] [-l] [-f] [-o directory] SOURCEFILE
-
-`-b'
-     Write branch frequencies to the output file, and write branch
-     summary info to the standard output.  This option allows you to
-     see how often each branch in your program was taken.
-
-`-v'
-     Display the `gcov' version number (on the standard error stream).
-
-`-n'
-     Do not create the `gcov' output file.
-
-`-l'
-     Create long file names for included source files.  For example, if
-     the header file `x.h' contains code, and was included in the file
-     `a.c', then running `gcov' on the file `a.c' will produce an
-     output file called `a.c.x.h.gcov' instead of `x.h.gcov'.  This can
-     be useful if `x.h' is included in multiple source files.
-
-`-f'
-     Output summaries for each function in addition to the file level
-     summary.
-
-`-o'
-     The directory where the object files live.  Gcov will search for
-     `.bb', `.bbg', and `.da' files in this directory.
-
-   When using `gcov', you must first compile your program with two
-special GNU CC options: `-fprofile-arcs -ftest-coverage'.  This tells
-the compiler to generate additional information needed by gcov
-(basically a flow graph of the program) and also includes additional
-code in the object files for generating the extra profiling information
-needed by gcov.  These additional files are placed in the directory
-where the source code is located.
-
-   Running the program will cause profile output to be generated.  For
-each source file compiled with -fprofile-arcs, an accompanying `.da'
-file will be placed in the source directory.
-
-   Running `gcov' with your program's source file names as arguments
-will now produce a listing of the code along with frequency of execution
-for each line.  For example, if your program is called `tmp.c', this is
-what you see when you use the basic `gcov' facility:
-
-     $ gcc -fprofile-arcs -ftest-coverage tmp.c
-     $ a.out
-     $ gcov tmp.c
-      87.50% of 8 source lines executed in file tmp.c
-     Creating tmp.c.gcov.
-
-   The file `tmp.c.gcov' contains output from `gcov'.  Here is a sample:
-
-                     main()
-                     {
-                1      int i, total;
-     
-                1      total = 0;
-     
-               11      for (i = 0; i < 10; i++)
-               10        total += i;
-     
-                1      if (total != 45)
-           ######        printf ("Failure\n");
-                       else
-                1        printf ("Success\n");
-                1    }
-
-   When you use the `-b' option, your output looks like this:
-
-     $ gcov -b tmp.c
-      87.50% of 8 source lines executed in file tmp.c
-      80.00% of 5 branches executed in file tmp.c
-      80.00% of 5 branches taken at least once in file tmp.c
-      50.00% of 2 calls executed in file tmp.c
-     Creating tmp.c.gcov.
-
-   Here is a sample of a resulting `tmp.c.gcov' file:
-
-                     main()
-                     {
-                1      int i, total;
-     
-                1      total = 0;
-     
-               11      for (i = 0; i < 10; i++)
-     branch 0 taken = 91%
-     branch 1 taken = 100%
-     branch 2 taken = 100%
-               10        total += i;
-     
-                1      if (total != 45)
-     branch 0 taken = 100%
-           ######        printf ("Failure\n");
-     call 0 never executed
-     branch 1 never executed
-                       else
-                1        printf ("Success\n");
-     call 0 returns = 100%
-                1    }
-
-   For each basic block, a line is printed after the last line of the
-basic block describing the branch or call that ends the basic block.
-There can be multiple branches and calls listed for a single source
-line if there are multiple basic blocks that end on that line.  In this
-case, the branches and calls are each given a number.  There is no
-simple way to map these branches and calls back to source constructs.
-In general, though, the lowest numbered branch or call will correspond
-to the leftmost construct on the source line.
-
-   For a branch, if it was executed at least once, then a percentage
-indicating the number of times the branch was taken divided by the
-number of times the branch was executed will be printed.  Otherwise, the
-message "never executed" is printed.
-
-   For a call, if it was executed at least once, then a percentage
-indicating the number of times the call returned divided by the number
-of times the call was executed will be printed.  This will usually be
-100%, but may be less for functions call `exit' or `longjmp', and thus
-may not return everytime they are called.
-
-   The execution counts are cumulative.  If the example program were
-executed again without removing the `.da' file, the count for the
-number of times each line in the source was executed would be added to
-the results of the previous run(s).  This is potentially useful in
-several ways.  For example, it could be used to accumulate data over a
-number of program runs as part of a test verification suite, or to
-provide more accurate long-term information over a large number of
-program runs.
-
-   The data in the `.da' files is saved immediately before the program
-exits.  For each source file compiled with -fprofile-arcs, the profiling
-code first attempts to read in an existing `.da' file; if the file
-doesn't match the executable (differing number of basic block counts) it
-will ignore the contents of the file.  It then adds in the new execution
-counts and finally writes the data to the file.
-
-\1f
-File: gcc.info,  Node: Gcov and Optimization,  Next: Gcov Data Files,  Prev: Invoking Gcov,  Up: Gcov
-
-Using `gcov' with GCC Optimization
-==================================
-
-   If you plan to use `gcov' to help optimize your code, you must first
-compile your program with two special GNU CC options: `-fprofile-arcs
--ftest-coverage'.  Aside from that, you can use any other GNU CC
-options; but if you want to prove that every single line in your
-program was executed, you should not compile with optimization at the
-same time.  On some machines the optimizer can eliminate some simple
-code lines by combining them with other lines.  For example, code like
-this:
-
-     if (a != b)
-       c = 1;
-     else
-       c = 0;
-
-can be compiled into one instruction on some machines.  In this case,
-there is no way for `gcov' to calculate separate execution counts for
-each line because there isn't separate code for each line.  Hence the
-`gcov' output looks like this if you compiled the program with
-optimization:
-
-           100  if (a != b)
-           100    c = 1;
-           100  else
-           100    c = 0;
-
-   The output shows that this block of code, combined by optimization,
-executed 100 times.  In one sense this result is correct, because there
-was only one instruction representing all four of these lines.  However,
-the output does not indicate how many times the result was 0 and how
-many times the result was 1.
-
-\1f
-File: gcc.info,  Node: Gcov Data Files,  Prev: Gcov and Optimization,  Up: Gcov
-
-Brief description of `gcov' data files
-======================================
-
-   `gcov' uses three files for doing profiling.  The names of these
-files are derived from the original *source* file by substituting the
-file suffix with either `.bb', `.bbg', or `.da'.  All of these files
-are placed in the same directory as the source file, and contain data
-stored in a platform-independent method.
-
-   The `.bb' and `.bbg' files are generated when the source file is
-compiled with the GNU CC `-ftest-coverage' option.  The `.bb' file
-contains a list of source files (including headers), functions within
-those files, and line numbers corresponding to each basic block in the
-source file.
-
-   The `.bb' file format consists of several lists of 4-byte integers
-which correspond to the line numbers of each basic block in the file.
-Each list is terminated by a line number of 0.  A line number of -1 is
-used to designate that the source file name (padded to a 4-byte
-boundary and followed by another -1) follows.  In addition, a line
-number of -2 is used to designate that the name of a function (also
-padded to a 4-byte boundary and followed by a -2) follows.
-
-   The `.bbg' file is used to reconstruct the program flow graph for
-the source file.  It contains a list of the program flow arcs (possible
-branches taken from one basic block to another) for each function which,
-in combination with the `.bb' file, enables gcov to reconstruct the
-program flow.
-
-   In the `.bbg' file, the format is:
-             number of basic blocks for function #0 (4-byte number)
-             total number of arcs for function #0 (4-byte number)
-             count of arcs in basic block #0 (4-byte number)
-             destination basic block of arc #0 (4-byte number)
-             flag bits (4-byte number)
-             destination basic block of arc #1 (4-byte number)
-             flag bits (4-byte number)
-             ...
-             destination basic block of arc #N (4-byte number)
-             flag bits (4-byte number)
-             count of arcs in basic block #1 (4-byte number)
-             destination basic block of arc #0 (4-byte number)
-             flag bits (4-byte number)
-             ...
-
-   A -1 (stored as a 4-byte number) is used to separate each function's
-list of basic blocks, and to verify that the file has been read
-correctly.
-
-   The `.da' file is generated when a program containing object files
-built with the GNU CC `-fprofile-arcs' option is executed.  A separate
-`.da' file is created for each source file compiled with this option,
-and the name of the `.da' file is stored as an absolute pathname in the
-resulting object file.  This path name is derived from the source file
-name by substituting a `.da' suffix.
-
-   The format of the `.da' file is fairly simple.  The first 8-byte
-number is the number of counts in the file, followed by the counts
-(stored as 8-byte numbers).  Each count corresponds to the number of
-times each arc in the program is executed.  The counts are cumulative;
-each time the program is executed, it attemps to combine the existing
-`.da' files with the new counts for this invocation of the program.  It
-ignores the contents of any `.da' files whose number of arcs doesn't
-correspond to the current program, and merely overwrites them instead.
-
-   All three of these files use the functions in `gcov-io.h' to store
-integers; the functions in this header provide a machine-independent
-mechanism for storing and retrieving data from a stream.
-
-\1f
-File: gcc.info,  Node: Trouble,  Next: Bugs,  Prev: Gcov,  Up: Top
-
-Known Causes of Trouble with GNU CC
-***********************************
-
-   This section describes known problems that affect users of GNU CC.
-Most of these are not GNU CC bugs per se--if they were, we would fix
-them.  But the result for a user may be like the result of a bug.
-
-   Some of these problems are due to bugs in other software, some are
-missing features that are too much work to add, and some are places
-where people's opinions differ as to what is best.
-
-* Menu:
-
-* Actual Bugs::                      Bugs we will fix later.
-* Installation Problems::     Problems that manifest when you install GNU CC.
-* Cross-Compiler Problems::   Common problems of cross compiling with GNU CC.
-* Interoperation::      Problems using GNU CC with other compilers,
-                          and with certain linkers, assemblers and debuggers.
-* External Bugs::      Problems compiling certain programs.
-* Incompatibilities::   GNU CC is incompatible with traditional C.
-* Fixed Headers::       GNU C uses corrected versions of system header files.
-                           This is necessary, but doesn't always work smoothly.
-* Standard Libraries::  GNU C uses the system C library, which might not be
-                           compliant with the ISO/ANSI C standard.
-* Disappointments::     Regrettable things we can't change, but not quite bugs.
-* C++ Misunderstandings::     Common misunderstandings with GNU C++.
-* Protoize Caveats::    Things to watch out for when using `protoize'.
-* Non-bugs::           Things we think are right, but some others disagree.
-* Warnings and Errors:: Which problems in your code get warnings,
-                         and which get errors.
-
-\1f
-File: gcc.info,  Node: Actual Bugs,  Next: Installation Problems,  Up: Trouble
-
-Actual Bugs We Haven't Fixed Yet
-================================
-
-   * The `fixincludes' script interacts badly with automounters; if the
-     directory of system header files is automounted, it tends to be
-     unmounted while `fixincludes' is running.  This would seem to be a
-     bug in the automounter.  We don't know any good way to work around
-     it.
-
-   * The `fixproto' script will sometimes add prototypes for the
-     `sigsetjmp' and `siglongjmp' functions that reference the
-     `jmp_buf' type before that type is defined.  To work around this,
-     edit the offending file and place the typedef in front of the
-     prototypes.
-
-   * There are several obscure case of mis-using struct, union, and
-     enum tags that are not detected as errors by the compiler.
-
-   * When `-pedantic-errors' is specified, GNU C will incorrectly give
-     an error message when a function name is specified in an expression
-     involving the comma operator.
-
-   * Loop unrolling doesn't work properly for certain C++ programs.
-     This is a bug in the C++ front end.  It sometimes emits incorrect
-     debug info, and the loop unrolling code is unable to recover from
-     this error.
-
-\1f
-File: gcc.info,  Node: Installation Problems,  Next: Cross-Compiler Problems,  Prev: Actual Bugs,  Up: Trouble
-
-Installation Problems
-=====================
-
-   This is a list of problems (and some apparent problems which don't
-really mean anything is wrong) that show up during installation of GNU
-CC.
-
-   * On certain systems, defining certain environment variables such as
-     `CC' can interfere with the functioning of `make'.
-
-   * If you encounter seemingly strange errors when trying to build the
-     compiler in a directory other than the source directory, it could
-     be because you have previously configured the compiler in the
-     source directory.  Make sure you have done all the necessary
-     preparations.  *Note Other Dir::.
-
-   * If you build GNU CC on a BSD system using a directory stored in a
-     System V file system, problems may occur in running `fixincludes'
-     if the System V file system doesn't support symbolic links.  These
-     problems result in a failure to fix the declaration of `size_t' in
-     `sys/types.h'.  If you find that `size_t' is a signed type and
-     that type mismatches occur, this could be the cause.
-
-     The solution is not to use such a directory for building GNU CC.
-
-   * In previous versions of GNU CC, the `gcc' driver program looked for
-     `as' and `ld' in various places; for example, in files beginning
-     with `/usr/local/lib/gcc-'.  GNU CC version 2 looks for them in
-     the directory `/usr/local/lib/gcc-lib/TARGET/VERSION'.
-
-     Thus, to use a version of `as' or `ld' that is not the system
-     default, for example `gas' or GNU `ld', you must put them in that
-     directory (or make links to them from that directory).
-
-   * Some commands executed when making the compiler may fail (return a
-     non-zero status) and be ignored by `make'.  These failures, which
-     are often due to files that were not found, are expected, and can
-     safely be ignored.
-
-   * It is normal to have warnings in compiling certain files about
-     unreachable code and about enumeration type clashes.  These files'
-     names begin with `insn-'.  Also, `real.c' may get some warnings
-     that you can ignore.
-
-   * Sometimes `make' recompiles parts of the compiler when installing
-     the compiler.  In one case, this was traced down to a bug in
-     `make'.  Either ignore the problem or switch to GNU Make.
-
-   * If you have installed a program known as purify, you may find that
-     it causes errors while linking `enquire', which is part of building
-     GNU CC.  The fix is to get rid of the file `real-ld' which purify
-     installs--so that GNU CC won't try to use it.
-
-   * On Linux SLS 1.01, there is a problem with `libc.a': it does not
-     contain the obstack functions.  However, GNU CC assumes that the
-     obstack functions are in `libc.a' when it is the GNU C library.
-     To work around this problem, change the `__GNU_LIBRARY__'
-     conditional around line 31 to `#if 1'.
-
-   * On some 386 systems, building the compiler never finishes because
-     `enquire' hangs due to a hardware problem in the motherboard--it
-     reports floating point exceptions to the kernel incorrectly.  You
-     can install GNU CC except for `float.h' by patching out the
-     command to run `enquire'.  You may also be able to fix the problem
-     for real by getting a replacement motherboard.  This problem was
-     observed in Revision E of the Micronics motherboard, and is fixed
-     in Revision F.  It has also been observed in the MYLEX MXA-33
-     motherboard.
-
-     If you encounter this problem, you may also want to consider
-     removing the FPU from the socket during the compilation.
-     Alternatively, if you are running SCO Unix, you can reboot and
-     force the FPU to be ignored.  To do this, type `hd(40)unix auto
-     ignorefpu'.
-
-   * On some 386 systems, GNU CC crashes trying to compile `enquire.c'.
-     This happens on machines that don't have a 387 FPU chip.  On 386
-     machines, the system kernel is supposed to emulate the 387 when you
-     don't have one.  The crash is due to a bug in the emulator.
-
-     One of these systems is the Unix from Interactive Systems: 386/ix.
-     On this system, an alternate emulator is provided, and it does
-     work.  To use it, execute this command as super-user:
-
-          ln /etc/emulator.rel1 /etc/emulator
-
-     and then reboot the system.  (The default emulator file remains
-     present under the name `emulator.dflt'.)
-
-     Try using `/etc/emulator.att', if you have such a problem on the
-     SCO system.
-
-     Another system which has this problem is Esix.  We don't know
-     whether it has an alternate emulator that works.
-
-     On NetBSD 0.8, a similar problem manifests itself as these error
-     messages:
-
-          enquire.c: In function `fprop':
-          enquire.c:2328: floating overflow
-
-   * On SCO systems, when compiling GNU CC with the system's compiler,
-     do not use `-O'.  Some versions of the system's compiler miscompile
-     GNU CC with `-O'.
-
-   * Sometimes on a Sun 4 you may observe a crash in the program
-     `genflags' or `genoutput' while building GNU CC.  This is said to
-     be due to a bug in `sh'.  You can probably get around it by running
-     `genflags' or `genoutput' manually and then retrying the `make'.
-
-   * On Solaris 2, executables of GNU CC version 2.0.2 are commonly
-     available, but they have a bug that shows up when compiling current
-     versions of GNU CC: undefined symbol errors occur during assembly
-     if you use `-g'.
-
-     The solution is to compile the current version of GNU CC without
-     `-g'.  That makes a working compiler which you can use to recompile
-     with `-g'.
-
-   * Solaris 2 comes with a number of optional OS packages.  Some of
-     these packages are needed to use GNU CC fully.  If you did not
-     install all optional packages when installing Solaris, you will
-     need to verify that the packages that GNU CC needs are installed.
-
-     To check whether an optional package is installed, use the
-     `pkginfo' command.  To add an optional package, use the `pkgadd'
-     command.  For further details, see the Solaris documentation.
-
-     For Solaris 2.0 and 2.1, GNU CC needs six packages: `SUNWarc',
-     `SUNWbtool', `SUNWesu', `SUNWhea', `SUNWlibm', and `SUNWtoo'.
-
-     For Solaris 2.2, GNU CC needs an additional seventh package:
-     `SUNWsprot'.
-
-   * On Solaris 2, trying to use the linker and other tools in
-     `/usr/ucb' to install GNU CC has been observed to cause trouble.
-     For example, the linker may hang indefinitely.  The fix is to
-     remove `/usr/ucb' from your `PATH'.
-
-   * If you use the 1.31 version of the MIPS assembler (such as was
-     shipped with Ultrix 3.1), you will need to use the
-     -fno-delayed-branch switch when optimizing floating point code.
-     Otherwise, the assembler will complain when the GCC compiler fills
-     a branch delay slot with a floating point instruction, such as
-     `add.d'.
-
-   * If on a MIPS system you get an error message saying "does not have
-     gp sections for all it's [sic] sectons [sic]", don't worry about
-     it.  This happens whenever you use GAS with the MIPS linker, but
-     there is not really anything wrong, and it is okay to use the
-     output file.  You can stop such warnings by installing the GNU
-     linker.
-
-     It would be nice to extend GAS to produce the gp tables, but they
-     are optional, and there should not be a warning about their
-     absence.
-
-   * In Ultrix 4.0 on the MIPS machine, `stdio.h' does not work with GNU
-     CC at all unless it has been fixed with `fixincludes'.  This causes
-     problems in building GNU CC.  Once GNU CC is installed, the
-     problems go away.
-
-     To work around this problem, when making the stage 1 compiler,
-     specify this option to Make:
-
-          GCC_FOR_TARGET="./xgcc -B./ -I./include"
-
-     When making stage 2 and stage 3, specify this option:
-
-          CFLAGS="-g -I./include"
-
-   * Users have reported some problems with version 2.0 of the MIPS
-     compiler tools that were shipped with Ultrix 4.1.  Version 2.10
-     which came with Ultrix 4.2 seems to work fine.
-
-     Users have also reported some problems with version 2.20 of the
-     MIPS compiler tools that were shipped with RISC/os 4.x.  The
-     earlier version 2.11 seems to work fine.
-
-   * Some versions of the MIPS linker will issue an assertion failure
-     when linking code that uses `alloca' against shared libraries on
-     RISC-OS 5.0, and DEC's OSF/1 systems.  This is a bug in the
-     linker, that is supposed to be fixed in future revisions.  To
-     protect against this, GNU CC passes `-non_shared' to the linker
-     unless you pass an explicit `-shared' or `-call_shared' switch.
-
-   * On System V release 3, you may get this error message while
-     linking:
-
-          ld fatal: failed to write symbol name SOMETHING
-           in strings table for file WHATEVER
-
-     This probably indicates that the disk is full or your ULIMIT won't
-     allow the file to be as large as it needs to be.
-
-     This problem can also result because the kernel parameter `MAXUMEM'
-     is too small.  If so, you must regenerate the kernel and make the
-     value much larger.  The default value is reported to be 1024; a
-     value of 32768 is said to work.  Smaller values may also work.
-
-   * On System V, if you get an error like this,
-
-          /usr/local/lib/bison.simple: In function `yyparse':
-          /usr/local/lib/bison.simple:625: virtual memory exhausted
-
-     that too indicates a problem with disk space, ULIMIT, or `MAXUMEM'.
-
-   * Current GNU CC versions probably do not work on version 2 of the
-     NeXT operating system.
-
-   * On NeXTStep 3.0, the Objective C compiler does not work, due,
-     apparently, to a kernel bug that it happens to trigger.  This
-     problem does not happen on 3.1.
-
-   * On the Tower models 4N0 and 6N0, by default a process is not
-     allowed to have more than one megabyte of memory.  GNU CC cannot
-     compile itself (or many other programs) with `-O' in that much
-     memory.
-
-     To solve this problem, reconfigure the kernel adding the following
-     line to the configuration file:
-
-          MAXUMEM = 4096
-
-   * On HP 9000 series 300 or 400 running HP-UX release 8.0, there is a
-     bug in the assembler that must be fixed before GNU CC can be
-     built.  This bug manifests itself during the first stage of
-     compilation, while building `libgcc2.a':
-
-          _floatdisf
-          cc1: warning: `-g' option not supported on this version of GCC
-          cc1: warning: `-g1' option not supported on this version of GCC
-          ./xgcc: Internal compiler error: program as got fatal signal 11
-
-     A patched version of the assembler is available by anonymous ftp
-     from `altdorf.ai.mit.edu' as the file
-     `archive/cph/hpux-8.0-assembler'.  If you have HP software support,
-     the patch can also be obtained directly from HP, as described in
-     the following note:
-
-          This is the patched assembler, to patch SR#1653-010439, where
-          the assembler aborts on floating point constants.
-
-          The bug is not really in the assembler, but in the shared
-          library version of the function "cvtnum(3c)".  The bug on
-          "cvtnum(3c)" is SR#4701-078451.  Anyway, the attached
-          assembler uses the archive library version of "cvtnum(3c)"
-          and thus does not exhibit the bug.
-
-     This patch is also known as PHCO_4484.
-
-   * On HP-UX version 8.05, but not on 8.07 or more recent versions,
-     the `fixproto' shell script triggers a bug in the system shell.
-     If you encounter this problem, upgrade your operating system or
-     use BASH (the GNU shell) to run `fixproto'.
-
-   * Some versions of the Pyramid C compiler are reported to be unable
-     to compile GNU CC.  You must use an older version of GNU CC for
-     bootstrapping.  One indication of this problem is if you get a
-     crash when GNU CC compiles the function `muldi3' in file
-     `libgcc2.c'.
-
-     You may be able to succeed by getting GNU CC version 1, installing
-     it, and using it to compile GNU CC version 2.  The bug in the
-     Pyramid C compiler does not seem to affect GNU CC version 1.
-
-   * There may be similar problems on System V Release 3.1 on 386
-     systems.
-
-   * On the Intel Paragon (an i860 machine), if you are using operating
-     system version 1.0, you will get warnings or errors about
-     redefinition of `va_arg' when you build GNU CC.
-
-     If this happens, then you need to link most programs with the
-     library `iclib.a'.  You must also modify `stdio.h' as follows:
-     before the lines
-
-          #if     defined(__i860__) && !defined(_VA_LIST)
-          #include <va_list.h>
-
-     insert the line
-
-          #if __PGC__
-
-     and after the lines
-
-          extern int  vprintf(const char *, va_list );
-          extern int  vsprintf(char *, const char *, va_list );
-          #endif
-
-     insert the line
-
-          #endif /* __PGC__ */
-
-     These problems don't exist in operating system version 1.1.
-
-   * On the Altos 3068, programs compiled with GNU CC won't work unless
-     you fix a kernel bug.  This happens using system versions V.2.2
-     1.0gT1 and V.2.2 1.0e and perhaps later versions as well.  See the
-     file `README.ALTOS'.
-
-   * You will get several sorts of compilation and linking errors on the
-     we32k if you don't follow the special instructions.  *Note
-     Configurations::.
-
-   * A bug in the HP-UX 8.05 (and earlier) shell will cause the fixproto
-     program to report an error of the form:
-
-          ./fixproto: sh internal 1K buffer overflow
-
-     To fix this, change the first line of the fixproto script to look
-     like:
-
-          #!/bin/ksh
-
-\1f
-File: gcc.info,  Node: Cross-Compiler Problems,  Next: Interoperation,  Prev: Installation Problems,  Up: Trouble
-
-Cross-Compiler Problems
-=======================
-
-   You may run into problems with cross compilation on certain machines,
-for several reasons.
-
-   * Cross compilation can run into trouble for certain machines because
-     some target machines' assemblers require floating point numbers to
-     be written as *integer* constants in certain contexts.
-
-     The compiler writes these integer constants by examining the
-     floating point value as an integer and printing that integer,
-     because this is simple to write and independent of the details of
-     the floating point representation.  But this does not work if the
-     compiler is running on a different machine with an incompatible
-     floating point format, or even a different byte-ordering.
-
-     In addition, correct constant folding of floating point values
-     requires representing them in the target machine's format.  (The C
-     standard does not quite require this, but in practice it is the
-     only way to win.)
-
-     It is now possible to overcome these problems by defining macros
-     such as `REAL_VALUE_TYPE'.  But doing so is a substantial amount of
-     work for each target machine.  *Note Cross-compilation::.
-
-   * At present, the program `mips-tfile' which adds debug support to
-     object files on MIPS systems does not work in a cross compile
-     environment.
-
-\1f
-File: gcc.info,  Node: Interoperation,  Next: External Bugs,  Prev: Cross-Compiler Problems,  Up: Trouble
-
-Interoperation
-==============
-
-   This section lists various difficulties encountered in using GNU C or
-GNU C++ together with other compilers or with the assemblers, linkers,
-libraries and debuggers on certain systems.
-
-   * Objective C does not work on the RS/6000.
-
-   * GNU C++ does not do name mangling in the same way as other C++
-     compilers.  This means that object files compiled with one compiler
-     cannot be used with another.
-
-     This effect is intentional, to protect you from more subtle
-     problems.  Compilers differ as to many internal details of C++
-     implementation, including: how class instances are laid out, how
-     multiple inheritance is implemented, and how virtual function
-     calls are handled.  If the name encoding were made the same, your
-     programs would link against libraries provided from other
-     compilers--but the programs would then crash when run.
-     Incompatible libraries are then detected at link time, rather than
-     at run time.
-
-   * Older GDB versions sometimes fail to read the output of GNU CC
-     version 2.  If you have trouble, get GDB version 4.4 or later.
-
-   * DBX rejects some files produced by GNU CC, though it accepts
-     similar constructs in output from PCC.  Until someone can supply a
-     coherent description of what is valid DBX input and what is not,
-     there is nothing I can do about these problems.  You are on your
-     own.
-
-   * The GNU assembler (GAS) does not support PIC.  To generate PIC
-     code, you must use some other assembler, such as `/bin/as'.
-
-   * On some BSD systems, including some versions of Ultrix, use of
-     profiling causes static variable destructors (currently used only
-     in C++) not to be run.
-
-   * Use of `-I/usr/include' may cause trouble.
-
-     Many systems come with header files that won't work with GNU CC
-     unless corrected by `fixincludes'.  The corrected header files go
-     in a new directory; GNU CC searches this directory before
-     `/usr/include'.  If you use `-I/usr/include', this tells GNU CC to
-     search `/usr/include' earlier on, before the corrected headers.
-     The result is that you get the uncorrected header files.
-
-     Instead, you should use these options (when compiling C programs):
-
-          -I/usr/local/lib/gcc-lib/TARGET/VERSION/include -I/usr/include
-
-     For C++ programs, GNU CC also uses a special directory that
-     defines C++ interfaces to standard C subroutines.  This directory
-     is meant to be searched *before* other standard include
-     directories, so that it takes precedence.  If you are compiling
-     C++ programs and specifying include directories explicitly, use
-     this option first, then the two options above:
-
-          -I/usr/local/lib/g++-include
-
-   * On some SGI systems, when you use `-lgl_s' as an option, it gets
-     translated magically to `-lgl_s -lX11_s -lc_s'.  Naturally, this
-     does not happen when you use GNU CC.  You must specify all three
-     options explicitly.
-
-   * On a Sparc, GNU CC aligns all values of type `double' on an 8-byte
-     boundary, and it expects every `double' to be so aligned.  The Sun
-     compiler usually gives `double' values 8-byte alignment, with one
-     exception: function arguments of type `double' may not be aligned.
-
-     As a result, if a function compiled with Sun CC takes the address
-     of an argument of type `double' and passes this pointer of type
-     `double *' to a function compiled with GNU CC, dereferencing the
-     pointer may cause a fatal signal.
-
-     One way to solve this problem is to compile your entire program
-     with GNU CC.  Another solution is to modify the function that is
-     compiled with Sun CC to copy the argument into a local variable;
-     local variables are always properly aligned.  A third solution is
-     to modify the function that uses the pointer to dereference it via
-     the following function `access_double' instead of directly with
-     `*':
-
-          inline double
-          access_double (double *unaligned_ptr)
-          {
-            union d2i { double d; int i[2]; };
-          
-            union d2i *p = (union d2i *) unaligned_ptr;
-            union d2i u;
-          
-            u.i[0] = p->i[0];
-            u.i[1] = p->i[1];
-          
-            return u.d;
-          }
-
-     Storing into the pointer can be done likewise with the same union.
-
-   * On Solaris, the `malloc' function in the `libmalloc.a' library may
-     allocate memory that is only 4 byte aligned.  Since GNU CC on the
-     Sparc assumes that doubles are 8 byte aligned, this may result in a
-     fatal signal if doubles are stored in memory allocated by the
-     `libmalloc.a' library.
-
-     The solution is to not use the `libmalloc.a' library.  Use instead
-     `malloc' and related functions from `libc.a'; they do not have
-     this problem.
-
-   * Sun forgot to include a static version of `libdl.a' with some
-     versions of SunOS (mainly 4.1).  This results in undefined symbols
-     when linking static binaries (that is, if you use `-static').  If
-     you see undefined symbols `_dlclose', `_dlsym' or `_dlopen' when
-     linking, compile and link against the file `mit/util/misc/dlsym.c'
-     from the MIT version of X windows.
-
-   * The 128-bit long double format that the Sparc port supports
-     currently works by using the architecturally defined quad-word
-     floating point instructions.  Since there is no hardware that
-     supports these instructions they must be emulated by the operating
-     system.  Long doubles do not work in Sun OS versions 4.0.3 and
-     earlier, because the kernel emulator uses an obsolete and
-     incompatible format.  Long doubles do not work in Sun OS version
-     4.1.1 due to a problem in a Sun library.  Long doubles do work on
-     Sun OS versions 4.1.2 and higher, but GNU CC does not enable them
-     by default.  Long doubles appear to work in Sun OS 5.x (Solaris
-     2.x).
-
-   * On HP-UX version 9.01 on the HP PA, the HP compiler `cc' does not
-     compile GNU CC correctly.  We do not yet know why.  However, GNU CC
-     compiled on earlier HP-UX versions works properly on HP-UX 9.01
-     and can compile itself properly on 9.01.
-
-   * On the HP PA machine, ADB sometimes fails to work on functions
-     compiled with GNU CC.  Specifically, it fails to work on functions
-     that use `alloca' or variable-size arrays.  This is because GNU CC
-     doesn't generate HP-UX unwind descriptors for such functions.  It
-     may even be impossible to generate them.
-
-   * Debugging (`-g') is not supported on the HP PA machine, unless you
-     use the preliminary GNU tools (*note Installation::.).
-
-   * Taking the address of a label may generate errors from the HP-UX
-     PA assembler.  GAS for the PA does not have this problem.
-
-   * Using floating point parameters for indirect calls to static
-     functions will not work when using the HP assembler.  There simply
-     is no way for GCC to specify what registers hold arguments for
-     static functions when using the HP assembler.  GAS for the PA does
-     not have this problem.
-
-   * In extremely rare cases involving some very large functions you may
-     receive errors from the HP linker complaining about an out of
-     bounds unconditional branch offset.  This used to occur more often
-     in previous versions of GNU CC, but is now exceptionally rare.  If
-     you should run into it, you can work around by making your
-     function smaller.
-
-   * GNU CC compiled code sometimes emits warnings from the HP-UX
-     assembler of the form:
-
-          (warning) Use of GR3 when
-            frame >= 8192 may cause conflict.
-
-     These warnings are harmless and can be safely ignored.
-
-   * The current version of the assembler (`/bin/as') for the RS/6000
-     has certain problems that prevent the `-g' option in GCC from
-     working.  Note that `Makefile.in' uses `-g' by default when
-     compiling `libgcc2.c'.
-
-     IBM has produced a fixed version of the assembler.  The upgraded
-     assembler unfortunately was not included in any of the AIX 3.2
-     update PTF releases (3.2.2, 3.2.3, or 3.2.3e).  Users of AIX 3.1
-     should request PTF U403044 from IBM and users of AIX 3.2 should
-     request PTF U416277.  See the file `README.RS6000' for more
-     details on these updates.
-
-     You can test for the presense of a fixed assembler by using the
-     command
-
-          as -u < /dev/null
-
-     If the command exits normally, the assembler fix already is
-     installed.  If the assembler complains that "-u" is an unknown
-     flag, you need to order the fix.
-
-   * On the IBM RS/6000, compiling code of the form
-
-          extern int foo;
-          
-          ... foo ...
-          
-          static int foo;
-
-     will cause the linker to report an undefined symbol `foo'.
-     Although this behavior differs from most other systems, it is not a
-     bug because redefining an `extern' variable as `static' is
-     undefined in ANSI C.
-
-   * AIX on the RS/6000 provides support (NLS) for environments outside
-     of the United States.  Compilers and assemblers use NLS to support
-     locale-specific representations of various objects including
-     floating-point numbers ("." vs "," for separating decimal
-     fractions).  There have been problems reported where the library
-     linked with GCC does not produce the same floating-point formats
-     that the assembler accepts.  If you have this problem, set the
-     LANG environment variable to "C" or "En_US".
-
-   * Even if you specify `-fdollars-in-identifiers', you cannot
-     successfully use `$' in identifiers on the RS/6000 due to a
-     restriction in the IBM assembler.  GAS supports these identifiers.
-
-   * On the RS/6000, XLC version 1.3.0.0 will miscompile `jump.c'.  XLC
-     version 1.3.0.1 or later fixes this problem.  You can obtain
-     XLC-1.3.0.2 by requesting PTF 421749 from IBM.
-
-   * There is an assembler bug in versions of DG/UX prior to 5.4.2.01
-     that occurs when the `fldcr' instruction is used.  GNU CC uses
-     `fldcr' on the 88100 to serialize volatile memory references.  Use
-     the option `-mno-serialize-volatile' if your version of the
-     assembler has this bug.
-
-   * On VMS, GAS versions 1.38.1 and earlier may cause spurious warning
-     messages from the linker.  These warning messages complain of
-     mismatched psect attributes.  You can ignore them.  *Note VMS
-     Install::.
-
-   * On NewsOS version 3, if you include both of the files `stddef.h'
-     and `sys/types.h', you get an error because there are two typedefs
-     of `size_t'.  You should change `sys/types.h' by adding these
-     lines around the definition of `size_t':
-
-          #ifndef _SIZE_T
-          #define _SIZE_T
-          ACTUAL TYPEDEF HERE
-          #endif
-
-   * On the Alliant, the system's own convention for returning
-     structures and unions is unusual, and is not compatible with GNU
-     CC no matter what options are used.
-
-   * On the IBM RT PC, the MetaWare HighC compiler (hc) uses a different
-     convention for structure and union returning.  Use the option
-     `-mhc-struct-return' to tell GNU CC to use a convention compatible
-     with it.
-
-   * On Ultrix, the Fortran compiler expects registers 2 through 5 to
-     be saved by function calls.  However, the C compiler uses
-     conventions compatible with BSD Unix: registers 2 through 5 may be
-     clobbered by function calls.
-
-     GNU CC uses the same convention as the Ultrix C compiler.  You can
-     use these options to produce code compatible with the Fortran
-     compiler:
-
-          -fcall-saved-r2 -fcall-saved-r3 -fcall-saved-r4 -fcall-saved-r5
-
-   * On the WE32k, you may find that programs compiled with GNU CC do
-     not work with the standard shared C library.  You may need to link
-     with the ordinary C compiler.  If you do so, you must specify the
-     following options:
-
-          -L/usr/local/lib/gcc-lib/we32k-att-sysv/2.7.1 -lgcc -lc_s
-
-     The first specifies where to find the library `libgcc.a' specified
-     with the `-lgcc' option.
-
-     GNU CC does linking by invoking `ld', just as `cc' does, and there
-     is no reason why it *should* matter which compilation program you
-     use to invoke `ld'.  If someone tracks this problem down, it can
-     probably be fixed easily.
-
-   * On the Alpha, you may get assembler errors about invalid syntax as
-     a result of floating point constants.  This is due to a bug in the
-     C library functions `ecvt', `fcvt' and `gcvt'.  Given valid
-     floating point numbers, they sometimes print `NaN'.
-
-   * On Irix 4.0.5F (and perhaps in some other versions), an assembler
-     bug sometimes reorders instructions incorrectly when optimization
-     is turned on.  If you think this may be happening to you, try
-     using the GNU assembler; GAS version 2.1 supports ECOFF on Irix.
-
-     Or use the `-noasmopt' option when you compile GNU CC with itself,
-     and then again when you compile your program.  (This is a temporary
-     kludge to turn off assembler optimization on Irix.)  If this
-     proves to be what you need, edit the assembler spec in the file
-     `specs' so that it unconditionally passes `-O0' to the assembler,
-     and never passes `-O2' or `-O3'.
-
diff --git a/gcc/gcc.info-12 b/gcc/gcc.info-12
deleted file mode 100644 (file)
index 7cc8309..0000000
+++ /dev/null
@@ -1,999 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: External Bugs,  Next: Incompatibilities,  Prev: Interoperation,  Up: Trouble
-
-Problems Compiling Certain Programs
-===================================
-
-   Certain programs have problems compiling.
-
-   * Parse errors may occur compiling X11 on a Decstation running
-     Ultrix 4.2 because of problems in DEC's versions of the X11 header
-     files `X11/Xlib.h' and `X11/Xutil.h'.  People recommend adding
-     `-I/usr/include/mit' to use the MIT versions of the header files,
-     using the `-traditional' switch to turn off ANSI C, or fixing the
-     header files by adding this:
-
-          #ifdef __STDC__
-          #define NeedFunctionPrototypes 0
-          #endif
-
-   * If you have trouble compiling Perl on a SunOS 4 system, it may be
-     because Perl specifies `-I/usr/ucbinclude'.  This accesses the
-     unfixed header files.  Perl specifies the options
-
-          -traditional -Dvolatile=__volatile__
-          -I/usr/include/sun -I/usr/ucbinclude
-          -fpcc-struct-return
-
-     most of which are unnecessary with GCC 2.4.5 and newer versions.
-     You can make a properly working Perl by setting `ccflags' to
-     `-fwritable-strings' (implied by the `-traditional' in the
-     original options) and `cppflags' to empty in `config.sh', then
-     typing `./doSH; make depend; make'.
-
-   * On various 386 Unix systems derived from System V, including SCO,
-     ISC, and ESIX, you may get error messages about running out of
-     virtual memory while compiling certain programs.
-
-     You can prevent this problem by linking GNU CC with the GNU malloc
-     (which thus replaces the malloc that comes with the system).  GNU
-     malloc is available as a separate package, and also in the file
-     `src/gmalloc.c' in the GNU Emacs 19 distribution.
-
-     If you have installed GNU malloc as a separate library package,
-     use this option when you relink GNU CC:
-
-          MALLOC=/usr/local/lib/libgmalloc.a
-
-     Alternatively, if you have compiled `gmalloc.c' from Emacs 19, copy
-     the object file to `gmalloc.o' and use this option when you relink
-     GNU CC:
-
-          MALLOC=gmalloc.o
-
-\1f
-File: gcc.info,  Node: Incompatibilities,  Next: Fixed Headers,  Prev: External Bugs,  Up: Trouble
-
-Incompatibilities of GNU CC
-===========================
-
-   There are several noteworthy incompatibilities between GNU C and most
-existing (non-ANSI) versions of C.  The `-traditional' option
-eliminates many of these incompatibilities, *but not all*, by telling
-GNU C to behave like the other C compilers.
-
-   * GNU CC normally makes string constants read-only.  If several
-     identical-looking string constants are used, GNU CC stores only one
-     copy of the string.
-
-     One consequence is that you cannot call `mktemp' with a string
-     constant argument.  The function `mktemp' always alters the string
-     its argument points to.
-
-     Another consequence is that `sscanf' does not work on some systems
-     when passed a string constant as its format control string or
-     input.  This is because `sscanf' incorrectly tries to write into
-     the string constant.  Likewise `fscanf' and `scanf'.
-
-     The best solution to these problems is to change the program to use
-     `char'-array variables with initialization strings for these
-     purposes instead of string constants.  But if this is not possible,
-     you can use the `-fwritable-strings' flag, which directs GNU CC to
-     handle string constants the same way most C compilers do.
-     `-traditional' also has this effect, among others.
-
-   * `-2147483648' is positive.
-
-     This is because 2147483648 cannot fit in the type `int', so
-     (following the ANSI C rules) its data type is `unsigned long int'.
-     Negating this value yields 2147483648 again.
-
-   * GNU CC does not substitute macro arguments when they appear inside
-     of string constants.  For example, the following macro in GNU CC
-
-          #define foo(a) "a"
-
-     will produce output `"a"' regardless of what the argument A is.
-
-     The `-traditional' option directs GNU CC to handle such cases
-     (among others) in the old-fashioned (non-ANSI) fashion.
-
-   * When you use `setjmp' and `longjmp', the only automatic variables
-     guaranteed to remain valid are those declared `volatile'.  This is
-     a consequence of automatic register allocation.  Consider this
-     function:
-
-          jmp_buf j;
-          
-          foo ()
-          {
-            int a, b;
-          
-            a = fun1 ();
-            if (setjmp (j))
-              return a;
-          
-            a = fun2 ();
-            /* `longjmp (j)' may occur in `fun3'. */
-            return a + fun3 ();
-          }
-
-     Here `a' may or may not be restored to its first value when the
-     `longjmp' occurs.  If `a' is allocated in a register, then its
-     first value is restored; otherwise, it keeps the last value stored
-     in it.
-
-     If you use the `-W' option with the `-O' option, you will get a
-     warning when GNU CC thinks such a problem might be possible.
-
-     The `-traditional' option directs GNU C to put variables in the
-     stack by default, rather than in registers, in functions that call
-     `setjmp'.  This results in the behavior found in traditional C
-     compilers.
-
-   * Programs that use preprocessing directives in the middle of macro
-     arguments do not work with GNU CC.  For example, a program like
-     this will not work:
-
-          foobar (
-          #define luser
-                  hack)
-
-     ANSI C does not permit such a construct.  It would make sense to
-     support it when `-traditional' is used, but it is too much work to
-     implement.
-
-   * Declarations of external variables and functions within a block
-     apply only to the block containing the declaration.  In other
-     words, they have the same scope as any other declaration in the
-     same place.
-
-     In some other C compilers, a `extern' declaration affects all the
-     rest of the file even if it happens within a block.
-
-     The `-traditional' option directs GNU C to treat all `extern'
-     declarations as global, like traditional compilers.
-
-   * In traditional C, you can combine `long', etc., with a typedef
-     name, as shown here:
-
-          typedef int foo;
-          typedef long foo bar;
-
-     In ANSI C, this is not allowed: `long' and other type modifiers
-     require an explicit `int'.  Because this criterion is expressed by
-     Bison grammar rules rather than C code, the `-traditional' flag
-     cannot alter it.
-
-   * PCC allows typedef names to be used as function parameters.  The
-     difficulty described immediately above applies here too.
-
-   * PCC allows whitespace in the middle of compound assignment
-     operators such as `+='.  GNU CC, following the ANSI standard, does
-     not allow this.  The difficulty described immediately above
-     applies here too.
-
-   * GNU CC complains about unterminated character constants inside of
-     preprocessing conditionals that fail.  Some programs have English
-     comments enclosed in conditionals that are guaranteed to fail; if
-     these comments contain apostrophes, GNU CC will probably report an
-     error.  For example, this code would produce an error:
-
-          #if 0
-          You can't expect this to work.
-          #endif
-
-     The best solution to such a problem is to put the text into an
-     actual C comment delimited by `/*...*/'.  However, `-traditional'
-     suppresses these error messages.
-
-   * Many user programs contain the declaration `long time ();'.  In the
-     past, the system header files on many systems did not actually
-     declare `time', so it did not matter what type your program
-     declared it to return.  But in systems with ANSI C headers, `time'
-     is declared to return `time_t', and if that is not the same as
-     `long', then `long time ();' is erroneous.
-
-     The solution is to change your program to use `time_t' as the
-     return type of `time'.
-
-   * When compiling functions that return `float', PCC converts it to a
-     double.  GNU CC actually returns a `float'.  If you are concerned
-     with PCC compatibility, you should declare your functions to return
-     `double'; you might as well say what you mean.
-
-   * When compiling functions that return structures or unions, GNU CC
-     output code normally uses a method different from that used on most
-     versions of Unix.  As a result, code compiled with GNU CC cannot
-     call a structure-returning function compiled with PCC, and vice
-     versa.
-
-     The method used by GNU CC is as follows: a structure or union
-     which is 1, 2, 4 or 8 bytes long is returned like a scalar.  A
-     structure or union with any other size is stored into an address
-     supplied by the caller (usually in a special, fixed register, but
-     on some machines it is passed on the stack).  The
-     machine-description macros `STRUCT_VALUE' and
-     `STRUCT_INCOMING_VALUE' tell GNU CC where to pass this address.
-
-     By contrast, PCC on most target machines returns structures and
-     unions of any size by copying the data into an area of static
-     storage, and then returning the address of that storage as if it
-     were a pointer value.  The caller must copy the data from that
-     memory area to the place where the value is wanted.  GNU CC does
-     not use this method because it is slower and nonreentrant.
-
-     On some newer machines, PCC uses a reentrant convention for all
-     structure and union returning.  GNU CC on most of these machines
-     uses a compatible convention when returning structures and unions
-     in memory, but still returns small structures and unions in
-     registers.
-
-     You can tell GNU CC to use a compatible convention for all
-     structure and union returning with the option
-     `-fpcc-struct-return'.
-
-   * GNU C complains about program fragments such as `0x74ae-0x4000'
-     which appear to be two hexadecimal constants separated by the minus
-     operator.  Actually, this string is a single "preprocessing token".
-     Each such token must correspond to one token in C.  Since this
-     does not, GNU C prints an error message.  Although it may appear
-     obvious that what is meant is an operator and two values, the ANSI
-     C standard specifically requires that this be treated as erroneous.
-
-     A "preprocessing token" is a "preprocessing number" if it begins
-     with a digit and is followed by letters, underscores, digits,
-     periods and `e+', `e-', `E+', or `E-' character sequences.
-
-     To make the above program fragment valid, place whitespace in
-     front of the minus sign.  This whitespace will end the
-     preprocessing number.
-
-\1f
-File: gcc.info,  Node: Fixed Headers,  Next: Standard Libraries,  Prev: Incompatibilities,  Up: Trouble
-
-Fixed Header Files
-==================
-
-   GNU CC needs to install corrected versions of some system header
-files.  This is because most target systems have some header files that
-won't work with GNU CC unless they are changed.  Some have bugs, some
-are incompatible with ANSI C, and some depend on special features of
-other compilers.
-
-   Installing GNU CC automatically creates and installs the fixed header
-files, by running a program called `fixincludes' (or for certain
-targets an alternative such as `fixinc.svr4').  Normally, you don't
-need to pay attention to this.  But there are cases where it doesn't do
-the right thing automatically.
-
-   * If you update the system's header files, such as by installing a
-     new system version, the fixed header files of GNU CC are not
-     automatically updated.  The easiest way to update them is to
-     reinstall GNU CC.  (If you want to be clever, look in the makefile
-     and you can find a shortcut.)
-
-   * On some systems, in particular SunOS 4, header file directories
-     contain machine-specific symbolic links in certain places.  This
-     makes it possible to share most of the header files among hosts
-     running the same version of SunOS 4 on different machine models.
-
-     The programs that fix the header files do not understand this
-     special way of using symbolic links; therefore, the directory of
-     fixed header files is good only for the machine model used to
-     build it.
-
-     In SunOS 4, only programs that look inside the kernel will notice
-     the difference between machine models.  Therefore, for most
-     purposes, you need not be concerned about this.
-
-     It is possible to make separate sets of fixed header files for the
-     different machine models, and arrange a structure of symbolic
-     links so as to use the proper set, but you'll have to do this by
-     hand.
-
-   * On Lynxos, GNU CC by default does not fix the header files.  This
-     is because bugs in the shell cause the `fixincludes' script to
-     fail.
-
-     This means you will encounter problems due to bugs in the system
-     header files.  It may be no comfort that they aren't GNU CC's
-     fault, but it does mean that there's nothing for us to do about
-     them.
-
-\1f
-File: gcc.info,  Node: Standard Libraries,  Next: Disappointments,  Prev: Fixed Headers,  Up: Trouble
-
-Standard Libraries
-==================
-
-   GNU CC by itself attempts to be what the ISO/ANSI C standard calls a
-"conforming freestanding implementation".  This means all ANSI C
-language features are available, as well as the contents of `float.h',
-`limits.h', `stdarg.h', and `stddef.h'.  The rest of the C library is
-supplied by the vendor of the operating system.  If that C library
-doesn't conform to the C standards, then your programs might get
-warnings (especially when using `-Wall') that you don't expect.
-
-   For example, the `sprintf' function on SunOS 4.1.3 returns `char *'
-while the C standard says that `sprintf' returns an `int'.  The
-`fixincludes' program could make the prototype for this function match
-the Standard, but that would be wrong, since the function will still
-return `char *'.
-
-   If you need a Standard compliant library, then you need to find one,
-as GNU CC does not provide one.  The GNU C library (called `glibc') has
-been ported to a number of operating systems, and provides ANSI/ISO,
-POSIX, BSD and SystemV compatibility.  You could also ask your operating
-system vendor if newer libraries are available.
-
-\1f
-File: gcc.info,  Node: Disappointments,  Next: C++ Misunderstandings,  Prev: Standard Libraries,  Up: Trouble
-
-Disappointments and Misunderstandings
-=====================================
-
-   These problems are perhaps regrettable, but we don't know any
-practical way around them.
-
-   * Certain local variables aren't recognized by debuggers when you
-     compile with optimization.
-
-     This occurs because sometimes GNU CC optimizes the variable out of
-     existence.  There is no way to tell the debugger how to compute the
-     value such a variable "would have had", and it is not clear that
-     would be desirable anyway.  So GNU CC simply does not mention the
-     eliminated variable when it writes debugging information.
-
-     You have to expect a certain amount of disagreement between the
-     executable and your source code, when you use optimization.
-
-   * Users often think it is a bug when GNU CC reports an error for code
-     like this:
-
-          int foo (struct mumble *);
-          
-          struct mumble { ... };
-          
-          int foo (struct mumble *x)
-          { ... }
-
-     This code really is erroneous, because the scope of `struct
-     mumble' in the prototype is limited to the argument list
-     containing it.  It does not refer to the `struct mumble' defined
-     with file scope immediately below--they are two unrelated types
-     with similar names in different scopes.
-
-     But in the definition of `foo', the file-scope type is used
-     because that is available to be inherited.  Thus, the definition
-     and the prototype do not match, and you get an error.
-
-     This behavior may seem silly, but it's what the ANSI standard
-     specifies.  It is easy enough for you to make your code work by
-     moving the definition of `struct mumble' above the prototype.
-     It's not worth being incompatible with ANSI C just to avoid an
-     error for the example shown above.
-
-   * Accesses to bitfields even in volatile objects works by accessing
-     larger objects, such as a byte or a word.  You cannot rely on what
-     size of object is accessed in order to read or write the bitfield;
-     it may even vary for a given bitfield according to the precise
-     usage.
-
-     If you care about controlling the amount of memory that is
-     accessed, use volatile but do not use bitfields.
-
-   * GNU CC comes with shell scripts to fix certain known problems in
-     system header files.  They install corrected copies of various
-     header files in a special directory where only GNU CC will
-     normally look for them.  The scripts adapt to various systems by
-     searching all the system header files for the problem cases that
-     we know about.
-
-     If new system header files are installed, nothing automatically
-     arranges to update the corrected header files.  You will have to
-     reinstall GNU CC to fix the new header files.  More specifically,
-     go to the build directory and delete the files `stmp-fixinc' and
-     `stmp-headers', and the subdirectory `include'; then do `make
-     install' again.
-
-   * On 68000 and x86 systems, for instance, you can get paradoxical
-     results if you test the precise values of floating point numbers.
-     For example, you can find that a floating point value which is not
-     a NaN is not equal to itself.  This results from the fact that the
-     floating point registers hold a few more bits of precision than
-     fit in a `double' in memory.  Compiled code moves values between
-     memory and floating point registers at its convenience, and moving
-     them into memory truncates them.
-
-     You can partially avoid this problem by using the `-ffloat-store'
-     option (*note Optimize Options::.).
-
-   * On the MIPS, variable argument functions using `varargs.h' cannot
-     have a floating point value for the first argument.  The reason
-     for this is that in the absence of a prototype in scope, if the
-     first argument is a floating point, it is passed in a floating
-     point register, rather than an integer register.
-
-     If the code is rewritten to use the ANSI standard `stdarg.h'
-     method of variable arguments, and the prototype is in scope at the
-     time of the call, everything will work fine.
-
-   * On the H8/300 and H8/300H, variable argument functions must be
-     implemented using the ANSI standard `stdarg.h' method of variable
-     arguments.  Furthermore, calls to functions using `stdarg.h'
-     variable arguments must have a prototype for the called function
-     in scope at the time of the call.
-
-\1f
-File: gcc.info,  Node: C++ Misunderstandings,  Next: Protoize Caveats,  Prev: Disappointments,  Up: Trouble
-
-Common Misunderstandings with GNU C++
-=====================================
-
-   C++ is a complex language and an evolving one, and its standard
-definition (the ANSI C++ draft standard) is also evolving.  As a result,
-your C++ compiler may occasionally surprise you, even when its behavior
-is correct.  This section discusses some areas that frequently give
-rise to questions of this sort.
-
-* Menu:
-
-* Static Definitions::  Static member declarations are not definitions
-* Temporaries::         Temporaries may vanish before you expect
-
-\1f
-File: gcc.info,  Node: Static Definitions,  Next: Temporaries,  Up: C++ Misunderstandings
-
-Declare *and* Define Static Members
------------------------------------
-
-   When a class has static data members, it is not enough to *declare*
-the static member; you must also *define* it.  For example:
-
-     class Foo
-     {
-       ...
-       void method();
-       static int bar;
-     };
-
-   This declaration only establishes that the class `Foo' has an `int'
-named `Foo::bar', and a member function named `Foo::method'.  But you
-still need to define *both* `method' and `bar' elsewhere.  According to
-the draft ANSI standard, you must supply an initializer in one (and
-only one) source file, such as:
-
-     int Foo::bar = 0;
-
-   Other C++ compilers may not correctly implement the standard
-behavior.  As a result, when you switch to `g++' from one of these
-compilers, you may discover that a program that appeared to work
-correctly in fact does not conform to the standard: `g++' reports as
-undefined symbols any static data members that lack definitions.
-
-\1f
-File: gcc.info,  Node: Temporaries,  Prev: Static Definitions,  Up: C++ Misunderstandings
-
-Temporaries May Vanish Before You Expect
-----------------------------------------
-
-   It is dangerous to use pointers or references to *portions* of a
-temporary object.  The compiler may very well delete the object before
-you expect it to, leaving a pointer to garbage.  The most common place
-where this problem crops up is in classes like the libg++ `String'
-class, that define a conversion function to type `char *' or `const
-char *'.  However, any class that returns a pointer to some internal
-structure is potentially subject to this problem.
-
-   For example, a program may use a function `strfunc' that returns
-`String' objects, and another function `charfunc' that operates on
-pointers to `char':
-
-     String strfunc ();
-     void charfunc (const char *);
-
-In this situation, it may seem natural to write
-`charfunc (strfunc ());' based on the knowledge that class `String' has
-an explicit conversion to `char' pointers.  However, what really
-happens is akin to `charfunc (strfunc ().convert ());', where the
-`convert' method is a function to do the same data conversion normally
-performed by a cast.  Since the last use of the temporary `String'
-object is the call to the conversion function, the compiler may delete
-that object before actually calling `charfunc'.  The compiler has no
-way of knowing that deleting the `String' object will invalidate the
-pointer.  The pointer then points to garbage, so that by the time
-`charfunc' is called, it gets an invalid argument.
-
-   Code like this may run successfully under some other compilers,
-especially those that delete temporaries relatively late.  However, the
-GNU C++ behavior is also standard-conforming, so if your program depends
-on late destruction of temporaries it is not portable.
-
-   If you think this is surprising, you should be aware that the ANSI
-C++ committee continues to debate the lifetime-of-temporaries problem.
-
-   For now, at least, the safe way to write such code is to give the
-temporary a name, which forces it to remain until the end of the scope
-of the name.  For example:
-
-     String& tmp = strfunc ();
-     charfunc (tmp);
-
-\1f
-File: gcc.info,  Node: Protoize Caveats,  Next: Non-bugs,  Prev: C++ Misunderstandings,  Up: Trouble
-
-Caveats of using `protoize'
-===========================
-
-   The conversion programs `protoize' and `unprotoize' can sometimes
-change a source file in a way that won't work unless you rearrange it.
-
-   * `protoize' can insert references to a type name or type tag before
-     the definition, or in a file where they are not defined.
-
-     If this happens, compiler error messages should show you where the
-     new references are, so fixing the file by hand is straightforward.
-
-   * There are some C constructs which `protoize' cannot figure out.
-     For example, it can't determine argument types for declaring a
-     pointer-to-function variable; this you must do by hand.  `protoize'
-     inserts a comment containing `???' each time it finds such a
-     variable; so you can find all such variables by searching for this
-     string.  ANSI C does not require declaring the argument types of
-     pointer-to-function types.
-
-   * Using `unprotoize' can easily introduce bugs.  If the program
-     relied on prototypes to bring about conversion of arguments, these
-     conversions will not take place in the program without prototypes.
-     One case in which you can be sure `unprotoize' is safe is when you
-     are removing prototypes that were made with `protoize'; if the
-     program worked before without any prototypes, it will work again
-     without them.
-
-     You can find all the places where this problem might occur by
-     compiling the program with the `-Wconversion' option.  It prints a
-     warning whenever an argument is converted.
-
-   * Both conversion programs can be confused if there are macro calls
-     in and around the text to be converted.  In other words, the
-     standard syntax for a declaration or definition must not result
-     from expanding a macro.  This problem is inherent in the design of
-     C and cannot be fixed.  If only a few functions have confusing
-     macro calls, you can easily convert them manually.
-
-   * `protoize' cannot get the argument types for a function whose
-     definition was not actually compiled due to preprocessing
-     conditionals.  When this happens, `protoize' changes nothing in
-     regard to such a function.  `protoize' tries to detect such
-     instances and warn about them.
-
-     You can generally work around this problem by using `protoize' step
-     by step, each time specifying a different set of `-D' options for
-     compilation, until all of the functions have been converted.
-     There is no automatic way to verify that you have got them all,
-     however.
-
-   * Confusion may result if there is an occasion to convert a function
-     declaration or definition in a region of source code where there
-     is more than one formal parameter list present.  Thus, attempts to
-     convert code containing multiple (conditionally compiled) versions
-     of a single function header (in the same vicinity) may not produce
-     the desired (or expected) results.
-
-     If you plan on converting source files which contain such code, it
-     is recommended that you first make sure that each conditionally
-     compiled region of source code which contains an alternative
-     function header also contains at least one additional follower
-     token (past the final right parenthesis of the function header).
-     This should circumvent the problem.
-
-   * `unprotoize' can become confused when trying to convert a function
-     definition or declaration which contains a declaration for a
-     pointer-to-function formal argument which has the same name as the
-     function being defined or declared.  We recommand you avoid such
-     choices of formal parameter names.
-
-   * You might also want to correct some of the indentation by hand and
-     break long lines.  (The conversion programs don't write lines
-     longer than eighty characters in any case.)
-
-\1f
-File: gcc.info,  Node: Non-bugs,  Next: Warnings and Errors,  Prev: Protoize Caveats,  Up: Trouble
-
-Certain Changes We Don't Want to Make
-=====================================
-
-   This section lists changes that people frequently request, but which
-we do not make because we think GNU CC is better without them.
-
-   * Checking the number and type of arguments to a function which has
-     an old-fashioned definition and no prototype.
-
-     Such a feature would work only occasionally--only for calls that
-     appear in the same file as the called function, following the
-     definition.  The only way to check all calls reliably is to add a
-     prototype for the function.  But adding a prototype eliminates the
-     motivation for this feature.  So the feature is not worthwhile.
-
-   * Warning about using an expression whose type is signed as a shift
-     count.
-
-     Shift count operands are probably signed more often than unsigned.
-     Warning about this would cause far more annoyance than good.
-
-   * Warning about assigning a signed value to an unsigned variable.
-
-     Such assignments must be very common; warning about them would
-     cause more annoyance than good.
-
-   * Warning about unreachable code.
-
-     It's very common to have unreachable code in machine-generated
-     programs.  For example, this happens normally in some files of GNU
-     C itself.
-
-   * Warning when a non-void function value is ignored.
-
-     Coming as I do from a Lisp background, I balk at the idea that
-     there is something dangerous about discarding a value.  There are
-     functions that return values which some callers may find useful;
-     it makes no sense to clutter the program with a cast to `void'
-     whenever the value isn't useful.
-
-   * Assuming (for optimization) that the address of an external symbol
-     is never zero.
-
-     This assumption is false on certain systems when `#pragma weak' is
-     used.
-
-   * Making `-fshort-enums' the default.
-
-     This would cause storage layout to be incompatible with most other
-     C compilers.  And it doesn't seem very important, given that you
-     can get the same result in other ways.  The case where it matters
-     most is when the enumeration-valued object is inside a structure,
-     and in that case you can specify a field width explicitly.
-
-   * Making bitfields unsigned by default on particular machines where
-     "the ABI standard" says to do so.
-
-     The ANSI C standard leaves it up to the implementation whether a
-     bitfield declared plain `int' is signed or not.  This in effect
-     creates two alternative dialects of C.
-
-     The GNU C compiler supports both dialects; you can specify the
-     signed dialect with `-fsigned-bitfields' and the unsigned dialect
-     with `-funsigned-bitfields'.  However, this leaves open the
-     question of which dialect to use by default.
-
-     Currently, the preferred dialect makes plain bitfields signed,
-     because this is simplest.  Since `int' is the same as `signed int'
-     in every other context, it is cleanest for them to be the same in
-     bitfields as well.
-
-     Some computer manufacturers have published Application Binary
-     Interface standards which specify that plain bitfields should be
-     unsigned.  It is a mistake, however, to say anything about this
-     issue in an ABI.  This is because the handling of plain bitfields
-     distinguishes two dialects of C.  Both dialects are meaningful on
-     every type of machine.  Whether a particular object file was
-     compiled using signed bitfields or unsigned is of no concern to
-     other object files, even if they access the same bitfields in the
-     same data structures.
-
-     A given program is written in one or the other of these two
-     dialects.  The program stands a chance to work on most any machine
-     if it is compiled with the proper dialect.  It is unlikely to work
-     at all if compiled with the wrong dialect.
-
-     Many users appreciate the GNU C compiler because it provides an
-     environment that is uniform across machines.  These users would be
-     inconvenienced if the compiler treated plain bitfields differently
-     on certain machines.
-
-     Occasionally users write programs intended only for a particular
-     machine type.  On these occasions, the users would benefit if the
-     GNU C compiler were to support by default the same dialect as the
-     other compilers on that machine.  But such applications are rare.
-     And users writing a program to run on more than one type of
-     machine cannot possibly benefit from this kind of compatibility.
-
-     This is why GNU CC does and will treat plain bitfields in the same
-     fashion on all types of machines (by default).
-
-     There are some arguments for making bitfields unsigned by default
-     on all machines.  If, for example, this becomes a universal de
-     facto standard, it would make sense for GNU CC to go along with
-     it.  This is something to be considered in the future.
-
-     (Of course, users strongly concerned about portability should
-     indicate explicitly in each bitfield whether it is signed or not.
-     In this way, they write programs which have the same meaning in
-     both C dialects.)
-
-   * Undefining `__STDC__' when `-ansi' is not used.
-
-     Currently, GNU CC defines `__STDC__' as long as you don't use
-     `-traditional'.  This provides good results in practice.
-
-     Programmers normally use conditionals on `__STDC__' to ask whether
-     it is safe to use certain features of ANSI C, such as function
-     prototypes or ANSI token concatenation.  Since plain `gcc' supports
-     all the features of ANSI C, the correct answer to these questions
-     is "yes".
-
-     Some users try to use `__STDC__' to check for the availability of
-     certain library facilities.  This is actually incorrect usage in
-     an ANSI C program, because the ANSI C standard says that a
-     conforming freestanding implementation should define `__STDC__'
-     even though it does not have the library facilities.  `gcc -ansi
-     -pedantic' is a conforming freestanding implementation, and it is
-     therefore required to define `__STDC__', even though it does not
-     come with an ANSI C library.
-
-     Sometimes people say that defining `__STDC__' in a compiler that
-     does not completely conform to the ANSI C standard somehow
-     violates the standard.  This is illogical.  The standard is a
-     standard for compilers that claim to support ANSI C, such as `gcc
-     -ansi'--not for other compilers such as plain `gcc'.  Whatever the
-     ANSI C standard says is relevant to the design of plain `gcc'
-     without `-ansi' only for pragmatic reasons, not as a requirement.
-
-     GNU CC normally defines `__STDC__' to be 1, and in addition
-     defines `__STRICT_ANSI__' if you specify the `-ansi' option.  On
-     some hosts, system include files use a different convention, where
-     `__STDC__' is normally 0, but is 1 if the user specifies strict
-     conformance to the C Standard.  GNU CC follows the host convention
-     when processing system include files, but when processing user
-     files it follows the usual GNU C convention.
-
-   * Undefining `__STDC__' in C++.
-
-     Programs written to compile with C++-to-C translators get the
-     value of `__STDC__' that goes with the C compiler that is
-     subsequently used.  These programs must test `__STDC__' to
-     determine what kind of C preprocessor that compiler uses: whether
-     they should concatenate tokens in the ANSI C fashion or in the
-     traditional fashion.
-
-     These programs work properly with GNU C++ if `__STDC__' is defined.
-     They would not work otherwise.
-
-     In addition, many header files are written to provide prototypes
-     in ANSI C but not in traditional C.  Many of these header files
-     can work without change in C++ provided `__STDC__' is defined.  If
-     `__STDC__' is not defined, they will all fail, and will all need
-     to be changed to test explicitly for C++ as well.
-
-   * Deleting "empty" loops.
-
-     GNU CC does not delete "empty" loops because the most likely reason
-     you would put one in a program is to have a delay.  Deleting them
-     will not make real programs run any faster, so it would be
-     pointless.
-
-     It would be different if optimization of a nonempty loop could
-     produce an empty one.  But this generally can't happen.
-
-   * Making side effects happen in the same order as in some other
-     compiler.
-
-     It is never safe to depend on the order of evaluation of side
-     effects.  For example, a function call like this may very well
-     behave differently from one compiler to another:
-
-          void func (int, int);
-          
-          int i = 2;
-          func (i++, i++);
-
-     There is no guarantee (in either the C or the C++ standard language
-     definitions) that the increments will be evaluated in any
-     particular order.  Either increment might happen first.  `func'
-     might get the arguments `2, 3', or it might get `3, 2', or even
-     `2, 2'.
-
-   * Not allowing structures with volatile fields in registers.
-
-     Strictly speaking, there is no prohibition in the ANSI C standard
-     against allowing structures with volatile fields in registers, but
-     it does not seem to make any sense and is probably not what you
-     wanted to do.  So the compiler will give an error message in this
-     case.
-
-\1f
-File: gcc.info,  Node: Warnings and Errors,  Prev: Non-bugs,  Up: Trouble
-
-Warning Messages and Error Messages
-===================================
-
-   The GNU compiler can produce two kinds of diagnostics: errors and
-warnings.  Each kind has a different purpose:
-
-     *Errors* report problems that make it impossible to compile your
-     program.  GNU CC reports errors with the source file name and line
-     number where the problem is apparent.
-
-     *Warnings* report other unusual conditions in your code that *may*
-     indicate a problem, although compilation can (and does) proceed.
-     Warning messages also report the source file name and line number,
-     but include the text `warning:' to distinguish them from error
-     messages.
-
-   Warnings may indicate danger points where you should check to make
-sure that your program really does what you intend; or the use of
-obsolete features; or the use of nonstandard features of GNU C or C++.
-Many warnings are issued only if you ask for them, with one of the `-W'
-options (for instance, `-Wall' requests a variety of useful warnings).
-
-   GNU CC always tries to compile your program if possible; it never
-gratuitously rejects a program whose meaning is clear merely because
-(for instance) it fails to conform to a standard.  In some cases,
-however, the C and C++ standards specify that certain extensions are
-forbidden, and a diagnostic *must* be issued by a conforming compiler.
-The `-pedantic' option tells GNU CC to issue warnings in such cases;
-`-pedantic-errors' says to make them errors instead.  This does not
-mean that *all* non-ANSI constructs get warnings or errors.
-
-   *Note Options to Request or Suppress Warnings: Warning Options, for
-more detail on these and related command-line options.
-
-\1f
-File: gcc.info,  Node: Bugs,  Next: Service,  Prev: Trouble,  Up: Top
-
-Reporting Bugs
-**************
-
-   Your bug reports play an essential role in making GNU CC reliable.
-
-   When you encounter a problem, the first thing to do is to see if it
-is already known.  *Note Trouble::.  If it isn't known, then you should
-report the problem.
-
-   Reporting a bug may help you by bringing a solution to your problem,
-or it may not.  (If it does not, look in the service directory; see
-*Note Service::.)  In any case, the principal function of a bug report
-is to help the entire community by making the next version of GNU CC
-work better.  Bug reports are your contribution to the maintenance of
-GNU CC.
-
-   Since the maintainers are very overloaded, we cannot respond to every
-bug report.  However, if the bug has not been fixed, we are likely to
-send you a patch and ask you to tell us whether it works.
-
-   In order for a bug report to serve its purpose, you must include the
-information that makes for fixing the bug.
-
-* Menu:
-
-* Criteria:  Bug Criteria.   Have you really found a bug?
-* Where: Bug Lists.         Where to send your bug report.
-* Reporting: Bug Reporting.  How to report a bug effectively.
-* Patches: Sending Patches.  How to send a patch for GNU CC.
-* Known: Trouble.            Known problems.
-* Help: Service.             Where to ask for help.
-
-\1f
-File: gcc.info,  Node: Bug Criteria,  Next: Bug Lists,  Up: Bugs
-
-Have You Found a Bug?
-=====================
-
-   If you are not sure whether you have found a bug, here are some
-guidelines:
-
-   * If the compiler gets a fatal signal, for any input whatever, that
-     is a compiler bug.  Reliable compilers never crash.
-
-   * If the compiler produces invalid assembly code, for any input
-     whatever (except an `asm' statement), that is a compiler bug,
-     unless the compiler reports errors (not just warnings) which would
-     ordinarily prevent the assembler from being run.
-
-   * If the compiler produces valid assembly code that does not
-     correctly execute the input source code, that is a compiler bug.
-
-     However, you must double-check to make sure, because you may have
-     run into an incompatibility between GNU C and traditional C (*note
-     Incompatibilities::.).  These incompatibilities might be considered
-     bugs, but they are inescapable consequences of valuable features.
-
-     Or you may have a program whose behavior is undefined, which
-     happened by chance to give the desired results with another C or
-     C++ compiler.
-
-     For example, in many nonoptimizing compilers, you can write `x;'
-     at the end of a function instead of `return x;', with the same
-     results.  But the value of the function is undefined if `return'
-     is omitted; it is not a bug when GNU CC produces different results.
-
-     Problems often result from expressions with two increment
-     operators, as in `f (*p++, *p++)'.  Your previous compiler might
-     have interpreted that expression the way you intended; GNU CC might
-     interpret it another way.  Neither compiler is wrong.  The bug is
-     in your code.
-
-     After you have localized the error to a single source line, it
-     should be easy to check for these things.  If your program is
-     correct and well defined, you have found a compiler bug.
-
-   * If the compiler produces an error message for valid input, that is
-     a compiler bug.
-
-   * If the compiler does not produce an error message for invalid
-     input, that is a compiler bug.  However, you should note that your
-     idea of "invalid input" might be my idea of "an extension" or
-     "support for traditional practice".
-
-   * If you are an experienced user of C or C++ compilers, your
-     suggestions for improvement of GNU CC or GNU C++ are welcome in
-     any case.
-
-\1f
-File: gcc.info,  Node: Bug Lists,  Next: Bug Reporting,  Prev: Bug Criteria,  Up: Bugs
-
-Where to Report Bugs
-====================
-
-   Send bug reports for GNU C to `bug-gcc@prep.ai.mit.edu'.
-
-   Send bug reports for GNU C++ to `bug-g++@prep.ai.mit.edu'.  If your
-bug involves the C++ class library libg++, send mail instead to the
-address `bug-lib-g++@prep.ai.mit.edu'.  If you're not sure, you can
-send the bug report to both lists.
-
-   *Do not send bug reports to `help-gcc@prep.ai.mit.edu' or to the
-newsgroup `gnu.gcc.help'.* Most users of GNU CC do not want to receive
-bug reports.  Those that do, have asked to be on `bug-gcc' and/or
-`bug-g++'.
-
-   The mailing lists `bug-gcc' and `bug-g++' both have newsgroups which
-serve as repeaters: `gnu.gcc.bug' and `gnu.g++.bug'.  Each mailing list
-and its newsgroup carry exactly the same messages.
-
-   Often people think of posting bug reports to the newsgroup instead of
-mailing them.  This appears to work, but it has one problem which can be
-crucial: a newsgroup posting does not contain a mail path back to the
-sender.  Thus, if maintainers need more information, they may be unable
-to reach you.  For this reason, you should always send bug reports by
-mail to the proper mailing list.
-
-   As a last resort, send bug reports on paper to:
-
-     GNU Compiler Bugs
-     Free Software Foundation
-     59 Temple Place - Suite 330
-     Boston, MA 02111-1307, USA
-
diff --git a/gcc/gcc.info-13 b/gcc/gcc.info-13
deleted file mode 100644 (file)
index baeaa8a..0000000
+++ /dev/null
@@ -1,853 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Bug Reporting,  Next: Sending Patches,  Prev: Bug Lists,  Up: Bugs
-
-How to Report Bugs
-==================
-
-   The fundamental principle of reporting bugs usefully is this:
-*report all the facts*.  If you are not sure whether to state a fact or
-leave it out, state it!
-
-   Often people omit facts because they think they know what causes the
-problem and they conclude that some details don't matter.  Thus, you
-might assume that the name of the variable you use in an example does
-not matter.  Well, probably it doesn't, but one cannot be sure.
-Perhaps the bug is a stray memory reference which happens to fetch from
-the location where that name is stored in memory; perhaps, if the name
-were different, the contents of that location would fool the compiler
-into doing the right thing despite the bug.  Play it safe and give a
-specific, complete example.  That is the easiest thing for you to do,
-and the most helpful.
-
-   Keep in mind that the purpose of a bug report is to enable someone to
-fix the bug if it is not known.  It isn't very important what happens if
-the bug is already known.  Therefore, always write your bug reports on
-the assumption that the bug is not known.
-
-   Sometimes people give a few sketchy facts and ask, "Does this ring a
-bell?"  This cannot help us fix a bug, so it is basically useless.  We
-respond by asking for enough details to enable us to investigate.  You
-might as well expedite matters by sending them to begin with.
-
-   Try to make your bug report self-contained.  If we have to ask you
-for more information, it is best if you include all the previous
-information in your response, as well as the information that was
-missing.
-
-   Please report each bug in a separate message.  This makes it easier
-for us to track which bugs have been fixed and to forward your bugs
-reports to the appropriate maintainer.
-
-   Do not compress and encode any part of your bug report using programs
-such as `uuencode'.  If you do so it will slow down the processing of
-your bug.  If you must submit multiple large files, use `shar', which
-allows us to read your message without having to run any decompression
-programs.
-
-   To enable someone to investigate the bug, you should include all
-these things:
-
-   * The version of GNU CC.  You can get this by running it with the
-     `-v' option.
-
-     Without this, we won't know whether there is any point in looking
-     for the bug in the current version of GNU CC.
-
-   * A complete input file that will reproduce the bug.  If the bug is
-     in the C preprocessor, send a source file and any header files
-     that it requires.  If the bug is in the compiler proper (`cc1'),
-     run your source file through the C preprocessor by doing `gcc -E
-     SOURCEFILE > OUTFILE', then include the contents of OUTFILE in the
-     bug report.  (When you do this, use the same `-I', `-D' or `-U'
-     options that you used in actual compilation.)
-
-     A single statement is not enough of an example.  In order to
-     compile it, it must be embedded in a complete file of compiler
-     input; and the bug might depend on the details of how this is done.
-
-     Without a real example one can compile, all anyone can do about
-     your bug report is wish you luck.  It would be futile to try to
-     guess how to provoke the bug.  For example, bugs in register
-     allocation and reloading frequently depend on every little detail
-     of the function they happen in.
-
-     Even if the input file that fails comes from a GNU program, you
-     should still send the complete test case.  Don't ask the GNU CC
-     maintainers to do the extra work of obtaining the program in
-     question--they are all overworked as it is.  Also, the problem may
-     depend on what is in the header files on your system; it is
-     unreliable for the GNU CC maintainers to try the problem with the
-     header files available to them.  By sending CPP output, you can
-     eliminate this source of uncertainty and save us a certain
-     percentage of wild goose chases.
-
-   * The command arguments you gave GNU CC or GNU C++ to compile that
-     example and observe the bug.  For example, did you use `-O'?  To
-     guarantee you won't omit something important, list all the options.
-
-     If we were to try to guess the arguments, we would probably guess
-     wrong and then we would not encounter the bug.
-
-   * The type of machine you are using, and the operating system name
-     and version number.
-
-   * The operands you gave to the `configure' command when you installed
-     the compiler.
-
-   * A complete list of any modifications you have made to the compiler
-     source.  (We don't promise to investigate the bug unless it
-     happens in an unmodified compiler.  But if you've made
-     modifications and don't tell us, then you are sending us on a wild
-     goose chase.)
-
-     Be precise about these changes.  A description in English is not
-     enough--send a context diff for them.
-
-     Adding files of your own (such as a machine description for a
-     machine we don't support) is a modification of the compiler source.
-
-   * Details of any other deviations from the standard procedure for
-     installing GNU CC.
-
-   * A description of what behavior you observe that you believe is
-     incorrect.  For example, "The compiler gets a fatal signal," or,
-     "The assembler instruction at line 208 in the output is incorrect."
-
-     Of course, if the bug is that the compiler gets a fatal signal,
-     then one can't miss it.  But if the bug is incorrect output, the
-     maintainer might not notice unless it is glaringly wrong.  None of
-     us has time to study all the assembler code from a 50-line C
-     program just on the chance that one instruction might be wrong.
-     We need *you* to do this part!
-
-     Even if the problem you experience is a fatal signal, you should
-     still say so explicitly.  Suppose something strange is going on,
-     such as, your copy of the compiler is out of synch, or you have
-     encountered a bug in the C library on your system.  (This has
-     happened!)  Your copy might crash and the copy here would not.  If
-     you said to expect a crash, then when the compiler here fails to
-     crash, we would know that the bug was not happening.  If you don't
-     say to expect a crash, then we would not know whether the bug was
-     happening.  We would not be able to draw any conclusion from our
-     observations.
-
-     If the problem is a diagnostic when compiling GNU CC with some
-     other compiler, say whether it is a warning or an error.
-
-     Often the observed symptom is incorrect output when your program
-     is run.  Sad to say, this is not enough information unless the
-     program is short and simple.  None of us has time to study a large
-     program to figure out how it would work if compiled correctly,
-     much less which line of it was compiled wrong.  So you will have
-     to do that.  Tell us which source line it is, and what incorrect
-     result happens when that line is executed.  A person who
-     understands the program can find this as easily as finding a bug
-     in the program itself.
-
-   * If you send examples of assembler code output from GNU CC or GNU
-     C++, please use `-g' when you make them.  The debugging information
-     includes source line numbers which are essential for correlating
-     the output with the input.
-
-   * If you wish to mention something in the GNU CC source, refer to it
-     by context, not by line number.
-
-     The line numbers in the development sources don't match those in
-     your sources.  Your line numbers would convey no useful
-     information to the maintainers.
-
-   * Additional information from a debugger might enable someone to
-     find a problem on a machine which he does not have available.
-     However, you need to think when you collect this information if
-     you want it to have any chance of being useful.
-
-     For example, many people send just a backtrace, but that is never
-     useful by itself.  A simple backtrace with arguments conveys little
-     about GNU CC because the compiler is largely data-driven; the same
-     functions are called over and over for different RTL insns, doing
-     different things depending on the details of the insn.
-
-     Most of the arguments listed in the backtrace are useless because
-     they are pointers to RTL list structure.  The numeric values of the
-     pointers, which the debugger prints in the backtrace, have no
-     significance whatever; all that matters is the contents of the
-     objects they point to (and most of the contents are other such
-     pointers).
-
-     In addition, most compiler passes consist of one or more loops that
-     scan the RTL insn sequence.  The most vital piece of information
-     about such a loop--which insn it has reached--is usually in a
-     local variable, not in an argument.
-
-     What you need to provide in addition to a backtrace are the values
-     of the local variables for several stack frames up.  When a local
-     variable or an argument is an RTX, first print its value and then
-     use the GDB command `pr' to print the RTL expression that it points
-     to.  (If GDB doesn't run on your machine, use your debugger to call
-     the function `debug_rtx' with the RTX as an argument.)  In
-     general, whenever a variable is a pointer, its value is no use
-     without the data it points to.
-
-   Here are some things that are not necessary:
-
-   * A description of the envelope of the bug.
-
-     Often people who encounter a bug spend a lot of time investigating
-     which changes to the input file will make the bug go away and which
-     changes will not affect it.
-
-     This is often time consuming and not very useful, because the way
-     we will find the bug is by running a single example under the
-     debugger with breakpoints, not by pure deduction from a series of
-     examples.  You might as well save your time for something else.
-
-     Of course, if you can find a simpler example to report *instead* of
-     the original one, that is a convenience.  Errors in the output
-     will be easier to spot, running under the debugger will take less
-     time, etc.  Most GNU CC bugs involve just one function, so the
-     most straightforward way to simplify an example is to delete all
-     the function definitions except the one where the bug occurs.
-     Those earlier in the file may be replaced by external declarations
-     if the crucial function depends on them.  (Exception: inline
-     functions may affect compilation of functions defined later in the
-     file.)
-
-     However, simplification is not vital; if you don't want to do this,
-     report the bug anyway and send the entire test case you used.
-
-   * In particular, some people insert conditionals `#ifdef BUG' around
-     a statement which, if removed, makes the bug not happen.  These
-     are just clutter; we won't pay any attention to them anyway.
-     Besides, you should send us cpp output, and that can't have
-     conditionals.
-
-   * A patch for the bug.
-
-     A patch for the bug is useful if it is a good one.  But don't omit
-     the necessary information, such as the test case, on the
-     assumption that a patch is all we need.  We might see problems
-     with your patch and decide to fix the problem another way, or we
-     might not understand it at all.
-
-     Sometimes with a program as complicated as GNU CC it is very hard
-     to construct an example that will make the program follow a
-     certain path through the code.  If you don't send the example, we
-     won't be able to construct one, so we won't be able to verify that
-     the bug is fixed.
-
-     And if we can't understand what bug you are trying to fix, or why
-     your patch should be an improvement, we won't install it.  A test
-     case will help us to understand.
-
-     *Note Sending Patches::, for guidelines on how to make it easy for
-     us to understand and install your patches.
-
-   * A guess about what the bug is or what it depends on.
-
-     Such guesses are usually wrong.  Even I can't guess right about
-     such things without first using the debugger to find the facts.
-
-   * A core dump file.
-
-     We have no way of examining a core dump for your type of machine
-     unless we have an identical system--and if we do have one, we
-     should be able to reproduce the crash ourselves.
-
-\1f
-File: gcc.info,  Node: Sending Patches,  Prev: Bug Reporting,  Up: Bugs
-
-Sending Patches for GNU CC
-==========================
-
-   If you would like to write bug fixes or improvements for the GNU C
-compiler, that is very helpful.  Send suggested fixes to the bug report
-mailing list, `bug-gcc@prep.ai.mit.edu'.
-
-   Please follow these guidelines so we can study your patches
-efficiently.  If you don't follow these guidelines, your information
-might still be useful, but using it will take extra work.  Maintaining
-GNU C is a lot of work in the best of circumstances, and we can't keep
-up unless you do your best to help.
-
-   * Send an explanation with your changes of what problem they fix or
-     what improvement they bring about.  For a bug fix, just include a
-     copy of the bug report, and explain why the change fixes the bug.
-
-     (Referring to a bug report is not as good as including it, because
-     then we will have to look it up, and we have probably already
-     deleted it if we've already fixed the bug.)
-
-   * Always include a proper bug report for the problem you think you
-     have fixed.  We need to convince ourselves that the change is
-     right before installing it.  Even if it is right, we might have
-     trouble judging it if we don't have a way to reproduce the problem.
-
-   * Include all the comments that are appropriate to help people
-     reading the source in the future understand why this change was
-     needed.
-
-   * Don't mix together changes made for different reasons.  Send them
-     *individually*.
-
-     If you make two changes for separate reasons, then we might not
-     want to install them both.  We might want to install just one.  If
-     you send them all jumbled together in a single set of diffs, we
-     have to do extra work to disentangle them--to figure out which
-     parts of the change serve which purpose.  If we don't have time
-     for this, we might have to ignore your changes entirely.
-
-     If you send each change as soon as you have written it, with its
-     own explanation, then the two changes never get tangled up, and we
-     can consider each one properly without any extra work to
-     disentangle them.
-
-     Ideally, each change you send should be impossible to subdivide
-     into parts that we might want to consider separately, because each
-     of its parts gets its motivation from the other parts.
-
-   * Send each change as soon as that change is finished.  Sometimes
-     people think they are helping us by accumulating many changes to
-     send them all together.  As explained above, this is absolutely
-     the worst thing you could do.
-
-     Since you should send each change separately, you might as well
-     send it right away.  That gives us the option of installing it
-     immediately if it is important.
-
-   * Use `diff -c' to make your diffs.  Diffs without context are hard
-     for us to install reliably.  More than that, they make it hard for
-     us to study the diffs to decide whether we want to install them.
-     Unidiff format is better than contextless diffs, but not as easy
-     to read as `-c' format.
-
-     If you have GNU diff, use `diff -cp', which shows the name of the
-     function that each change occurs in.
-
-   * Write the change log entries for your changes.  We get lots of
-     changes, and we don't have time to do all the change log writing
-     ourselves.
-
-     Read the `ChangeLog' file to see what sorts of information to put
-     in, and to learn the style that we use.  The purpose of the change
-     log is to show people where to find what was changed.  So you need
-     to be specific about what functions you changed; in large
-     functions, it's often helpful to indicate where within the
-     function the change was.
-
-     On the other hand, once you have shown people where to find the
-     change, you need not explain its purpose.  Thus, if you add a new
-     function, all you need to say about it is that it is new.  If you
-     feel that the purpose needs explaining, it probably does--but the
-     explanation will be much more useful if you put it in comments in
-     the code.
-
-     If you would like your name to appear in the header line for who
-     made the change, send us the header line.
-
-   * When you write the fix, keep in mind that we can't install a
-     change that would break other systems.
-
-     People often suggest fixing a problem by changing
-     machine-independent files such as `toplev.c' to do something
-     special that a particular system needs.  Sometimes it is totally
-     obvious that such changes would break GNU CC for almost all users.
-     We can't possibly make a change like that.  At best it might tell
-     us how to write another patch that would solve the problem
-     acceptably.
-
-     Sometimes people send fixes that *might* be an improvement in
-     general--but it is hard to be sure of this.  It's hard to install
-     such changes because we have to study them very carefully.  Of
-     course, a good explanation of the reasoning by which you concluded
-     the change was correct can help convince us.
-
-     The safest changes are changes to the configuration files for a
-     particular machine.  These are safe because they can't create new
-     bugs on other machines.
-
-     Please help us keep up with the workload by designing the patch in
-     a form that is good to install.
-
-\1f
-File: gcc.info,  Node: Service,  Next: Contributing,  Prev: Bugs,  Up: Top
-
-How To Get Help with GNU CC
-***************************
-
-   If you need help installing, using or changing GNU CC, there are two
-ways to find it:
-
-   * Send a message to a suitable network mailing list.  First try
-     `bug-gcc@prep.ai.mit.edu', and if that brings no response, try
-     `help-gcc@prep.ai.mit.edu'.
-
-   * Look in the service directory for someone who might help you for a
-     fee.  The service directory is found in the file named `SERVICE'
-     in the GNU CC distribution.
-
-\1f
-File: gcc.info,  Node: Contributing,  Next: VMS,  Prev: Service,  Up: Top
-
-Contributing to GNU CC Development
-**********************************
-
-   If you would like to help pretest GNU CC releases to assure they work
-well, or if you would like to work on improving GNU CC, please contact
-the maintainers at `bug-gcc@gnu.ai.mit.edu'.  A pretester should be
-willing to try to investigate bugs as well as report them.
-
-   If you'd like to work on improvements, please ask for suggested
-projects or suggest your own ideas.  If you have already written an
-improvement, please tell us about it.  If you have not yet started
-work, it is useful to contact `bug-gcc@prep.ai.mit.edu' before you
-start; the maintainers may be able to suggest ways to make your
-extension fit in better with the rest of GNU CC and with other
-development plans.
-
-\1f
-File: gcc.info,  Node: VMS,  Next: Portability,  Prev: Contributing,  Up: Top
-
-Using GNU CC on VMS
-*******************
-
-   Here is how to use GNU CC on VMS.
-
-* Menu:
-
-* Include Files and VMS::  Where the preprocessor looks for the include files.
-* Global Declarations::    How to do globaldef, globalref and globalvalue with
-                           GNU CC.
-* VMS Misc::              Misc information.
-
-\1f
-File: gcc.info,  Node: Include Files and VMS,  Next: Global Declarations,  Up: VMS
-
-Include Files and VMS
-=====================
-
-   Due to the differences between the filesystems of Unix and VMS, GNU
-CC attempts to translate file names in `#include' into names that VMS
-will understand.  The basic strategy is to prepend a prefix to the
-specification of the include file, convert the whole filename to a VMS
-filename, and then try to open the file.  GNU CC tries various prefixes
-one by one until one of them succeeds:
-
-  1. The first prefix is the `GNU_CC_INCLUDE:' logical name: this is
-     where GNU C header files are traditionally stored.  If you wish to
-     store header files in non-standard locations, then you can assign
-     the logical `GNU_CC_INCLUDE' to be a search list, where each
-     element of the list is suitable for use with a rooted logical.
-
-  2. The next prefix tried is `SYS$SYSROOT:[SYSLIB.]'.  This is where
-     VAX-C header files are traditionally stored.
-
-  3. If the include file specification by itself is a valid VMS
-     filename, the preprocessor then uses this name with no prefix in
-     an attempt to open the include file.
-
-  4. If the file specification is not a valid VMS filename (i.e. does
-     not contain a device or a directory specifier, and contains a `/'
-     character), the preprocessor tries to convert it from Unix syntax
-     to VMS syntax.
-
-     Conversion works like this: the first directory name becomes a
-     device, and the rest of the directories are converted into
-     VMS-format directory names.  For example, the name `X11/foobar.h'
-     is translated to `X11:[000000]foobar.h' or `X11:foobar.h',
-     whichever one can be opened.  This strategy allows you to assign a
-     logical name to point to the actual location of the header files.
-
-  5. If none of these strategies succeeds, the `#include' fails.
-
-   Include directives of the form:
-
-     #include foobar
-
-are a common source of incompatibility between VAX-C and GNU CC.  VAX-C
-treats this much like a standard `#include <foobar.h>' directive.  That
-is incompatible with the ANSI C behavior implemented by GNU CC: to
-expand the name `foobar' as a macro.  Macro expansion should eventually
-yield one of the two standard formats for `#include':
-
-     #include "FILE"
-     #include <FILE>
-
-   If you have this problem, the best solution is to modify the source
-to convert the `#include' directives to one of the two standard forms.
-That will work with either compiler.  If you want a quick and dirty fix,
-define the file names as macros with the proper expansion, like this:
-
-     #define stdio <stdio.h>
-
-This will work, as long as the name doesn't conflict with anything else
-in the program.
-
-   Another source of incompatibility is that VAX-C assumes that:
-
-     #include "foobar"
-
-is actually asking for the file `foobar.h'.  GNU CC does not make this
-assumption, and instead takes what you ask for literally; it tries to
-read the file `foobar'.  The best way to avoid this problem is to
-always specify the desired file extension in your include directives.
-
-   GNU CC for VMS is distributed with a set of include files that is
-sufficient to compile most general purpose programs.  Even though the
-GNU CC distribution does not contain header files to define constants
-and structures for some VMS system-specific functions, there is no
-reason why you cannot use GNU CC with any of these functions.  You first
-may have to generate or create header files, either by using the public
-domain utility `UNSDL' (which can be found on a DECUS tape), or by
-extracting the relevant modules from one of the system macro libraries,
-and using an editor to construct a C header file.
-
-   A `#include' file name cannot contain a DECNET node name.  The
-preprocessor reports an I/O error if you attempt to use a node name,
-whether explicitly, or implicitly via a logical name.
-
-\1f
-File: gcc.info,  Node: Global Declarations,  Next: VMS Misc,  Prev: Include Files and VMS,  Up: VMS
-
-Global Declarations and VMS
-===========================
-
-   GNU CC does not provide the `globalref', `globaldef' and
-`globalvalue' keywords of VAX-C.  You can get the same effect with an
-obscure feature of GAS, the GNU assembler.  (This requires GAS version
-1.39 or later.)  The following macros allow you to use this feature in
-a fairly natural way:
-
-     #ifdef __GNUC__
-     #define GLOBALREF(TYPE,NAME)                      \
-       TYPE NAME                                       \
-       asm ("_$$PsectAttributes_GLOBALSYMBOL$$" #NAME)
-     #define GLOBALDEF(TYPE,NAME,VALUE)                \
-       TYPE NAME                                       \
-       asm ("_$$PsectAttributes_GLOBALSYMBOL$$" #NAME) \
-         = VALUE
-     #define GLOBALVALUEREF(TYPE,NAME)                 \
-       const TYPE NAME[1]                              \
-       asm ("_$$PsectAttributes_GLOBALVALUE$$" #NAME)
-     #define GLOBALVALUEDEF(TYPE,NAME,VALUE)           \
-       const TYPE NAME[1]                              \
-       asm ("_$$PsectAttributes_GLOBALVALUE$$" #NAME)  \
-         = {VALUE}
-     #else
-     #define GLOBALREF(TYPE,NAME) \
-       globalref TYPE NAME
-     #define GLOBALDEF(TYPE,NAME,VALUE) \
-       globaldef TYPE NAME = VALUE
-     #define GLOBALVALUEDEF(TYPE,NAME,VALUE) \
-       globalvalue TYPE NAME = VALUE
-     #define GLOBALVALUEREF(TYPE,NAME) \
-       globalvalue TYPE NAME
-     #endif
-
-(The `_$$PsectAttributes_GLOBALSYMBOL' prefix at the start of the name
-is removed by the assembler, after it has modified the attributes of
-the symbol).  These macros are provided in the VMS binaries
-distribution in a header file `GNU_HACKS.H'.  An example of the usage
-is:
-
-     GLOBALREF (int, ijk);
-     GLOBALDEF (int, jkl, 0);
-
-   The macros `GLOBALREF' and `GLOBALDEF' cannot be used
-straightforwardly for arrays, since there is no way to insert the array
-dimension into the declaration at the right place.  However, you can
-declare an array with these macros if you first define a typedef for the
-array type, like this:
-
-     typedef int intvector[10];
-     GLOBALREF (intvector, foo);
-
-   Array and structure initializers will also break the macros; you can
-define the initializer to be a macro of its own, or you can expand the
-`GLOBALDEF' macro by hand.  You may find a case where you wish to use
-the `GLOBALDEF' macro with a large array, but you are not interested in
-explicitly initializing each element of the array.  In such cases you
-can use an initializer like: `{0,}', which will initialize the entire
-array to `0'.
-
-   A shortcoming of this implementation is that a variable declared with
-`GLOBALVALUEREF' or `GLOBALVALUEDEF' is always an array.  For example,
-the declaration:
-
-     GLOBALVALUEREF(int, ijk);
-
-declares the variable `ijk' as an array of type `int [1]'.  This is
-done because a globalvalue is actually a constant; its "value" is what
-the linker would normally consider an address.  That is not how an
-integer value works in C, but it is how an array works.  So treating
-the symbol as an array name gives consistent results--with the
-exception that the value seems to have the wrong type.  *Don't try to
-access an element of the array.*  It doesn't have any elements.  The
-array "address" may not be the address of actual storage.
-
-   The fact that the symbol is an array may lead to warnings where the
-variable is used.  Insert type casts to avoid the warnings.  Here is an
-example; it takes advantage of the ANSI C feature allowing macros that
-expand to use the same name as the macro itself.
-
-     GLOBALVALUEREF (int, ss$_normal);
-     GLOBALVALUEDEF (int, xyzzy,123);
-     #ifdef __GNUC__
-     #define ss$_normal ((int) ss$_normal)
-     #define xyzzy ((int) xyzzy)
-     #endif
-
-   Don't use `globaldef' or `globalref' with a variable whose type is
-an enumeration type; this is not implemented.  Instead, make the
-variable an integer, and use a `globalvaluedef' for each of the
-enumeration values.  An example of this would be:
-
-     #ifdef __GNUC__
-     GLOBALDEF (int, color, 0);
-     GLOBALVALUEDEF (int, RED, 0);
-     GLOBALVALUEDEF (int, BLUE, 1);
-     GLOBALVALUEDEF (int, GREEN, 3);
-     #else
-     enum globaldef color {RED, BLUE, GREEN = 3};
-     #endif
-
-\1f
-File: gcc.info,  Node: VMS Misc,  Prev: Global Declarations,  Up: VMS
-
-Other VMS Issues
-================
-
-   GNU CC automatically arranges for `main' to return 1 by default if
-you fail to specify an explicit return value.  This will be interpreted
-by VMS as a status code indicating a normal successful completion.
-Version 1 of GNU CC did not provide this default.
-
-   GNU CC on VMS works only with the GNU assembler, GAS.  You need
-version 1.37 or later of GAS in order to produce value debugging
-information for the VMS debugger.  Use the ordinary VMS linker with the
-object files produced by GAS.
-
-   Under previous versions of GNU CC, the generated code would
-occasionally give strange results when linked to the sharable `VAXCRTL'
-library.  Now this should work.
-
-   A caveat for use of `const' global variables: the `const' modifier
-must be specified in every external declaration of the variable in all
-of the source files that use that variable.  Otherwise the linker will
-issue warnings about conflicting attributes for the variable.  Your
-program will still work despite the warnings, but the variable will be
-placed in writable storage.
-
-   Although the VMS linker does distinguish between upper and lower case
-letters in global symbols, most VMS compilers convert all such symbols
-into upper case and most run-time library routines also have upper case
-names.  To be able to reliably call such routines, GNU CC (by means of
-the assembler GAS) converts global symbols into upper case like other
-VMS compilers.  However, since the usual practice in C is to distinguish
-case, GNU CC (via GAS) tries to preserve usual C behavior by augmenting
-each name that is not all lower case.  This means truncating the name
-to at most 23 characters and then adding more characters at the end
-which encode the case pattern of those 23.   Names which contain at
-least one dollar sign are an exception; they are converted directly into
-upper case without augmentation.
-
-   Name augmentation yields bad results for programs that use
-precompiled libraries (such as Xlib) which were generated by another
-compiler.  You can use the compiler option `/NOCASE_HACK' to inhibit
-augmentation; it makes external C functions and variables
-case-independent as is usual on VMS.  Alternatively, you could write
-all references to the functions and variables in such libraries using
-lower case; this will work on VMS, but is not portable to other
-systems.  The compiler option `/NAMES' also provides control over
-global name handling.
-
-   Function and variable names are handled somewhat differently with GNU
-C++.  The GNU C++ compiler performs "name mangling" on function names,
-which means that it adds information to the function name to describe
-the data types of the arguments that the function takes.  One result of
-this is that the name of a function can become very long.  Since the
-VMS linker only recognizes the first 31 characters in a name, special
-action is taken to ensure that each function and variable has a unique
-name that can be represented in 31 characters.
-
-   If the name (plus a name augmentation, if required) is less than 32
-characters in length, then no special action is performed.  If the name
-is longer than 31 characters, the assembler (GAS) will generate a hash
-string based upon the function name, truncate the function name to 23
-characters, and append the hash string to the truncated name.  If the
-`/VERBOSE' compiler option is used, the assembler will print both the
-full and truncated names of each symbol that is truncated.
-
-   The `/NOCASE_HACK' compiler option should not be used when you are
-compiling programs that use libg++.  libg++ has several instances of
-objects (i.e.  `Filebuf' and `filebuf') which become indistinguishable
-in a case-insensitive environment.  This leads to cases where you need
-to inhibit augmentation selectively (if you were using libg++ and Xlib
-in the same program, for example).  There is no special feature for
-doing this, but you can get the result by defining a macro for each
-mixed case symbol for which you wish to inhibit augmentation.  The
-macro should expand into the lower case equivalent of itself.  For
-example:
-
-     #define StuDlyCapS studlycaps
-
-   These macro definitions can be placed in a header file to minimize
-the number of changes to your source code.
-
-\1f
-File: gcc.info,  Node: Portability,  Next: Interface,  Prev: VMS,  Up: Top
-
-GNU CC and Portability
-**********************
-
-   The main goal of GNU CC was to make a good, fast compiler for
-machines in the class that the GNU system aims to run on: 32-bit
-machines that address 8-bit bytes and have several general registers.
-Elegance, theoretical power and simplicity are only secondary.
-
-   GNU CC gets most of the information about the target machine from a
-machine description which gives an algebraic formula for each of the
-machine's instructions.  This is a very clean way to describe the
-target.  But when the compiler needs information that is difficult to
-express in this fashion, I have not hesitated to define an ad-hoc
-parameter to the machine description.  The purpose of portability is to
-reduce the total work needed on the compiler; it was not of interest
-for its own sake.
-
-   GNU CC does not contain machine dependent code, but it does contain
-code that depends on machine parameters such as endianness (whether the
-most significant byte has the highest or lowest address of the bytes in
-a word) and the availability of autoincrement addressing.  In the
-RTL-generation pass, it is often necessary to have multiple strategies
-for generating code for a particular kind of syntax tree, strategies
-that are usable for different combinations of parameters.  Often I have
-not tried to address all possible cases, but only the common ones or
-only the ones that I have encountered.  As a result, a new target may
-require additional strategies.  You will know if this happens because
-the compiler will call `abort'.  Fortunately, the new strategies can be
-added in a machine-independent fashion, and will affect only the target
-machines that need them.
-
-\1f
-File: gcc.info,  Node: Interface,  Next: Passes,  Prev: Portability,  Up: Top
-
-Interfacing to GNU CC Output
-****************************
-
-   GNU CC is normally configured to use the same function calling
-convention normally in use on the target system.  This is done with the
-machine-description macros described (*note Target Macros::.).
-
-   However, returning of structure and union values is done differently
-on some target machines.  As a result, functions compiled with PCC
-returning such types cannot be called from code compiled with GNU CC,
-and vice versa.  This does not cause trouble often because few Unix
-library routines return structures or unions.
-
-   GNU CC code returns structures and unions that are 1, 2, 4 or 8 bytes
-long in the same registers used for `int' or `double' return values.
-(GNU CC typically allocates variables of such types in registers also.)
-Structures and unions of other sizes are returned by storing them into
-an address passed by the caller (usually in a register).  The
-machine-description macros `STRUCT_VALUE' and `STRUCT_INCOMING_VALUE'
-tell GNU CC where to pass this address.
-
-   By contrast, PCC on most target machines returns structures and
-unions of any size by copying the data into an area of static storage,
-and then returning the address of that storage as if it were a pointer
-value.  The caller must copy the data from that memory area to the
-place where the value is wanted.  This is slower than the method used
-by GNU CC, and fails to be reentrant.
-
-   On some target machines, such as RISC machines and the 80386, the
-standard system convention is to pass to the subroutine the address of
-where to return the value.  On these machines, GNU CC has been
-configured to be compatible with the standard compiler, when this method
-is used.  It may not be compatible for structures of 1, 2, 4 or 8 bytes.
-
-   GNU CC uses the system's standard convention for passing arguments.
-On some machines, the first few arguments are passed in registers; in
-others, all are passed on the stack.  It would be possible to use
-registers for argument passing on any machine, and this would probably
-result in a significant speedup.  But the result would be complete
-incompatibility with code that follows the standard convention.  So this
-change is practical only if you are switching to GNU CC as the sole C
-compiler for the system.  We may implement register argument passing on
-certain machines once we have a complete GNU system so that we can
-compile the libraries with GNU CC.
-
-   On some machines (particularly the Sparc), certain types of arguments
-are passed "by invisible reference".  This means that the value is
-stored in memory, and the address of the memory location is passed to
-the subroutine.
-
-   If you use `longjmp', beware of automatic variables.  ANSI C says
-that automatic variables that are not declared `volatile' have undefined
-values after a `longjmp'.  And this is all GNU CC promises to do,
-because it is very difficult to restore register variables correctly,
-and one of GNU CC's features is that it can put variables in registers
-without your asking it to.
-
-   If you want a variable to be unaltered by `longjmp', and you don't
-want to write `volatile' because old C compilers don't accept it, just
-take the address of the variable.  If a variable's address is ever
-taken, even if just to compute it and ignore it, then the variable
-cannot go in a register:
-
-     {
-       int careful;
-       &careful;
-       ...
-     }
-
-   Code compiled with GNU CC may call certain library routines.  Most of
-them handle arithmetic for which there are no instructions.  This
-includes multiply and divide on some machines, and floating point
-operations on any machine for which floating point support is disabled
-with `-msoft-float'.  Some standard parts of the C library, such as
-`bcopy' or `memcpy', are also called automatically.  The usual function
-call interface is used for calling the library routines.
-
-   These library routines should be defined in the library `libgcc.a',
-which GNU CC automatically searches whenever it links a program.  On
-machines that have multiply and divide instructions, if hardware
-floating point is in use, normally `libgcc.a' is not needed, but it is
-searched just in case.
-
-   Each arithmetic function is defined in `libgcc1.c' to use the
-corresponding C arithmetic operator.  As long as the file is compiled
-with another C compiler, which supports all the C arithmetic operators,
-this file will work portably.  However, `libgcc1.c' does not work if
-compiled with GNU CC, because each arithmetic function would compile
-into a call to itself!
-
diff --git a/gcc/gcc.info-14 b/gcc/gcc.info-14
deleted file mode 100644 (file)
index c7bf850..0000000
+++ /dev/null
@@ -1,1161 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Passes,  Next: RTL,  Prev: Interface,  Up: Top
-
-Passes and Files of the Compiler
-********************************
-
-   The overall control structure of the compiler is in `toplev.c'.  This
-file is responsible for initialization, decoding arguments, opening and
-closing files, and sequencing the passes.
-
-   The parsing pass is invoked only once, to parse the entire input.
-The RTL intermediate code for a function is generated as the function
-is parsed, a statement at a time.  Each statement is read in as a
-syntax tree and then converted to RTL; then the storage for the tree
-for the statement is reclaimed.  Storage for types (and the expressions
-for their sizes), declarations, and a representation of the binding
-contours and how they nest, remain until the function is finished being
-compiled; these are all needed to output the debugging information.
-
-   Each time the parsing pass reads a complete function definition or
-top-level declaration, it calls either the function
-`rest_of_compilation', or the function `rest_of_decl_compilation' in
-`toplev.c', which are responsible for all further processing necessary,
-ending with output of the assembler language.  All other compiler
-passes run, in sequence, within `rest_of_compilation'.  When that
-function returns from compiling a function definition, the storage used
-for that function definition's compilation is entirely freed, unless it
-is an inline function (*note An Inline Function is As Fast As a Macro:
-Inline.).
-
-   Here is a list of all the passes of the compiler and their source
-files.  Also included is a description of where debugging dumps can be
-requested with `-d' options.
-
-   * Parsing.  This pass reads the entire text of a function definition,
-     constructing partial syntax trees.  This and RTL generation are no
-     longer truly separate passes (formerly they were), but it is
-     easier to think of them as separate.
-
-     The tree representation does not entirely follow C syntax, because
-     it is intended to support other languages as well.
-
-     Language-specific data type analysis is also done in this pass,
-     and every tree node that represents an expression has a data type
-     attached.  Variables are represented as declaration nodes.
-
-     Constant folding and some arithmetic simplifications are also done
-     during this pass.
-
-     The language-independent source files for parsing are
-     `stor-layout.c', `fold-const.c', and `tree.c'.  There are also
-     header files `tree.h' and `tree.def' which define the format of
-     the tree representation.
-
-     The source files to parse C are `c-parse.in', `c-decl.c',
-     `c-typeck.c', `c-aux-info.c', `c-convert.c', and `c-lang.c' along
-     with header files `c-lex.h', and `c-tree.h'.
-
-     The source files for parsing C++ are `cp-parse.y', `cp-class.c',
-     `cp-cvt.c', `cp-decl.c', `cp-decl2.c', `cp-dem.c', `cp-except.c',
-     `cp-expr.c', `cp-init.c', `cp-lex.c', `cp-method.c', `cp-ptree.c',
-     `cp-search.c', `cp-tree.c', `cp-type2.c', and `cp-typeck.c', along
-     with header files `cp-tree.def', `cp-tree.h', and `cp-decl.h'.
-
-     The special source files for parsing Objective C are
-     `objc-parse.y', `objc-actions.c', `objc-tree.def', and
-     `objc-actions.h'.  Certain C-specific files are used for this as
-     well.
-
-     The file `c-common.c' is also used for all of the above languages.
-
-   * RTL generation.  This is the conversion of syntax tree into RTL
-     code.  It is actually done statement-by-statement during parsing,
-     but for most purposes it can be thought of as a separate pass.
-
-     This is where the bulk of target-parameter-dependent code is found,
-     since often it is necessary for strategies to apply only when
-     certain standard kinds of instructions are available.  The purpose
-     of named instruction patterns is to provide this information to
-     the RTL generation pass.
-
-     Optimization is done in this pass for `if'-conditions that are
-     comparisons, boolean operations or conditional expressions.  Tail
-     recursion is detected at this time also.  Decisions are made about
-     how best to arrange loops and how to output `switch' statements.
-
-     The source files for RTL generation include `stmt.c', `calls.c',
-     `expr.c', `explow.c', `expmed.c', `function.c', `optabs.c' and
-     `emit-rtl.c'.  Also, the file `insn-emit.c', generated from the
-     machine description by the program `genemit', is used in this
-     pass.  The header file `expr.h' is used for communication within
-     this pass.
-
-     The header files `insn-flags.h' and `insn-codes.h', generated from
-     the machine description by the programs `genflags' and `gencodes',
-     tell this pass which standard names are available for use and
-     which patterns correspond to them.
-
-     Aside from debugging information output, none of the following
-     passes refers to the tree structure representation of the function
-     (only part of which is saved).
-
-     The decision of whether the function can and should be expanded
-     inline in its subsequent callers is made at the end of rtl
-     generation.  The function must meet certain criteria, currently
-     related to the size of the function and the types and number of
-     parameters it has.  Note that this function may contain loops,
-     recursive calls to itself (tail-recursive functions can be
-     inlined!), gotos, in short, all constructs supported by GNU CC.
-     The file `integrate.c' contains the code to save a function's rtl
-     for later inlining and to inline that rtl when the function is
-     called.  The header file `integrate.h' is also used for this
-     purpose.
-
-     The option `-dr' causes a debugging dump of the RTL code after
-     this pass.  This dump file's name is made by appending `.rtl' to
-     the input file name.
-
-   * Jump optimization.  This pass simplifies jumps to the following
-     instruction, jumps across jumps, and jumps to jumps.  It deletes
-     unreferenced labels and unreachable code, except that unreachable
-     code that contains a loop is not recognized as unreachable in this
-     pass.  (Such loops are deleted later in the basic block analysis.)
-     It also converts some code originally written with jumps into
-     sequences of instructions that directly set values from the
-     results of comparisons, if the machine has such instructions.
-
-     Jump optimization is performed two or three times.  The first time
-     is immediately following RTL generation.  The second time is after
-     CSE, but only if CSE says repeated jump optimization is needed.
-     The last time is right before the final pass.  That time,
-     cross-jumping and deletion of no-op move instructions are done
-     together with the optimizations described above.
-
-     The source file of this pass is `jump.c'.
-
-     The option `-dj' causes a debugging dump of the RTL code after
-     this pass is run for the first time.  This dump file's name is
-     made by appending `.jump' to the input file name.
-
-   * Register scan.  This pass finds the first and last use of each
-     register, as a guide for common subexpression elimination.  Its
-     source is in `regclass.c'.
-
-   * Jump threading.  This pass detects a condition jump that branches
-     to an identical or inverse test.  Such jumps can be `threaded'
-     through the second conditional test.  The source code for this
-     pass is in `jump.c'.  This optimization is only performed if
-     `-fthread-jumps' is enabled.
-
-   * Common subexpression elimination.  This pass also does constant
-     propagation.  Its source file is `cse.c'.  If constant propagation
-     causes conditional jumps to become unconditional or to become
-     no-ops, jump optimization is run again when CSE is finished.
-
-     The option `-ds' causes a debugging dump of the RTL code after
-     this pass.  This dump file's name is made by appending `.cse' to
-     the input file name.
-
-   * Loop optimization.  This pass moves constant expressions out of
-     loops, and optionally does strength-reduction and loop unrolling
-     as well.  Its source files are `loop.c' and `unroll.c', plus the
-     header `loop.h' used for communication between them.  Loop
-     unrolling uses some functions in `integrate.c' and the header
-     `integrate.h'.
-
-     The option `-dL' causes a debugging dump of the RTL code after
-     this pass.  This dump file's name is made by appending `.loop' to
-     the input file name.
-
-   * If `-frerun-cse-after-loop' was enabled, a second common
-     subexpression elimination pass is performed after the loop
-     optimization pass.  Jump threading is also done again at this time
-     if it was specified.
-
-     The option `-dt' causes a debugging dump of the RTL code after
-     this pass.  This dump file's name is made by appending `.cse2' to
-     the input file name.
-
-   * Stupid register allocation is performed at this point in a
-     nonoptimizing compilation.  It does a little data flow analysis as
-     well.  When stupid register allocation is in use, the next pass
-     executed is the reloading pass; the others in between are skipped.
-     The source file is `stupid.c'.
-
-   * Data flow analysis (`flow.c').  This pass divides the program into
-     basic blocks (and in the process deletes unreachable loops); then
-     it computes which pseudo-registers are live at each point in the
-     program, and makes the first instruction that uses a value point at
-     the instruction that computed the value.
-
-     This pass also deletes computations whose results are never used,
-     and combines memory references with add or subtract instructions
-     to make autoincrement or autodecrement addressing.
-
-     The option `-df' causes a debugging dump of the RTL code after
-     this pass.  This dump file's name is made by appending `.flow' to
-     the input file name.  If stupid register allocation is in use, this
-     dump file reflects the full results of such allocation.
-
-   * Instruction combination (`combine.c').  This pass attempts to
-     combine groups of two or three instructions that are related by
-     data flow into single instructions.  It combines the RTL
-     expressions for the instructions by substitution, simplifies the
-     result using algebra, and then attempts to match the result
-     against the machine description.
-
-     The option `-dc' causes a debugging dump of the RTL code after
-     this pass.  This dump file's name is made by appending `.combine'
-     to the input file name.
-
-   * Instruction scheduling (`sched.c').  This pass looks for
-     instructions whose output will not be available by the time that
-     it is used in subsequent instructions.  (Memory loads and floating
-     point instructions often have this behavior on RISC machines).  It
-     re-orders instructions within a basic block to try to separate the
-     definition and use of items that otherwise would cause pipeline
-     stalls.
-
-     Instruction scheduling is performed twice.  The first time is
-     immediately after instruction combination and the second is
-     immediately after reload.
-
-     The option `-dS' causes a debugging dump of the RTL code after this
-     pass is run for the first time.  The dump file's name is made by
-     appending `.sched' to the input file name.
-
-   * Register class preferencing.  The RTL code is scanned to find out
-     which register class is best for each pseudo register.  The source
-     file is `regclass.c'.
-
-   * Local register allocation (`local-alloc.c').  This pass allocates
-     hard registers to pseudo registers that are used only within one
-     basic block.  Because the basic block is linear, it can use fast
-     and powerful techniques to do a very good job.
-
-     The option `-dl' causes a debugging dump of the RTL code after
-     this pass.  This dump file's name is made by appending `.lreg' to
-     the input file name.
-
-   * Global register allocation (`global.c').  This pass allocates hard
-     registers for the remaining pseudo registers (those whose life
-     spans are not contained in one basic block).
-
-   * Reloading.  This pass renumbers pseudo registers with the hardware
-     registers numbers they were allocated.  Pseudo registers that did
-     not get hard registers are replaced with stack slots.  Then it
-     finds instructions that are invalid because a value has failed to
-     end up in a register, or has ended up in a register of the wrong
-     kind.  It fixes up these instructions by reloading the
-     problematical values temporarily into registers.  Additional
-     instructions are generated to do the copying.
-
-     The reload pass also optionally eliminates the frame pointer and
-     inserts instructions to save and restore call-clobbered registers
-     around calls.
-
-     Source files are `reload.c' and `reload1.c', plus the header
-     `reload.h' used for communication between them.
-
-     The option `-dg' causes a debugging dump of the RTL code after
-     this pass.  This dump file's name is made by appending `.greg' to
-     the input file name.
-
-   * Instruction scheduling is repeated here to try to avoid pipeline
-     stalls due to memory loads generated for spilled pseudo registers.
-
-     The option `-dR' causes a debugging dump of the RTL code after
-     this pass.  This dump file's name is made by appending `.sched2'
-     to the input file name.
-
-   * Jump optimization is repeated, this time including cross-jumping
-     and deletion of no-op move instructions.
-
-     The option `-dJ' causes a debugging dump of the RTL code after
-     this pass.  This dump file's name is made by appending `.jump2' to
-     the input file name.
-
-   * Delayed branch scheduling.  This optional pass attempts to find
-     instructions that can go into the delay slots of other
-     instructions, usually jumps and calls.  The source file name is
-     `reorg.c'.
-
-     The option `-dd' causes a debugging dump of the RTL code after
-     this pass.  This dump file's name is made by appending `.dbr' to
-     the input file name.
-
-   * Conversion from usage of some hard registers to usage of a register
-     stack may be done at this point.  Currently, this is supported only
-     for the floating-point registers of the Intel 80387 coprocessor.
-     The source file name is `reg-stack.c'.
-
-     The options `-dk' causes a debugging dump of the RTL code after
-     this pass.  This dump file's name is made by appending `.stack' to
-     the input file name.
-
-   * Final.  This pass outputs the assembler code for the function.  It
-     is also responsible for identifying spurious test and compare
-     instructions.  Machine-specific peephole optimizations are
-     performed at the same time.  The function entry and exit sequences
-     are generated directly as assembler code in this pass; they never
-     exist as RTL.
-
-     The source files are `final.c' plus `insn-output.c'; the latter is
-     generated automatically from the machine description by the tool
-     `genoutput'.  The header file `conditions.h' is used for
-     communication between these files.
-
-   * Debugging information output.  This is run after final because it
-     must output the stack slot offsets for pseudo registers that did
-     not get hard registers.  Source files are `dbxout.c' for DBX
-     symbol table format, `sdbout.c' for SDB symbol table format, and
-     `dwarfout.c' for DWARF symbol table format.
-
-   Some additional files are used by all or many passes:
-
-   * Every pass uses `machmode.def' and `machmode.h' which define the
-     machine modes.
-
-   * Several passes use `real.h', which defines the default
-     representation of floating point constants and how to operate on
-     them.
-
-   * All the passes that work with RTL use the header files `rtl.h' and
-     `rtl.def', and subroutines in file `rtl.c'.  The tools `gen*' also
-     use these files to read and work with the machine description RTL.
-
-   * Several passes refer to the header file `insn-config.h' which
-     contains a few parameters (C macro definitions) generated
-     automatically from the machine description RTL by the tool
-     `genconfig'.
-
-   * Several passes use the instruction recognizer, which consists of
-     `recog.c' and `recog.h', plus the files `insn-recog.c' and
-     `insn-extract.c' that are generated automatically from the machine
-     description by the tools `genrecog' and `genextract'.
-
-   * Several passes use the header files `regs.h' which defines the
-     information recorded about pseudo register usage, and
-     `basic-block.h' which defines the information recorded about basic
-     blocks.
-
-   * `hard-reg-set.h' defines the type `HARD_REG_SET', a bit-vector
-     with a bit for each hard register, and some macros to manipulate
-     it.  This type is just `int' if the machine has few enough hard
-     registers; otherwise it is an array of `int' and some of the
-     macros expand into loops.
-
-   * Several passes use instruction attributes.  A definition of the
-     attributes defined for a particular machine is in file
-     `insn-attr.h', which is generated from the machine description by
-     the program `genattr'.  The file `insn-attrtab.c' contains
-     subroutines to obtain the attribute values for insns.  It is
-     generated from the machine description by the program `genattrtab'.
-
-\1f
-File: gcc.info,  Node: RTL,  Next: Machine Desc,  Prev: Passes,  Up: Top
-
-RTL Representation
-******************
-
-   Most of the work of the compiler is done on an intermediate
-representation called register transfer language.  In this language,
-the instructions to be output are described, pretty much one by one, in
-an algebraic form that describes what the instruction does.
-
-   RTL is inspired by Lisp lists.  It has both an internal form, made
-up of structures that point at other structures, and a textual form
-that is used in the machine description and in printed debugging dumps.
-The textual form uses nested parentheses to indicate the pointers in
-the internal form.
-
-* Menu:
-
-* RTL Objects::       Expressions vs vectors vs strings vs integers.
-* Accessors::         Macros to access expression operands or vector elts.
-* Flags::             Other flags in an RTL expression.
-* Machine Modes::     Describing the size and format of a datum.
-* Constants::         Expressions with constant values.
-* Regs and Memory::   Expressions representing register contents or memory.
-* Arithmetic::        Expressions representing arithmetic on other expressions.
-* Comparisons::       Expressions representing comparison of expressions.
-* Bit Fields::        Expressions representing bitfields in memory or reg.
-* Conversions::       Extending, truncating, floating or fixing.
-* RTL Declarations::  Declaring volatility, constancy, etc.
-* Side Effects::      Expressions for storing in registers, etc.
-* Incdec::            Embedded side-effects for autoincrement addressing.
-* Assembler::         Representing `asm' with operands.
-* Insns::             Expression types for entire insns.
-* Calls::             RTL representation of function call insns.
-* Sharing::           Some expressions are unique; others *must* be copied.
-* Reading RTL::       Reading textual RTL from a file.
-
-\1f
-File: gcc.info,  Node: RTL Objects,  Next: Accessors,  Prev: RTL,  Up: RTL
-
-RTL Object Types
-================
-
-   RTL uses five kinds of objects: expressions, integers, wide integers,
-strings and vectors.  Expressions are the most important ones.  An RTL
-expression ("RTX", for short) is a C structure, but it is usually
-referred to with a pointer; a type that is given the typedef name `rtx'.
-
-   An integer is simply an `int'; their written form uses decimal
-digits.  A wide integer is an integral object whose type is
-`HOST_WIDE_INT' (*note Config::.); their written form uses decimal
-digits.
-
-   A string is a sequence of characters.  In core it is represented as a
-`char *' in usual C fashion, and it is written in C syntax as well.
-However, strings in RTL may never be null.  If you write an empty
-string in a machine description, it is represented in core as a null
-pointer rather than as a pointer to a null character.  In certain
-contexts, these null pointers instead of strings are valid.  Within RTL
-code, strings are most commonly found inside `symbol_ref' expressions,
-but they appear in other contexts in the RTL expressions that make up
-machine descriptions.
-
-   A vector contains an arbitrary number of pointers to expressions.
-The number of elements in the vector is explicitly present in the
-vector.  The written form of a vector consists of square brackets
-(`[...]') surrounding the elements, in sequence and with whitespace
-separating them.  Vectors of length zero are not created; null pointers
-are used instead.
-
-   Expressions are classified by "expression codes" (also called RTX
-codes).  The expression code is a name defined in `rtl.def', which is
-also (in upper case) a C enumeration constant.  The possible expression
-codes and their meanings are machine-independent.  The code of an RTX
-can be extracted with the macro `GET_CODE (X)' and altered with
-`PUT_CODE (X, NEWCODE)'.
-
-   The expression code determines how many operands the expression
-contains, and what kinds of objects they are.  In RTL, unlike Lisp, you
-cannot tell by looking at an operand what kind of object it is.
-Instead, you must know from its context--from the expression code of
-the containing expression.  For example, in an expression of code
-`subreg', the first operand is to be regarded as an expression and the
-second operand as an integer.  In an expression of code `plus', there
-are two operands, both of which are to be regarded as expressions.  In
-a `symbol_ref' expression, there is one operand, which is to be
-regarded as a string.
-
-   Expressions are written as parentheses containing the name of the
-expression type, its flags and machine mode if any, and then the
-operands of the expression (separated by spaces).
-
-   Expression code names in the `md' file are written in lower case,
-but when they appear in C code they are written in upper case.  In this
-manual, they are shown as follows: `const_int'.
-
-   In a few contexts a null pointer is valid where an expression is
-normally wanted.  The written form of this is `(nil)'.
-
-\1f
-File: gcc.info,  Node: Accessors,  Next: Flags,  Prev: RTL Objects,  Up: RTL
-
-Access to Operands
-==================
-
-   For each expression type `rtl.def' specifies the number of contained
-objects and their kinds, with four possibilities: `e' for expression
-(actually a pointer to an expression), `i' for integer, `w' for wide
-integer, `s' for string, and `E' for vector of expressions.  The
-sequence of letters for an expression code is called its "format".
-Thus, the format of `subreg' is `ei'.
-
-   A few other format characters are used occasionally:
-
-`u'
-     `u' is equivalent to `e' except that it is printed differently in
-     debugging dumps.  It is used for pointers to insns.
-
-`n'
-     `n' is equivalent to `i' except that it is printed differently in
-     debugging dumps.  It is used for the line number or code number of
-     a `note' insn.
-
-`S'
-     `S' indicates a string which is optional.  In the RTL objects in
-     core, `S' is equivalent to `s', but when the object is read, from
-     an `md' file, the string value of this operand may be omitted.  An
-     omitted string is taken to be the null string.
-
-`V'
-     `V' indicates a vector which is optional.  In the RTL objects in
-     core, `V' is equivalent to `E', but when the object is read from
-     an `md' file, the vector value of this operand may be omitted.  An
-     omitted vector is effectively the same as a vector of no elements.
-
-`0'
-     `0' means a slot whose contents do not fit any normal category.
-     `0' slots are not printed at all in dumps, and are often used in
-     special ways by small parts of the compiler.
-
-   There are macros to get the number of operands, the format, and the
-class of an expression code:
-
-`GET_RTX_LENGTH (CODE)'
-     Number of operands of an RTX of code CODE.
-
-`GET_RTX_FORMAT (CODE)'
-     The format of an RTX of code CODE, as a C string.
-
-`GET_RTX_CLASS (CODE)'
-     A single character representing the type of RTX operation that code
-     CODE performs.
-
-     The following classes are defined:
-
-    `o'
-          An RTX code that represents an actual object, such as `reg' or
-          `mem'.  `subreg' is not in this class.
-
-    `<'
-          An RTX code for a comparison.  The codes in this class are
-          `NE', `EQ', `LE', `LT', `GE', `GT', `LEU', `LTU', `GEU',
-          `GTU'.
-
-    `1'
-          An RTX code for a unary arithmetic operation, such as `neg'.
-
-    `c'
-          An RTX code for a commutative binary operation, other than
-          `NE' and `EQ' (which have class `<').
-
-    `2'
-          An RTX code for a noncommutative binary operation, such as
-          `MINUS'.
-
-    `b'
-          An RTX code for a bitfield operation, either `ZERO_EXTRACT' or
-          `SIGN_EXTRACT'.
-
-    `3'
-          An RTX code for other three input operations, such as
-          `IF_THEN_ELSE'.
-
-    `i'
-          An RTX code for a machine insn (`INSN', `JUMP_INSN', and
-          `CALL_INSN').
-
-    `m'
-          An RTX code for something that matches in insns, such as
-          `MATCH_DUP'.
-
-    `x'
-          All other RTX codes.
-
-   Operands of expressions are accessed using the macros `XEXP',
-`XINT', `XWINT' and `XSTR'.  Each of these macros takes two arguments:
-an expression-pointer (RTX) and an operand number (counting from zero).
-Thus,
-
-     XEXP (X, 2)
-
-accesses operand 2 of expression X, as an expression.
-
-     XINT (X, 2)
-
-accesses the same operand as an integer.  `XSTR', used in the same
-fashion, would access it as a string.
-
-   Any operand can be accessed as an integer, as an expression or as a
-string.  You must choose the correct method of access for the kind of
-value actually stored in the operand.  You would do this based on the
-expression code of the containing expression.  That is also how you
-would know how many operands there are.
-
-   For example, if X is a `subreg' expression, you know that it has two
-operands which can be correctly accessed as `XEXP (X, 0)' and `XINT (X,
-1)'.  If you did `XINT (X, 0)', you would get the address of the
-expression operand but cast as an integer; that might occasionally be
-useful, but it would be cleaner to write `(int) XEXP (X, 0)'.  `XEXP
-(X, 1)' would also compile without error, and would return the second,
-integer operand cast as an expression pointer, which would probably
-result in a crash when accessed.  Nothing stops you from writing `XEXP
-(X, 28)' either, but this will access memory past the end of the
-expression with unpredictable results.
-
-   Access to operands which are vectors is more complicated.  You can
-use the macro `XVEC' to get the vector-pointer itself, or the macros
-`XVECEXP' and `XVECLEN' to access the elements and length of a vector.
-
-`XVEC (EXP, IDX)'
-     Access the vector-pointer which is operand number IDX in EXP.
-
-`XVECLEN (EXP, IDX)'
-     Access the length (number of elements) in the vector which is in
-     operand number IDX in EXP.  This value is an `int'.
-
-`XVECEXP (EXP, IDX, ELTNUM)'
-     Access element number ELTNUM in the vector which is in operand
-     number IDX in EXP.  This value is an RTX.
-
-     It is up to you to make sure that ELTNUM is not negative and is
-     less than `XVECLEN (EXP, IDX)'.
-
-   All the macros defined in this section expand into lvalues and
-therefore can be used to assign the operands, lengths and vector
-elements as well as to access them.
-
-\1f
-File: gcc.info,  Node: Flags,  Next: Machine Modes,  Prev: Accessors,  Up: RTL
-
-Flags in an RTL Expression
-==========================
-
-   RTL expressions contain several flags (one-bit bitfields) that are
-used in certain types of expression.  Most often they are accessed with
-the following macros:
-
-`MEM_VOLATILE_P (X)'
-     In `mem' expressions, nonzero for volatile memory references.
-     Stored in the `volatil' field and printed as `/v'.
-
-`MEM_IN_STRUCT_P (X)'
-     In `mem' expressions, nonzero for reference to an entire
-     structure, union or array, or to a component of one.  Zero for
-     references to a scalar variable or through a pointer to a scalar.
-     Stored in the `in_struct' field and printed as `/s'.
-
-`REG_LOOP_TEST_P'
-     In `reg' expressions, nonzero if this register's entire life is
-     contained in the exit test code for some loop.  Stored in the
-     `in_struct' field and printed as `/s'.
-
-`REG_USERVAR_P (X)'
-     In a `reg', nonzero if it corresponds to a variable present in the
-     user's source code.  Zero for temporaries generated internally by
-     the compiler.  Stored in the `volatil' field and printed as `/v'.
-
-`REG_FUNCTION_VALUE_P (X)'
-     Nonzero in a `reg' if it is the place in which this function's
-     value is going to be returned.  (This happens only in a hard
-     register.)  Stored in the `integrated' field and printed as `/i'.
-
-     The same hard register may be used also for collecting the values
-     of functions called by this one, but `REG_FUNCTION_VALUE_P' is zero
-     in this kind of use.
-
-`SUBREG_PROMOTED_VAR_P'
-     Nonzero in a `subreg' if it was made when accessing an object that
-     was promoted to a wider mode in accord with the `PROMOTED_MODE'
-     machine description macro (*note Storage Layout::.).  In this
-     case, the mode of the `subreg' is the declared mode of the object
-     and the mode of `SUBREG_REG' is the mode of the register that
-     holds the object.  Promoted variables are always either sign- or
-     zero-extended to the wider mode on every assignment.  Stored in
-     the `in_struct' field and printed as `/s'.
-
-`SUBREG_PROMOTED_UNSIGNED_P'
-     Nonzero in a `subreg' that has `SUBREG_PROMOTED_VAR_P' nonzero if
-     the object being referenced is kept zero-extended and zero if it
-     is kept sign-extended.  Stored in the `unchanging' field and
-     printed as `/u'.
-
-`RTX_UNCHANGING_P (X)'
-     Nonzero in a `reg' or `mem' if the value is not changed.  (This
-     flag is not set for memory references via pointers to constants.
-     Such pointers only guarantee that the object will not be changed
-     explicitly by the current function.  The object might be changed by
-     other functions or by aliasing.)  Stored in the `unchanging' field
-     and printed as `/u'.
-
-`RTX_INTEGRATED_P (INSN)'
-     Nonzero in an insn if it resulted from an in-line function call.
-     Stored in the `integrated' field and printed as `/i'.  This may be
-     deleted; nothing currently depends on it.
-
-`SYMBOL_REF_USED (X)'
-     In a `symbol_ref', indicates that X has been used.  This is
-     normally only used to ensure that X is only declared external
-     once.  Stored in the `used' field.
-
-`SYMBOL_REF_FLAG (X)'
-     In a `symbol_ref', this is used as a flag for machine-specific
-     purposes.  Stored in the `volatil' field and printed as `/v'.
-
-`LABEL_OUTSIDE_LOOP_P'
-     In `label_ref' expressions, nonzero if this is a reference to a
-     label that is outside the innermost loop containing the reference
-     to the label.  Stored in the `in_struct' field and printed as `/s'.
-
-`INSN_DELETED_P (INSN)'
-     In an insn, nonzero if the insn has been deleted.  Stored in the
-     `volatil' field and printed as `/v'.
-
-`INSN_ANNULLED_BRANCH_P (INSN)'
-     In an `insn' in the delay slot of a branch insn, indicates that an
-     annulling branch should be used.  See the discussion under
-     `sequence' below.  Stored in the `unchanging' field and printed as
-     `/u'.
-
-`INSN_FROM_TARGET_P (INSN)'
-     In an `insn' in a delay slot of a branch, indicates that the insn
-     is from the target of the branch.  If the branch insn has
-     `INSN_ANNULLED_BRANCH_P' set, this insn should only be executed if
-     the branch is taken.  For annulled branches with this bit clear,
-     the insn should be executed only if the branch is not taken.
-     Stored in the `in_struct' field and printed as `/s'.
-
-`CONSTANT_POOL_ADDRESS_P (X)'
-     Nonzero in a `symbol_ref' if it refers to part of the current
-     function's "constants pool".  These are addresses close to the
-     beginning of the function, and GNU CC assumes they can be addressed
-     directly (perhaps with the help of base registers).  Stored in the
-     `unchanging' field and printed as `/u'.
-
-`CONST_CALL_P (X)'
-     In a `call_insn', indicates that the insn represents a call to a
-     const function.  Stored in the `unchanging' field and printed as
-     `/u'.
-
-`LABEL_PRESERVE_P (X)'
-     In a `code_label', indicates that the label can never be deleted.
-     Labels referenced by a non-local goto will have this bit set.
-     Stored in the `in_struct' field and printed as `/s'.
-
-`SCHED_GROUP_P (INSN)'
-     During instruction scheduling, in an insn, indicates that the
-     previous insn must be scheduled together with this insn.  This is
-     used to ensure that certain groups of instructions will not be
-     split up by the instruction scheduling pass, for example, `use'
-     insns before a `call_insn' may not be separated from the
-     `call_insn'.  Stored in the `in_struct' field and printed as `/s'.
-
-   These are the fields which the above macros refer to:
-
-`used'
-     Normally, this flag is used only momentarily, at the end of RTL
-     generation for a function, to count the number of times an
-     expression appears in insns.  Expressions that appear more than
-     once are copied, according to the rules for shared structure
-     (*note Sharing::.).
-
-     In a `symbol_ref', it indicates that an external declaration for
-     the symbol has already been written.
-
-     In a `reg', it is used by the leaf register renumbering code to
-     ensure that each register is only renumbered once.
-
-`volatil'
-     This flag is used in `mem', `symbol_ref' and `reg' expressions and
-     in insns.  In RTL dump files, it is printed as `/v'.
-
-     In a `mem' expression, it is 1 if the memory reference is volatile.
-     Volatile memory references may not be deleted, reordered or
-     combined.
-
-     In a `symbol_ref' expression, it is used for machine-specific
-     purposes.
-
-     In a `reg' expression, it is 1 if the value is a user-level
-     variable.  0 indicates an internal compiler temporary.
-
-     In an insn, 1 means the insn has been deleted.
-
-`in_struct'
-     In `mem' expressions, it is 1 if the memory datum referred to is
-     all or part of a structure or array; 0 if it is (or might be) a
-     scalar variable.  A reference through a C pointer has 0 because
-     the pointer might point to a scalar variable.  This information
-     allows the compiler to determine something about possible cases of
-     aliasing.
-
-     In an insn in the delay slot of a branch, 1 means that this insn
-     is from the target of the branch.
-
-     During instruction scheduling, in an insn, 1 means that this insn
-     must be scheduled as part of a group together with the previous
-     insn.
-
-     In `reg' expressions, it is 1 if the register has its entire life
-     contained within the test expression of some loop.
-
-     In `subreg' expressions, 1 means that the `subreg' is accessing an
-     object that has had its mode promoted from a wider mode.
-
-     In `label_ref' expressions, 1 means that the referenced label is
-     outside the innermost loop containing the insn in which the
-     `label_ref' was found.
-
-     In `code_label' expressions, it is 1 if the label may never be
-     deleted.  This is used for labels which are the target of
-     non-local gotos.
-
-     In an RTL dump, this flag is represented as `/s'.
-
-`unchanging'
-     In `reg' and `mem' expressions, 1 means that the value of the
-     expression never changes.
-
-     In `subreg' expressions, it is 1 if the `subreg' references an
-     unsigned object whose mode has been promoted to a wider mode.
-
-     In an insn, 1 means that this is an annulling branch.
-
-     In a `symbol_ref' expression, 1 means that this symbol addresses
-     something in the per-function constants pool.
-
-     In a `call_insn', 1 means that this instruction is a call to a
-     const function.
-
-     In an RTL dump, this flag is represented as `/u'.
-
-`integrated'
-     In some kinds of expressions, including insns, this flag means the
-     rtl was produced by procedure integration.
-
-     In a `reg' expression, this flag indicates the register containing
-     the value to be returned by the current function.  On machines
-     that pass parameters in registers, the same register number may be
-     used for parameters as well, but this flag is not set on such uses.
-
-\1f
-File: gcc.info,  Node: Machine Modes,  Next: Constants,  Prev: Flags,  Up: RTL
-
-Machine Modes
-=============
-
-   A machine mode describes a size of data object and the
-representation used for it.  In the C code, machine modes are
-represented by an enumeration type, `enum machine_mode', defined in
-`machmode.def'.  Each RTL expression has room for a machine mode and so
-do certain kinds of tree expressions (declarations and types, to be
-precise).
-
-   In debugging dumps and machine descriptions, the machine mode of an
-RTL expression is written after the expression code with a colon to
-separate them.  The letters `mode' which appear at the end of each
-machine mode name are omitted.  For example, `(reg:SI 38)' is a `reg'
-expression with machine mode `SImode'.  If the mode is `VOIDmode', it
-is not written at all.
-
-   Here is a table of machine modes.  The term "byte" below refers to an
-object of `BITS_PER_UNIT' bits (*note Storage Layout::.).
-
-`QImode'
-     "Quarter-Integer" mode represents a single byte treated as an
-     integer.
-
-`HImode'
-     "Half-Integer" mode represents a two-byte integer.
-
-`PSImode'
-     "Partial Single Integer" mode represents an integer which occupies
-     four bytes but which doesn't really use all four.  On some
-     machines, this is the right mode to use for pointers.
-
-`SImode'
-     "Single Integer" mode represents a four-byte integer.
-
-`PDImode'
-     "Partial Double Integer" mode represents an integer which occupies
-     eight bytes but which doesn't really use all eight.  On some
-     machines, this is the right mode to use for certain pointers.
-
-`DImode'
-     "Double Integer" mode represents an eight-byte integer.
-
-`TImode'
-     "Tetra Integer" (?) mode represents a sixteen-byte integer.
-
-`SFmode'
-     "Single Floating" mode represents a single-precision (four byte)
-     floating point number.
-
-`DFmode'
-     "Double Floating" mode represents a double-precision (eight byte)
-     floating point number.
-
-`XFmode'
-     "Extended Floating" mode represents a triple-precision (twelve
-     byte) floating point number.  This mode is used for IEEE extended
-     floating point.  On some systems not all bits within these bytes
-     will actually be used.
-
-`TFmode'
-     "Tetra Floating" mode represents a quadruple-precision (sixteen
-     byte) floating point number.
-
-`CCmode'
-     "Condition Code" mode represents the value of a condition code,
-     which is a machine-specific set of bits used to represent the
-     result of a comparison operation.  Other machine-specific modes
-     may also be used for the condition code.  These modes are not used
-     on machines that use `cc0' (see *note Condition Code::.).
-
-`BLKmode'
-     "Block" mode represents values that are aggregates to which none of
-     the other modes apply.  In RTL, only memory references can have
-     this mode, and only if they appear in string-move or vector
-     instructions.  On machines which have no such instructions,
-     `BLKmode' will not appear in RTL.
-
-`VOIDmode'
-     Void mode means the absence of a mode or an unspecified mode.  For
-     example, RTL expressions of code `const_int' have mode `VOIDmode'
-     because they can be taken to have whatever mode the context
-     requires.  In debugging dumps of RTL, `VOIDmode' is expressed by
-     the absence of any mode.
-
-`SCmode, DCmode, XCmode, TCmode'
-     These modes stand for a complex number represented as a pair of
-     floating point values.  The floating point values are in `SFmode',
-     `DFmode', `XFmode', and `TFmode', respectively.
-
-`CQImode, CHImode, CSImode, CDImode, CTImode, COImode'
-     These modes stand for a complex number represented as a pair of
-     integer values.  The integer values are in `QImode', `HImode',
-     `SImode', `DImode', `TImode', and `OImode', respectively.
-
-   The machine description defines `Pmode' as a C macro which expands
-into the machine mode used for addresses.  Normally this is the mode
-whose size is `BITS_PER_WORD', `SImode' on 32-bit machines.
-
-   The only modes which a machine description must support are
-`QImode', and the modes corresponding to `BITS_PER_WORD',
-`FLOAT_TYPE_SIZE' and `DOUBLE_TYPE_SIZE'.  The compiler will attempt to
-use `DImode' for 8-byte structures and unions, but this can be
-prevented by overriding the definition of `MAX_FIXED_MODE_SIZE'.
-Alternatively, you can have the compiler use `TImode' for 16-byte
-structures and unions.  Likewise, you can arrange for the C type `short
-int' to avoid using `HImode'.
-
-   Very few explicit references to machine modes remain in the compiler
-and these few references will soon be removed.  Instead, the machine
-modes are divided into mode classes.  These are represented by the
-enumeration type `enum mode_class' defined in `machmode.h'.  The
-possible mode classes are:
-
-`MODE_INT'
-     Integer modes.  By default these are `QImode', `HImode', `SImode',
-     `DImode', and `TImode'.
-
-`MODE_PARTIAL_INT'
-     The "partial integer" modes, `PSImode' and `PDImode'.
-
-`MODE_FLOAT'
-     floating point modes.  By default these are `SFmode', `DFmode',
-     `XFmode' and `TFmode'.
-
-`MODE_COMPLEX_INT'
-     Complex integer modes.  (These are not currently implemented).
-
-`MODE_COMPLEX_FLOAT'
-     Complex floating point modes.  By default these are `SCmode',
-     `DCmode', `XCmode', and `TCmode'.
-
-`MODE_FUNCTION'
-     Algol or Pascal function variables including a static chain.
-     (These are not currently implemented).
-
-`MODE_CC'
-     Modes representing condition code values.  These are `CCmode' plus
-     any modes listed in the `EXTRA_CC_MODES' macro.  *Note Jump
-     Patterns::, also see *Note Condition Code::.
-
-`MODE_RANDOM'
-     This is a catchall mode class for modes which don't fit into the
-     above classes.  Currently `VOIDmode' and `BLKmode' are in
-     `MODE_RANDOM'.
-
-   Here are some C macros that relate to machine modes:
-
-`GET_MODE (X)'
-     Returns the machine mode of the RTX X.
-
-`PUT_MODE (X, NEWMODE)'
-     Alters the machine mode of the RTX X to be NEWMODE.
-
-`NUM_MACHINE_MODES'
-     Stands for the number of machine modes available on the target
-     machine.  This is one greater than the largest numeric value of any
-     machine mode.
-
-`GET_MODE_NAME (M)'
-     Returns the name of mode M as a string.
-
-`GET_MODE_CLASS (M)'
-     Returns the mode class of mode M.
-
-`GET_MODE_WIDER_MODE (M)'
-     Returns the next wider natural mode.  For example, the expression
-     `GET_MODE_WIDER_MODE (QImode)' returns `HImode'.
-
-`GET_MODE_SIZE (M)'
-     Returns the size in bytes of a datum of mode M.
-
-`GET_MODE_BITSIZE (M)'
-     Returns the size in bits of a datum of mode M.
-
-`GET_MODE_MASK (M)'
-     Returns a bitmask containing 1 for all bits in a word that fit
-     within mode M.  This macro can only be used for modes whose
-     bitsize is less than or equal to `HOST_BITS_PER_INT'.
-
-`GET_MODE_ALIGNMENT (M))'
-     Return the required alignment, in bits, for an object of mode M.
-
-`GET_MODE_UNIT_SIZE (M)'
-     Returns the size in bytes of the subunits of a datum of mode M.
-     This is the same as `GET_MODE_SIZE' except in the case of complex
-     modes.  For them, the unit size is the size of the real or
-     imaginary part.
-
-`GET_MODE_NUNITS (M)'
-     Returns the number of units contained in a mode, i.e.,
-     `GET_MODE_SIZE' divided by `GET_MODE_UNIT_SIZE'.
-
-`GET_CLASS_NARROWEST_MODE (C)'
-     Returns the narrowest mode in mode class C.
-
-   The global variables `byte_mode' and `word_mode' contain modes whose
-classes are `MODE_INT' and whose bitsizes are either `BITS_PER_UNIT' or
-`BITS_PER_WORD', respectively.  On 32-bit machines, these are `QImode'
-and `SImode', respectively.
-
-\1f
-File: gcc.info,  Node: Constants,  Next: Regs and Memory,  Prev: Machine Modes,  Up: RTL
-
-Constant Expression Types
-=========================
-
-   The simplest RTL expressions are those that represent constant
-values.
-
-`(const_int I)'
-     This type of expression represents the integer value I.  I is
-     customarily accessed with the macro `INTVAL' as in `INTVAL (EXP)',
-     which is equivalent to `XWINT (EXP, 0)'.
-
-     There is only one expression object for the integer value zero; it
-     is the value of the variable `const0_rtx'.  Likewise, the only
-     expression for integer value one is found in `const1_rtx', the only
-     expression for integer value two is found in `const2_rtx', and the
-     only expression for integer value negative one is found in
-     `constm1_rtx'.  Any attempt to create an expression of code
-     `const_int' and value zero, one, two or negative one will return
-     `const0_rtx', `const1_rtx', `const2_rtx' or `constm1_rtx' as
-     appropriate.
-
-     Similarly, there is only one object for the integer whose value is
-     `STORE_FLAG_VALUE'.  It is found in `const_true_rtx'.  If
-     `STORE_FLAG_VALUE' is one, `const_true_rtx' and `const1_rtx' will
-     point to the same object.  If `STORE_FLAG_VALUE' is -1,
-     `const_true_rtx' and `constm1_rtx' will point to the same object.
-
-`(const_double:M ADDR I0 I1 ...)'
-     Represents either a floating-point constant of mode M or an
-     integer constant too large to fit into `HOST_BITS_PER_WIDE_INT'
-     bits but small enough to fit within twice that number of bits (GNU
-     CC does not provide a mechanism to represent even larger
-     constants).  In the latter case, M will be `VOIDmode'.
-
-     ADDR is used to contain the `mem' expression that corresponds to
-     the location in memory that at which the constant can be found.  If
-     it has not been allocated a memory location, but is on the chain
-     of all `const_double' expressions in this compilation (maintained
-     using an undisplayed field), ADDR contains `const0_rtx'.  If it is
-     not on the chain, ADDR contains `cc0_rtx'.  ADDR is customarily
-     accessed with the macro `CONST_DOUBLE_MEM' and the chain field via
-     `CONST_DOUBLE_CHAIN'.
-
-     If M is `VOIDmode', the bits of the value are stored in I0 and I1.
-     I0 is customarily accessed with the macro `CONST_DOUBLE_LOW' and
-     I1 with `CONST_DOUBLE_HIGH'.
-
-     If the constant is floating point (regardless of its precision),
-     then the number of integers used to store the value depends on the
-     size of `REAL_VALUE_TYPE' (*note Cross-compilation::.).  The
-     integers represent a floating point number, but not precisely in
-     the target machine's or host machine's floating point format.  To
-     convert them to the precise bit pattern used by the target
-     machine, use the macro `REAL_VALUE_TO_TARGET_DOUBLE' and friends
-     (*note Data Output::.).
-
-     The macro `CONST0_RTX (MODE)' refers to an expression with value 0
-     in mode MODE.  If mode MODE is of mode class `MODE_INT', it
-     returns `const0_rtx'.  Otherwise, it returns a `CONST_DOUBLE'
-     expression in mode MODE.  Similarly, the macro `CONST1_RTX (MODE)'
-     refers to an expression with value 1 in mode MODE and similarly
-     for `CONST2_RTX'.
-
-`(const_string STR)'
-     Represents a constant string with value STR.  Currently this is
-     used only for insn attributes (*note Insn Attributes::.) since
-     constant strings in C are placed in memory.
-
-`(symbol_ref:MODE SYMBOL)'
-     Represents the value of an assembler label for data.  SYMBOL is a
-     string that describes the name of the assembler label.  If it
-     starts with a `*', the label is the rest of SYMBOL not including
-     the `*'.  Otherwise, the label is SYMBOL, usually prefixed with
-     `_'.
-
-     The `symbol_ref' contains a mode, which is usually `Pmode'.
-     Usually that is the only mode for which a symbol is directly valid.
-
-`(label_ref LABEL)'
-     Represents the value of an assembler label for code.  It contains
-     one operand, an expression, which must be a `code_label' that
-     appears in the instruction sequence to identify the place where
-     the label should go.
-
-     The reason for using a distinct expression type for code label
-     references is so that jump optimization can distinguish them.
-
-`(const:M EXP)'
-     Represents a constant that is the result of an assembly-time
-     arithmetic computation.  The operand, EXP, is an expression that
-     contains only constants (`const_int', `symbol_ref' and `label_ref'
-     expressions) combined with `plus' and `minus'.  However, not all
-     combinations are valid, since the assembler cannot do arbitrary
-     arithmetic on relocatable symbols.
-
-     M should be `Pmode'.
-
-`(high:M EXP)'
-     Represents the high-order bits of EXP, usually a `symbol_ref'.
-     The number of bits is machine-dependent and is normally the number
-     of bits specified in an instruction that initializes the high
-     order bits of a register.  It is used with `lo_sum' to represent
-     the typical two-instruction sequence used in RISC machines to
-     reference a global memory location.
-
-     M should be `Pmode'.
-
diff --git a/gcc/gcc.info-15 b/gcc/gcc.info-15
deleted file mode 100644 (file)
index ef51ab5..0000000
+++ /dev/null
@@ -1,1010 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Regs and Memory,  Next: Arithmetic,  Prev: Constants,  Up: RTL
-
-Registers and Memory
-====================
-
-   Here are the RTL expression types for describing access to machine
-registers and to main memory.
-
-`(reg:M N)'
-     For small values of the integer N (those that are less than
-     `FIRST_PSEUDO_REGISTER'), this stands for a reference to machine
-     register number N: a "hard register".  For larger values of N, it
-     stands for a temporary value or "pseudo register".  The compiler's
-     strategy is to generate code assuming an unlimited number of such
-     pseudo registers, and later convert them into hard registers or
-     into memory references.
-
-     M is the machine mode of the reference.  It is necessary because
-     machines can generally refer to each register in more than one
-     mode.  For example, a register may contain a full word but there
-     may be instructions to refer to it as a half word or as a single
-     byte, as well as instructions to refer to it as a floating point
-     number of various precisions.
-
-     Even for a register that the machine can access in only one mode,
-     the mode must always be specified.
-
-     The symbol `FIRST_PSEUDO_REGISTER' is defined by the machine
-     description, since the number of hard registers on the machine is
-     an invariant characteristic of the machine.  Note, however, that
-     not all of the machine registers must be general registers.  All
-     the machine registers that can be used for storage of data are
-     given hard register numbers, even those that can be used only in
-     certain instructions or can hold only certain types of data.
-
-     A hard register may be accessed in various modes throughout one
-     function, but each pseudo register is given a natural mode and is
-     accessed only in that mode.  When it is necessary to describe an
-     access to a pseudo register using a nonnatural mode, a `subreg'
-     expression is used.
-
-     A `reg' expression with a machine mode that specifies more than
-     one word of data may actually stand for several consecutive
-     registers.  If in addition the register number specifies a
-     hardware register, then it actually represents several consecutive
-     hardware registers starting with the specified one.
-
-     Each pseudo register number used in a function's RTL code is
-     represented by a unique `reg' expression.
-
-     Some pseudo register numbers, those within the range of
-     `FIRST_VIRTUAL_REGISTER' to `LAST_VIRTUAL_REGISTER' only appear
-     during the RTL generation phase and are eliminated before the
-     optimization phases.  These represent locations in the stack frame
-     that cannot be determined until RTL generation for the function
-     has been completed.  The following virtual register numbers are
-     defined:
-
-    `VIRTUAL_INCOMING_ARGS_REGNUM'
-          This points to the first word of the incoming arguments
-          passed on the stack.  Normally these arguments are placed
-          there by the caller, but the callee may have pushed some
-          arguments that were previously passed in registers.
-
-          When RTL generation is complete, this virtual register is
-          replaced by the sum of the register given by
-          `ARG_POINTER_REGNUM' and the value of `FIRST_PARM_OFFSET'.
-
-    `VIRTUAL_STACK_VARS_REGNUM'
-          If `FRAME_GROWS_DOWNWARD' is defined, this points to
-          immediately above the first variable on the stack.
-          Otherwise, it points to the first variable on the stack.
-
-          `VIRTUAL_STACK_VARS_REGNUM' is replaced with the sum of the
-          register given by `FRAME_POINTER_REGNUM' and the value
-          `STARTING_FRAME_OFFSET'.
-
-    `VIRTUAL_STACK_DYNAMIC_REGNUM'
-          This points to the location of dynamically allocated memory
-          on the stack immediately after the stack pointer has been
-          adjusted by the amount of memory desired.
-
-          This virtual register is replaced by the sum of the register
-          given by `STACK_POINTER_REGNUM' and the value
-          `STACK_DYNAMIC_OFFSET'.
-
-    `VIRTUAL_OUTGOING_ARGS_REGNUM'
-          This points to the location in the stack at which outgoing
-          arguments should be written when the stack is pre-pushed
-          (arguments pushed using push insns should always use
-          `STACK_POINTER_REGNUM').
-
-          This virtual register is replaced by the sum of the register
-          given by `STACK_POINTER_REGNUM' and the value
-          `STACK_POINTER_OFFSET'.
-
-`(subreg:M REG WORDNUM)'
-     `subreg' expressions are used to refer to a register in a machine
-     mode other than its natural one, or to refer to one register of a
-     multi-word `reg' that actually refers to several registers.
-
-     Each pseudo-register has a natural mode.  If it is necessary to
-     operate on it in a different mode--for example, to perform a
-     fullword move instruction on a pseudo-register that contains a
-     single byte--the pseudo-register must be enclosed in a `subreg'.
-     In such a case, WORDNUM is zero.
-
-     Usually M is at least as narrow as the mode of REG, in which case
-     it is restricting consideration to only the bits of REG that are
-     in M.
-
-     Sometimes M is wider than the mode of REG.  These `subreg'
-     expressions are often called "paradoxical".  They are used in
-     cases where we want to refer to an object in a wider mode but do
-     not care what value the additional bits have.  The reload pass
-     ensures that paradoxical references are only made to hard
-     registers.
-
-     The other use of `subreg' is to extract the individual registers of
-     a multi-register value.  Machine modes such as `DImode' and
-     `TImode' can indicate values longer than a word, values which
-     usually require two or more consecutive registers.  To access one
-     of the registers, use a `subreg' with mode `SImode' and a WORDNUM
-     that says which register.
-
-     Storing in a non-paradoxical `subreg' has undefined results for
-     bits belonging to the same word as the `subreg'.  This laxity makes
-     it easier to generate efficient code for such instructions.  To
-     represent an instruction that preserves all the bits outside of
-     those in the `subreg', use `strict_low_part' around the `subreg'.
-
-     The compilation parameter `WORDS_BIG_ENDIAN', if set to 1, says
-     that word number zero is the most significant part; otherwise, it
-     is the least significant part.
-
-     Between the combiner pass and the reload pass, it is possible to
-     have a paradoxical `subreg' which contains a `mem' instead of a
-     `reg' as its first operand.  After the reload pass, it is also
-     possible to have a non-paradoxical `subreg' which contains a
-     `mem'; this usually occurs when the `mem' is a stack slot which
-     replaced a pseudo register.
-
-     Note that it is not valid to access a `DFmode' value in `SFmode'
-     using a `subreg'.  On some machines the most significant part of a
-     `DFmode' value does not have the same format as a single-precision
-     floating value.
-
-     It is also not valid to access a single word of a multi-word value
-     in a hard register when less registers can hold the value than
-     would be expected from its size.  For example, some 32-bit
-     machines have floating-point registers that can hold an entire
-     `DFmode' value.  If register 10 were such a register `(subreg:SI
-     (reg:DF 10) 1)' would be invalid because there is no way to
-     convert that reference to a single machine register.  The reload
-     pass prevents `subreg' expressions such as these from being formed.
-
-     The first operand of a `subreg' expression is customarily accessed
-     with the `SUBREG_REG' macro and the second operand is customarily
-     accessed with the `SUBREG_WORD' macro.
-
-`(scratch:M)'
-     This represents a scratch register that will be required for the
-     execution of a single instruction and not used subsequently.  It is
-     converted into a `reg' by either the local register allocator or
-     the reload pass.
-
-     `scratch' is usually present inside a `clobber' operation (*note
-     Side Effects::.).
-
-`(cc0)'
-     This refers to the machine's condition code register.  It has no
-     operands and may not have a machine mode.  There are two ways to
-     use it:
-
-        * To stand for a complete set of condition code flags.  This is
-          best on most machines, where each comparison sets the entire
-          series of flags.
-
-          With this technique, `(cc0)' may be validly used in only two
-          contexts: as the destination of an assignment (in test and
-          compare instructions) and in comparison operators comparing
-          against zero (`const_int' with value zero; that is to say,
-          `const0_rtx').
-
-        * To stand for a single flag that is the result of a single
-          condition.  This is useful on machines that have only a
-          single flag bit, and in which comparison instructions must
-          specify the condition to test.
-
-          With this technique, `(cc0)' may be validly used in only two
-          contexts: as the destination of an assignment (in test and
-          compare instructions) where the source is a comparison
-          operator, and as the first operand of `if_then_else' (in a
-          conditional branch).
-
-     There is only one expression object of code `cc0'; it is the value
-     of the variable `cc0_rtx'.  Any attempt to create an expression of
-     code `cc0' will return `cc0_rtx'.
-
-     Instructions can set the condition code implicitly.  On many
-     machines, nearly all instructions set the condition code based on
-     the value that they compute or store.  It is not necessary to
-     record these actions explicitly in the RTL because the machine
-     description includes a prescription for recognizing the
-     instructions that do so (by means of the macro
-     `NOTICE_UPDATE_CC').  *Note Condition Code::.  Only instructions
-     whose sole purpose is to set the condition code, and instructions
-     that use the condition code, need mention `(cc0)'.
-
-     On some machines, the condition code register is given a register
-     number and a `reg' is used instead of `(cc0)'.  This is usually the
-     preferable approach if only a small subset of instructions modify
-     the condition code.  Other machines store condition codes in
-     general registers; in such cases a pseudo register should be used.
-
-     Some machines, such as the Sparc and RS/6000, have two sets of
-     arithmetic instructions, one that sets and one that does not set
-     the condition code.  This is best handled by normally generating
-     the instruction that does not set the condition code, and making a
-     pattern that both performs the arithmetic and sets the condition
-     code register (which would not be `(cc0)' in this case).  For
-     examples, search for `addcc' and `andcc' in `sparc.md'.
-
-`(pc)'
-     This represents the machine's program counter.  It has no operands
-     and may not have a machine mode.  `(pc)' may be validly used only
-     in certain specific contexts in jump instructions.
-
-     There is only one expression object of code `pc'; it is the value
-     of the variable `pc_rtx'.  Any attempt to create an expression of
-     code `pc' will return `pc_rtx'.
-
-     All instructions that do not jump alter the program counter
-     implicitly by incrementing it, but there is no need to mention
-     this in the RTL.
-
-`(mem:M ADDR)'
-     This RTX represents a reference to main memory at an address
-     represented by the expression ADDR.  M specifies how large a unit
-     of memory is accessed.
-
-`(addressof:M REG)'
-     This RTX represents a request for the address of register REG.
-     Its mode is always `Pmode'.  If there are any `addressof'
-     expressions left in the function after CSE, REG is forced into the
-     stack and the `addressof' expression is replaced with a `plus'
-     expression for the address of its stack slot.
-
-\1f
-File: gcc.info,  Node: Arithmetic,  Next: Comparisons,  Prev: Regs and Memory,  Up: RTL
-
-RTL Expressions for Arithmetic
-==============================
-
-   Unless otherwise specified, all the operands of arithmetic
-expressions must be valid for mode M.  An operand is valid for mode M
-if it has mode M, or if it is a `const_int' or `const_double' and M is
-a mode of class `MODE_INT'.
-
-   For commutative binary operations, constants should be placed in the
-second operand.
-
-`(plus:M X Y)'
-     Represents the sum of the values represented by X and Y carried
-     out in machine mode M.
-
-`(lo_sum:M X Y)'
-     Like `plus', except that it represents that sum of X and the
-     low-order bits of Y.  The number of low order bits is
-     machine-dependent but is normally the number of bits in a `Pmode'
-     item minus the number of bits set by the `high' code (*note
-     Constants::.).
-
-     M should be `Pmode'.
-
-`(minus:M X Y)'
-     Like `plus' but represents subtraction.
-
-`(compare:M X Y)'
-     Represents the result of subtracting Y from X for purposes of
-     comparison.  The result is computed without overflow, as if with
-     infinite precision.
-
-     Of course, machines can't really subtract with infinite precision.
-     However, they can pretend to do so when only the sign of the
-     result will be used, which is the case when the result is stored
-     in the condition code.   And that is the only way this kind of
-     expression may validly be used: as a value to be stored in the
-     condition codes.
-
-     The mode M is not related to the modes of X and Y, but instead is
-     the mode of the condition code value.  If `(cc0)' is used, it is
-     `VOIDmode'.  Otherwise it is some mode in class `MODE_CC', often
-     `CCmode'.  *Note Condition Code::.
-
-     Normally, X and Y must have the same mode.  Otherwise, `compare'
-     is valid only if the mode of X is in class `MODE_INT' and Y is a
-     `const_int' or `const_double' with mode `VOIDmode'.  The mode of X
-     determines what mode the comparison is to be done in; thus it must
-     not be `VOIDmode'.
-
-     If one of the operands is a constant, it should be placed in the
-     second operand and the comparison code adjusted as appropriate.
-
-     A `compare' specifying two `VOIDmode' constants is not valid since
-     there is no way to know in what mode the comparison is to be
-     performed; the comparison must either be folded during the
-     compilation or the first operand must be loaded into a register
-     while its mode is still known.
-
-`(neg:M X)'
-     Represents the negation (subtraction from zero) of the value
-     represented by X, carried out in mode M.
-
-`(mult:M X Y)'
-     Represents the signed product of the values represented by X and Y
-     carried out in machine mode M.
-
-     Some machines support a multiplication that generates a product
-     wider than the operands.  Write the pattern for this as
-
-          (mult:M (sign_extend:M X) (sign_extend:M Y))
-
-     where M is wider than the modes of X and Y, which need not be the
-     same.
-
-     Write patterns for unsigned widening multiplication similarly using
-     `zero_extend'.
-
-`(div:M X Y)'
-     Represents the quotient in signed division of X by Y, carried out
-     in machine mode M.  If M is a floating point mode, it represents
-     the exact quotient; otherwise, the integerized quotient.
-
-     Some machines have division instructions in which the operands and
-     quotient widths are not all the same; you should represent such
-     instructions using `truncate' and `sign_extend' as in,
-
-          (truncate:M1 (div:M2 X (sign_extend:M2 Y)))
-
-`(udiv:M X Y)'
-     Like `div' but represents unsigned division.
-
-`(mod:M X Y)'
-`(umod:M X Y)'
-     Like `div' and `udiv' but represent the remainder instead of the
-     quotient.
-
-`(smin:M X Y)'
-`(smax:M X Y)'
-     Represents the smaller (for `smin') or larger (for `smax') of X
-     and Y, interpreted as signed integers in mode M.
-
-`(umin:M X Y)'
-`(umax:M X Y)'
-     Like `smin' and `smax', but the values are interpreted as unsigned
-     integers.
-
-`(not:M X)'
-     Represents the bitwise complement of the value represented by X,
-     carried out in mode M, which must be a fixed-point machine mode.
-
-`(and:M X Y)'
-     Represents the bitwise logical-and of the values represented by X
-     and Y, carried out in machine mode M, which must be a fixed-point
-     machine mode.
-
-`(ior:M X Y)'
-     Represents the bitwise inclusive-or of the values represented by X
-     and Y, carried out in machine mode M, which must be a fixed-point
-     mode.
-
-`(xor:M X Y)'
-     Represents the bitwise exclusive-or of the values represented by X
-     and Y, carried out in machine mode M, which must be a fixed-point
-     mode.
-
-`(ashift:M X C)'
-     Represents the result of arithmetically shifting X left by C
-     places.  X have mode M, a fixed-point machine mode.  C be a
-     fixed-point mode or be a constant with mode `VOIDmode'; which mode
-     is determined by the mode called for in the machine description
-     entry for the left-shift instruction.  For example, on the Vax,
-     the mode of C is `QImode' regardless of M.
-
-`(lshiftrt:M X C)'
-`(ashiftrt:M X C)'
-     Like `ashift' but for right shift.  Unlike the case for left shift,
-     these two operations are distinct.
-
-`(rotate:M X C)'
-`(rotatert:M X C)'
-     Similar but represent left and right rotate.  If C is a constant,
-     use `rotate'.
-
-`(abs:M X)'
-     Represents the absolute value of X, computed in mode M.
-
-`(sqrt:M X)'
-     Represents the square root of X, computed in mode M.  Most often M
-     will be a floating point mode.
-
-`(ffs:M X)'
-     Represents one plus the index of the least significant 1-bit in X,
-     represented as an integer of mode M.  (The value is zero if X is
-     zero.)  The mode of X need not be M; depending on the target
-     machine, various mode combinations may be valid.
-
-\1f
-File: gcc.info,  Node: Comparisons,  Next: Bit Fields,  Prev: Arithmetic,  Up: RTL
-
-Comparison Operations
-=====================
-
-   Comparison operators test a relation on two operands and are
-considered to represent a machine-dependent nonzero value described by,
-but not necessarily equal to, `STORE_FLAG_VALUE' (*note Misc::.)  if
-the relation holds, or zero if it does not.  The mode of the comparison
-operation is independent of the mode of the data being compared.  If
-the comparison operation is being tested (e.g., the first operand of an
-`if_then_else'), the mode must be `VOIDmode'.  If the comparison
-operation is producing data to be stored in some variable, the mode
-must be in class `MODE_INT'.  All comparison operations producing data
-must use the same mode, which is machine-specific.
-
-   There are two ways that comparison operations may be used.  The
-comparison operators may be used to compare the condition codes `(cc0)'
-against zero, as in `(eq (cc0) (const_int 0))'.  Such a construct
-actually refers to the result of the preceding instruction in which the
-condition codes were set.  The instructing setting the condition code
-must be adjacent to the instruction using the condition code; only
-`note' insns may separate them.
-
-   Alternatively, a comparison operation may directly compare two data
-objects.  The mode of the comparison is determined by the operands; they
-must both be valid for a common machine mode.  A comparison with both
-operands constant would be invalid as the machine mode could not be
-deduced from it, but such a comparison should never exist in RTL due to
-constant folding.
-
-   In the example above, if `(cc0)' were last set to `(compare X Y)',
-the comparison operation is identical to `(eq X Y)'.  Usually only one
-style of comparisons is supported on a particular machine, but the
-combine pass will try to merge the operations to produce the `eq' shown
-in case it exists in the context of the particular insn involved.
-
-   Inequality comparisons come in two flavors, signed and unsigned.
-Thus, there are distinct expression codes `gt' and `gtu' for signed and
-unsigned greater-than.  These can produce different results for the same
-pair of integer values: for example, 1 is signed greater-than -1 but not
-unsigned greater-than, because -1 when regarded as unsigned is actually
-`0xffffffff' which is greater than 1.
-
-   The signed comparisons are also used for floating point values.
-Floating point comparisons are distinguished by the machine modes of
-the operands.
-
-`(eq:M X Y)'
-     1 if the values represented by X and Y are equal, otherwise 0.
-
-`(ne:M X Y)'
-     1 if the values represented by X and Y are not equal, otherwise 0.
-
-`(gt:M X Y)'
-     1 if the X is greater than Y.  If they are fixed-point, the
-     comparison is done in a signed sense.
-
-`(gtu:M X Y)'
-     Like `gt' but does unsigned comparison, on fixed-point numbers
-     only.
-
-`(lt:M X Y)'
-`(ltu:M X Y)'
-     Like `gt' and `gtu' but test for "less than".
-
-`(ge:M X Y)'
-`(geu:M X Y)'
-     Like `gt' and `gtu' but test for "greater than or equal".
-
-`(le:M X Y)'
-`(leu:M X Y)'
-     Like `gt' and `gtu' but test for "less than or equal".
-
-`(if_then_else COND THEN ELSE)'
-     This is not a comparison operation but is listed here because it is
-     always used in conjunction with a comparison operation.  To be
-     precise, COND is a comparison expression.  This expression
-     represents a choice, according to COND, between the value
-     represented by THEN and the one represented by ELSE.
-
-     On most machines, `if_then_else' expressions are valid only to
-     express conditional jumps.
-
-`(cond [TEST1 VALUE1 TEST2 VALUE2 ...] DEFAULT)'
-     Similar to `if_then_else', but more general.  Each of TEST1,
-     TEST2, ... is performed in turn.  The result of this expression is
-     the VALUE corresponding to the first non-zero test, or DEFAULT if
-     none of the tests are non-zero expressions.
-
-     This is currently not valid for instruction patterns and is
-     supported only for insn attributes.  *Note Insn Attributes::.
-
-\1f
-File: gcc.info,  Node: Bit Fields,  Next: Conversions,  Prev: Comparisons,  Up: RTL
-
-Bit Fields
-==========
-
-   Special expression codes exist to represent bitfield instructions.
-These types of expressions are lvalues in RTL; they may appear on the
-left side of an assignment, indicating insertion of a value into the
-specified bit field.
-
-`(sign_extract:M LOC SIZE POS)'
-     This represents a reference to a sign-extended bit field contained
-     or starting in LOC (a memory or register reference).  The bit field
-     is SIZE bits wide and starts at bit POS.  The compilation option
-     `BITS_BIG_ENDIAN' says which end of the memory unit POS counts
-     from.
-
-     If LOC is in memory, its mode must be a single-byte integer mode.
-     If LOC is in a register, the mode to use is specified by the
-     operand of the `insv' or `extv' pattern (*note Standard Names::.)
-     and is usually a full-word integer mode, which is the default if
-     none is specified.
-
-     The mode of POS is machine-specific and is also specified in the
-     `insv' or `extv' pattern.
-
-     The mode M is the same as the mode that would be used for LOC if
-     it were a register.
-
-`(zero_extract:M LOC SIZE POS)'
-     Like `sign_extract' but refers to an unsigned or zero-extended bit
-     field.  The same sequence of bits are extracted, but they are
-     filled to an entire word with zeros instead of by sign-extension.
-
-\1f
-File: gcc.info,  Node: Conversions,  Next: RTL Declarations,  Prev: Bit Fields,  Up: RTL
-
-Conversions
-===========
-
-   All conversions between machine modes must be represented by
-explicit conversion operations.  For example, an expression which is
-the sum of a byte and a full word cannot be written as `(plus:SI
-(reg:QI 34) (reg:SI 80))' because the `plus' operation requires two
-operands of the same machine mode.  Therefore, the byte-sized operand
-is enclosed in a conversion operation, as in
-
-     (plus:SI (sign_extend:SI (reg:QI 34)) (reg:SI 80))
-
-   The conversion operation is not a mere placeholder, because there
-may be more than one way of converting from a given starting mode to
-the desired final mode.  The conversion operation code says how to do
-it.
-
-   For all conversion operations, X must not be `VOIDmode' because the
-mode in which to do the conversion would not be known.  The conversion
-must either be done at compile-time or X must be placed into a register.
-
-`(sign_extend:M X)'
-     Represents the result of sign-extending the value X to machine
-     mode M.  M must be a fixed-point mode and X a fixed-point value of
-     a mode narrower than M.
-
-`(zero_extend:M X)'
-     Represents the result of zero-extending the value X to machine
-     mode M.  M must be a fixed-point mode and X a fixed-point value of
-     a mode narrower than M.
-
-`(float_extend:M X)'
-     Represents the result of extending the value X to machine mode M.
-     M must be a floating point mode and X a floating point value of a
-     mode narrower than M.
-
-`(truncate:M X)'
-     Represents the result of truncating the value X to machine mode M.
-     M must be a fixed-point mode and X a fixed-point value of a mode
-     wider than M.
-
-`(float_truncate:M X)'
-     Represents the result of truncating the value X to machine mode M.
-     M must be a floating point mode and X a floating point value of a
-     mode wider than M.
-
-`(float:M X)'
-     Represents the result of converting fixed point value X, regarded
-     as signed, to floating point mode M.
-
-`(unsigned_float:M X)'
-     Represents the result of converting fixed point value X, regarded
-     as unsigned, to floating point mode M.
-
-`(fix:M X)'
-     When M is a fixed point mode, represents the result of converting
-     floating point value X to mode M, regarded as signed.  How
-     rounding is done is not specified, so this operation may be used
-     validly in compiling C code only for integer-valued operands.
-
-`(unsigned_fix:M X)'
-     Represents the result of converting floating point value X to
-     fixed point mode M, regarded as unsigned.  How rounding is done is
-     not specified.
-
-`(fix:M X)'
-     When M is a floating point mode, represents the result of
-     converting floating point value X (valid for mode M) to an
-     integer, still represented in floating point mode M, by rounding
-     towards zero.
-
-\1f
-File: gcc.info,  Node: RTL Declarations,  Next: Side Effects,  Prev: Conversions,  Up: RTL
-
-Declarations
-============
-
-   Declaration expression codes do not represent arithmetic operations
-but rather state assertions about their operands.
-
-`(strict_low_part (subreg:M (reg:N R) 0))'
-     This expression code is used in only one context: as the
-     destination operand of a `set' expression.  In addition, the
-     operand of this expression must be a non-paradoxical `subreg'
-     expression.
-
-     The presence of `strict_low_part' says that the part of the
-     register which is meaningful in mode N, but is not part of mode M,
-     is not to be altered.  Normally, an assignment to such a subreg is
-     allowed to have undefined effects on the rest of the register when
-     M is less than a word.
-
-\1f
-File: gcc.info,  Node: Side Effects,  Next: Incdec,  Prev: RTL Declarations,  Up: RTL
-
-Side Effect Expressions
-=======================
-
-   The expression codes described so far represent values, not actions.
-But machine instructions never produce values; they are meaningful only
-for their side effects on the state of the machine.  Special expression
-codes are used to represent side effects.
-
-   The body of an instruction is always one of these side effect codes;
-the codes described above, which represent values, appear only as the
-operands of these.
-
-`(set LVAL X)'
-     Represents the action of storing the value of X into the place
-     represented by LVAL.  LVAL must be an expression representing a
-     place that can be stored in: `reg' (or `subreg' or
-     `strict_low_part'), `mem', `pc' or `cc0'.
-
-     If LVAL is a `reg', `subreg' or `mem', it has a machine mode; then
-     X must be valid for that mode.
-
-     If LVAL is a `reg' whose machine mode is less than the full width
-     of the register, then it means that the part of the register
-     specified by the machine mode is given the specified value and the
-     rest of the register receives an undefined value.  Likewise, if
-     LVAL is a `subreg' whose machine mode is narrower than the mode of
-     the register, the rest of the register can be changed in an
-     undefined way.
-
-     If LVAL is a `strict_low_part' of a `subreg', then the part of the
-     register specified by the machine mode of the `subreg' is given
-     the value X and the rest of the register is not changed.
-
-     If LVAL is `(cc0)', it has no machine mode, and X may be either a
-     `compare' expression or a value that may have any mode.  The
-     latter case represents a "test" instruction.  The expression `(set
-     (cc0) (reg:M N))' is equivalent to `(set (cc0) (compare (reg:M N)
-     (const_int 0)))'.  Use the former expression to save space during
-     the compilation.
-
-     If LVAL is `(pc)', we have a jump instruction, and the
-     possibilities for X are very limited.  It may be a `label_ref'
-     expression (unconditional jump).  It may be an `if_then_else'
-     (conditional jump), in which case either the second or the third
-     operand must be `(pc)' (for the case which does not jump) and the
-     other of the two must be a `label_ref' (for the case which does
-     jump).  X may also be a `mem' or `(plus:SI (pc) Y)', where Y may
-     be a `reg' or a `mem'; these unusual patterns are used to
-     represent jumps through branch tables.
-
-     If LVAL is neither `(cc0)' nor `(pc)', the mode of LVAL must not
-     be `VOIDmode' and the mode of X must be valid for the mode of LVAL.
-
-     LVAL is customarily accessed with the `SET_DEST' macro and X with
-     the `SET_SRC' macro.
-
-`(return)'
-     As the sole expression in a pattern, represents a return from the
-     current function, on machines where this can be done with one
-     instruction, such as Vaxes.  On machines where a multi-instruction
-     "epilogue" must be executed in order to return from the function,
-     returning is done by jumping to a label which precedes the
-     epilogue, and the `return' expression code is never used.
-
-     Inside an `if_then_else' expression, represents the value to be
-     placed in `pc' to return to the caller.
-
-     Note that an insn pattern of `(return)' is logically equivalent to
-     `(set (pc) (return))', but the latter form is never used.
-
-`(call FUNCTION NARGS)'
-     Represents a function call.  FUNCTION is a `mem' expression whose
-     address is the address of the function to be called.  NARGS is an
-     expression which can be used for two purposes: on some machines it
-     represents the number of bytes of stack argument; on others, it
-     represents the number of argument registers.
-
-     Each machine has a standard machine mode which FUNCTION must have.
-     The machine description defines macro `FUNCTION_MODE' to expand
-     into the requisite mode name.  The purpose of this mode is to
-     specify what kind of addressing is allowed, on machines where the
-     allowed kinds of addressing depend on the machine mode being
-     addressed.
-
-`(clobber X)'
-     Represents the storing or possible storing of an unpredictable,
-     undescribed value into X, which must be a `reg', `scratch' or
-     `mem' expression.
-
-     One place this is used is in string instructions that store
-     standard values into particular hard registers.  It may not be
-     worth the trouble to describe the values that are stored, but it
-     is essential to inform the compiler that the registers will be
-     altered, lest it attempt to keep data in them across the string
-     instruction.
-
-     If X is `(mem:BLK (const_int 0))', it means that all memory
-     locations must be presumed clobbered.
-
-     Note that the machine description classifies certain hard
-     registers as "call-clobbered".  All function call instructions are
-     assumed by default to clobber these registers, so there is no need
-     to use `clobber' expressions to indicate this fact.  Also, each
-     function call is assumed to have the potential to alter any memory
-     location, unless the function is declared `const'.
-
-     If the last group of expressions in a `parallel' are each a
-     `clobber' expression whose arguments are `reg' or `match_scratch'
-     (*note RTL Template::.) expressions, the combiner phase can add
-     the appropriate `clobber' expressions to an insn it has
-     constructed when doing so will cause a pattern to be matched.
-
-     This feature can be used, for example, on a machine that whose
-     multiply and add instructions don't use an MQ register but which
-     has an add-accumulate instruction that does clobber the MQ
-     register.  Similarly, a combined instruction might require a
-     temporary register while the constituent instructions might not.
-
-     When a `clobber' expression for a register appears inside a
-     `parallel' with other side effects, the register allocator
-     guarantees that the register is unoccupied both before and after
-     that insn.  However, the reload phase may allocate a register used
-     for one of the inputs unless the `&' constraint is specified for
-     the selected alternative (*note Modifiers::.).  You can clobber
-     either a specific hard register, a pseudo register, or a `scratch'
-     expression; in the latter two cases, GNU CC will allocate a hard
-     register that is available there for use as a temporary.
-
-     For instructions that require a temporary register, you should use
-     `scratch' instead of a pseudo-register because this will allow the
-     combiner phase to add the `clobber' when required.  You do this by
-     coding (`clobber' (`match_scratch' ...)).  If you do clobber a
-     pseudo register, use one which appears nowhere else--generate a
-     new one each time.  Otherwise, you may confuse CSE.
-
-     There is one other known use for clobbering a pseudo register in a
-     `parallel': when one of the input operands of the insn is also
-     clobbered by the insn.  In this case, using the same pseudo
-     register in the clobber and elsewhere in the insn produces the
-     expected results.
-
-`(use X)'
-     Represents the use of the value of X.  It indicates that the value
-     in X at this point in the program is needed, even though it may
-     not be apparent why this is so.  Therefore, the compiler will not
-     attempt to delete previous instructions whose only effect is to
-     store a value in X.  X must be a `reg' expression.
-
-     During the delayed branch scheduling phase, X may be an insn.
-     This indicates that X previously was located at this place in the
-     code and its data dependencies need to be taken into account.
-     These `use' insns will be deleted before the delayed branch
-     scheduling phase exits.
-
-`(parallel [X0 X1 ...])'
-     Represents several side effects performed in parallel.  The square
-     brackets stand for a vector; the operand of `parallel' is a vector
-     of expressions.  X0, X1 and so on are individual side effect
-     expressions--expressions of code `set', `call', `return',
-     `clobber' or `use'.
-
-     "In parallel" means that first all the values used in the
-     individual side-effects are computed, and second all the actual
-     side-effects are performed.  For example,
-
-          (parallel [(set (reg:SI 1) (mem:SI (reg:SI 1)))
-                     (set (mem:SI (reg:SI 1)) (reg:SI 1))])
-
-     says unambiguously that the values of hard register 1 and the
-     memory location addressed by it are interchanged.  In both places
-     where `(reg:SI 1)' appears as a memory address it refers to the
-     value in register 1 *before* the execution of the insn.
-
-     It follows that it is *incorrect* to use `parallel' and expect the
-     result of one `set' to be available for the next one.  For
-     example, people sometimes attempt to represent a jump-if-zero
-     instruction this way:
-
-          (parallel [(set (cc0) (reg:SI 34))
-                     (set (pc) (if_then_else
-                                  (eq (cc0) (const_int 0))
-                                  (label_ref ...)
-                                  (pc)))])
-
-     But this is incorrect, because it says that the jump condition
-     depends on the condition code value *before* this instruction, not
-     on the new value that is set by this instruction.
-
-     Peephole optimization, which takes place together with final
-     assembly code output, can produce insns whose patterns consist of
-     a `parallel' whose elements are the operands needed to output the
-     resulting assembler code--often `reg', `mem' or constant
-     expressions.  This would not be well-formed RTL at any other stage
-     in compilation, but it is ok then because no further optimization
-     remains to be done.  However, the definition of the macro
-     `NOTICE_UPDATE_CC', if any, must deal with such insns if you
-     define any peephole optimizations.
-
-`(sequence [INSNS ...])'
-     Represents a sequence of insns.  Each of the INSNS that appears in
-     the vector is suitable for appearing in the chain of insns, so it
-     must be an `insn', `jump_insn', `call_insn', `code_label',
-     `barrier' or `note'.
-
-     A `sequence' RTX is never placed in an actual insn during RTL
-     generation.  It represents the sequence of insns that result from a
-     `define_expand' *before* those insns are passed to `emit_insn' to
-     insert them in the chain of insns.  When actually inserted, the
-     individual sub-insns are separated out and the `sequence' is
-     forgotten.
-
-     After delay-slot scheduling is completed, an insn and all the
-     insns that reside in its delay slots are grouped together into a
-     `sequence'.  The insn requiring the delay slot is the first insn
-     in the vector; subsequent insns are to be placed in the delay slot.
-
-     `INSN_ANNULLED_BRANCH_P' is set on an insn in a delay slot to
-     indicate that a branch insn should be used that will conditionally
-     annul the effect of the insns in the delay slots.  In such a case,
-     `INSN_FROM_TARGET_P' indicates that the insn is from the target of
-     the branch and should be executed only if the branch is taken;
-     otherwise the insn should be executed only if the branch is not
-     taken.  *Note Delay Slots::.
-
-   These expression codes appear in place of a side effect, as the body
-of an insn, though strictly speaking they do not always describe side
-effects as such:
-
-`(asm_input S)'
-     Represents literal assembler code as described by the string S.
-
-`(unspec [OPERANDS ...] INDEX)'
-`(unspec_volatile [OPERANDS ...] INDEX)'
-     Represents a machine-specific operation on OPERANDS.  INDEX
-     selects between multiple machine-specific operations.
-     `unspec_volatile' is used for volatile operations and operations
-     that may trap; `unspec' is used for other operations.
-
-     These codes may appear inside a `pattern' of an insn, inside a
-     `parallel', or inside an expression.
-
-`(addr_vec:M [LR0 LR1 ...])'
-     Represents a table of jump addresses.  The vector elements LR0,
-     etc., are `label_ref' expressions.  The mode M specifies how much
-     space is given to each address; normally M would be `Pmode'.
-
-`(addr_diff_vec:M BASE [LR0 LR1 ...])'
-     Represents a table of jump addresses expressed as offsets from
-     BASE.  The vector elements LR0, etc., are `label_ref' expressions
-     and so is BASE.  The mode M specifies how much space is given to
-     each address-difference.
-
-\1f
-File: gcc.info,  Node: Incdec,  Next: Assembler,  Prev: Side Effects,  Up: RTL
-
-Embedded Side-Effects on Addresses
-==================================
-
-   Four special side-effect expression codes appear as memory addresses.
-
-`(pre_dec:M X)'
-     Represents the side effect of decrementing X by a standard amount
-     and represents also the value that X has after being decremented.
-     X must be a `reg' or `mem', but most machines allow only a `reg'.
-     M must be the machine mode for pointers on the machine in use.
-     The amount X is decremented by is the length in bytes of the
-     machine mode of the containing memory reference of which this
-     expression serves as the address.  Here is an example of its use:
-
-          (mem:DF (pre_dec:SI (reg:SI 39)))
-
-     This says to decrement pseudo register 39 by the length of a
-     `DFmode' value and use the result to address a `DFmode' value.
-
-`(pre_inc:M X)'
-     Similar, but specifies incrementing X instead of decrementing it.
-
-`(post_dec:M X)'
-     Represents the same side effect as `pre_dec' but a different
-     value.  The value represented here is the value X has before being
-     decremented.
-
-`(post_inc:M X)'
-     Similar, but specifies incrementing X instead of decrementing it.
-
-   These embedded side effect expressions must be used with care.
-Instruction patterns may not use them.  Until the `flow' pass of the
-compiler, they may occur only to represent pushes onto the stack.  The
-`flow' pass finds cases where registers are incremented or decremented
-in one instruction and used as an address shortly before or after;
-these cases are then transformed to use pre- or post-increment or
--decrement.
-
-   If a register used as the operand of these expressions is used in
-another address in an insn, the original value of the register is used.
-Uses of the register outside of an address are not permitted within the
-same insn as a use in an embedded side effect expression because such
-insns behave differently on different machines and hence must be treated
-as ambiguous and disallowed.
-
-   An instruction that can be represented with an embedded side effect
-could also be represented using `parallel' containing an additional
-`set' to describe how the address register is altered.  This is not
-done because machines that allow these operations at all typically
-allow them wherever a memory address is called for.  Describing them as
-additional parallel stores would require doubling the number of entries
-in the machine description.
-
-\1f
-File: gcc.info,  Node: Assembler,  Next: Insns,  Prev: Incdec,  Up: RTL
-
-Assembler Instructions as Expressions
-=====================================
-
-   The RTX code `asm_operands' represents a value produced by a
-user-specified assembler instruction.  It is used to represent an `asm'
-statement with arguments.  An `asm' statement with a single output
-operand, like this:
-
-     asm ("foo %1,%2,%0" : "=a" (outputvar) : "g" (x + y), "di" (*z));
-
-is represented using a single `asm_operands' RTX which represents the
-value that is stored in `outputvar':
-
-     (set RTX-FOR-OUTPUTVAR
-          (asm_operands "foo %1,%2,%0" "a" 0
-                        [RTX-FOR-ADDITION-RESULT RTX-FOR-*Z]
-                        [(asm_input:M1 "g")
-                         (asm_input:M2 "di")]))
-
-Here the operands of the `asm_operands' RTX are the assembler template
-string, the output-operand's constraint, the index-number of the output
-operand among the output operands specified, a vector of input operand
-RTX's, and a vector of input-operand modes and constraints.  The mode
-M1 is the mode of the sum `x+y'; M2 is that of `*z'.
-
-   When an `asm' statement has multiple output values, its insn has
-several such `set' RTX's inside of a `parallel'.  Each `set' contains a
-`asm_operands'; all of these share the same assembler template and
-vectors, but each contains the constraint for the respective output
-operand.  They are also distinguished by the output-operand index
-number, which is 0, 1, ... for successive output operands.
-
diff --git a/gcc/gcc.info-16 b/gcc/gcc.info-16
deleted file mode 100644 (file)
index ab7aa3c..0000000
+++ /dev/null
@@ -1,1053 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Insns,  Next: Calls,  Prev: Assembler,  Up: RTL
-
-Insns
-=====
-
-   The RTL representation of the code for a function is a doubly-linked
-chain of objects called "insns".  Insns are expressions with special
-codes that are used for no other purpose.  Some insns are actual
-instructions; others represent dispatch tables for `switch' statements;
-others represent labels to jump to or various sorts of declarative
-information.
-
-   In addition to its own specific data, each insn must have a unique
-id-number that distinguishes it from all other insns in the current
-function (after delayed branch scheduling, copies of an insn with the
-same id-number may be present in multiple places in a function, but
-these copies will always be identical and will only appear inside a
-`sequence'), and chain pointers to the preceding and following insns.
-These three fields occupy the same position in every insn, independent
-of the expression code of the insn.  They could be accessed with `XEXP'
-and `XINT', but instead three special macros are always used:
-
-`INSN_UID (I)'
-     Accesses the unique id of insn I.
-
-`PREV_INSN (I)'
-     Accesses the chain pointer to the insn preceding I.  If I is the
-     first insn, this is a null pointer.
-
-`NEXT_INSN (I)'
-     Accesses the chain pointer to the insn following I.  If I is the
-     last insn, this is a null pointer.
-
-   The first insn in the chain is obtained by calling `get_insns'; the
-last insn is the result of calling `get_last_insn'.  Within the chain
-delimited by these insns, the `NEXT_INSN' and `PREV_INSN' pointers must
-always correspond: if INSN is not the first insn,
-
-     NEXT_INSN (PREV_INSN (INSN)) == INSN
-
-is always true and if INSN is not the last insn,
-
-     PREV_INSN (NEXT_INSN (INSN)) == INSN
-
-is always true.
-
-   After delay slot scheduling, some of the insns in the chain might be
-`sequence' expressions, which contain a vector of insns.  The value of
-`NEXT_INSN' in all but the last of these insns is the next insn in the
-vector; the value of `NEXT_INSN' of the last insn in the vector is the
-same as the value of `NEXT_INSN' for the `sequence' in which it is
-contained.  Similar rules apply for `PREV_INSN'.
-
-   This means that the above invariants are not necessarily true for
-insns inside `sequence' expressions.  Specifically, if INSN is the
-first insn in a `sequence', `NEXT_INSN (PREV_INSN (INSN))' is the insn
-containing the `sequence' expression, as is the value of `PREV_INSN
-(NEXT_INSN (INSN))' is INSN is the last insn in the `sequence'
-expression.  You can use these expressions to find the containing
-`sequence' expression.
-
-   Every insn has one of the following six expression codes:
-
-`insn'
-     The expression code `insn' is used for instructions that do not
-     jump and do not do function calls.  `sequence' expressions are
-     always contained in insns with code `insn' even if one of those
-     insns should jump or do function calls.
-
-     Insns with code `insn' have four additional fields beyond the three
-     mandatory ones listed above.  These four are described in a table
-     below.
-
-`jump_insn'
-     The expression code `jump_insn' is used for instructions that may
-     jump (or, more generally, may contain `label_ref' expressions).  If
-     there is an instruction to return from the current function, it is
-     recorded as a `jump_insn'.
-
-     `jump_insn' insns have the same extra fields as `insn' insns,
-     accessed in the same way and in addition contain a field
-     `JUMP_LABEL' which is defined once jump optimization has completed.
-
-     For simple conditional and unconditional jumps, this field
-     contains the `code_label' to which this insn will (possibly
-     conditionally) branch.  In a more complex jump, `JUMP_LABEL'
-     records one of the labels that the insn refers to; the only way to
-     find the others is to scan the entire body of the insn.
-
-     Return insns count as jumps, but since they do not refer to any
-     labels, they have zero in the `JUMP_LABEL' field.
-
-`call_insn'
-     The expression code `call_insn' is used for instructions that may
-     do function calls.  It is important to distinguish these
-     instructions because they imply that certain registers and memory
-     locations may be altered unpredictably.
-
-     `call_insn' insns have the same extra fields as `insn' insns,
-     accessed in the same way and in addition contain a field
-     `CALL_INSN_FUNCTION_USAGE', which contains a list (chain of
-     `expr_list' expressions) containing `use' and `clobber'
-     expressions that denote hard registers used or clobbered by the
-     called function.  A register specified in a `clobber' in this list
-     is modified *after* the execution of the `call_insn', while a
-     register in a `clobber' in the body of the `call_insn' is
-     clobbered before the insn completes execution.  `clobber'
-     expressions in this list augment registers specified in
-     `CALL_USED_REGISTERS' (*note Register Basics::.).
-
-`code_label'
-     A `code_label' insn represents a label that a jump insn can jump
-     to.  It contains two special fields of data in addition to the
-     three standard ones.  `CODE_LABEL_NUMBER' is used to hold the
-     "label number", a number that identifies this label uniquely among
-     all the labels in the compilation (not just in the current
-     function).  Ultimately, the label is represented in the assembler
-     output as an assembler label, usually of the form `LN' where N is
-     the label number.
-
-     When a `code_label' appears in an RTL expression, it normally
-     appears within a `label_ref' which represents the address of the
-     label, as a number.
-
-     The field `LABEL_NUSES' is only defined once the jump optimization
-     phase is completed and contains the number of times this label is
-     referenced in the current function.
-
-`barrier'
-     Barriers are placed in the instruction stream when control cannot
-     flow past them.  They are placed after unconditional jump
-     instructions to indicate that the jumps are unconditional and
-     after calls to `volatile' functions, which do not return (e.g.,
-     `exit').  They contain no information beyond the three standard
-     fields.
-
-`note'
-     `note' insns are used to represent additional debugging and
-     declarative information.  They contain two nonstandard fields, an
-     integer which is accessed with the macro `NOTE_LINE_NUMBER' and a
-     string accessed with `NOTE_SOURCE_FILE'.
-
-     If `NOTE_LINE_NUMBER' is positive, the note represents the
-     position of a source line and `NOTE_SOURCE_FILE' is the source
-     file name that the line came from.  These notes control generation
-     of line number data in the assembler output.
-
-     Otherwise, `NOTE_LINE_NUMBER' is not really a line number but a
-     code with one of the following values (and `NOTE_SOURCE_FILE' must
-     contain a null pointer):
-
-    `NOTE_INSN_DELETED'
-          Such a note is completely ignorable.  Some passes of the
-          compiler delete insns by altering them into notes of this
-          kind.
-
-    `NOTE_INSN_BLOCK_BEG'
-    `NOTE_INSN_BLOCK_END'
-          These types of notes indicate the position of the beginning
-          and end of a level of scoping of variable names.  They
-          control the output of debugging information.
-
-    `NOTE_INSN_EH_REGION_BEG'
-    `NOTE_INSN_EH_REGION_END'
-          These types of notes indicate the position of the beginning
-          and end of a level of scoping for exception handling.
-          `NOTE_BLOCK_NUMBER' identifies which `CODE_LABEL' is
-          associated with the given region.
-
-    `NOTE_INSN_LOOP_BEG'
-    `NOTE_INSN_LOOP_END'
-          These types of notes indicate the position of the beginning
-          and end of a `while' or `for' loop.  They enable the loop
-          optimizer to find loops quickly.
-
-    `NOTE_INSN_LOOP_CONT'
-          Appears at the place in a loop that `continue' statements
-          jump to.
-
-    `NOTE_INSN_LOOP_VTOP'
-          This note indicates the place in a loop where the exit test
-          begins for those loops in which the exit test has been
-          duplicated.  This position becomes another virtual start of
-          the loop when considering loop invariants.
-
-    `NOTE_INSN_FUNCTION_END'
-          Appears near the end of the function body, just before the
-          label that `return' statements jump to (on machine where a
-          single instruction does not suffice for returning).  This
-          note may be deleted by jump optimization.
-
-    `NOTE_INSN_SETJMP'
-          Appears following each call to `setjmp' or a related function.
-
-     These codes are printed symbolically when they appear in debugging
-     dumps.
-
-   The machine mode of an insn is normally `VOIDmode', but some phases
-use the mode for various purposes; for example, the reload pass sets it
-to `HImode' if the insn needs reloading but not register elimination
-and `QImode' if both are required.  The common subexpression
-elimination pass sets the mode of an insn to `QImode' when it is the
-first insn in a block that has already been processed.
-
-   Here is a table of the extra fields of `insn', `jump_insn' and
-`call_insn' insns:
-
-`PATTERN (I)'
-     An expression for the side effect performed by this insn.  This
-     must be one of the following codes: `set', `call', `use',
-     `clobber', `return', `asm_input', `asm_output', `addr_vec',
-     `addr_diff_vec', `trap_if', `unspec', `unspec_volatile',
-     `parallel', or `sequence'.  If it is a `parallel', each element of
-     the `parallel' must be one these codes, except that `parallel'
-     expressions cannot be nested and `addr_vec' and `addr_diff_vec'
-     are not permitted inside a `parallel' expression.
-
-`INSN_CODE (I)'
-     An integer that says which pattern in the machine description
-     matches this insn, or -1 if the matching has not yet been
-     attempted.
-
-     Such matching is never attempted and this field remains -1 on an
-     insn whose pattern consists of a single `use', `clobber',
-     `asm_input', `addr_vec' or `addr_diff_vec' expression.
-
-     Matching is also never attempted on insns that result from an `asm'
-     statement.  These contain at least one `asm_operands' expression.
-     The function `asm_noperands' returns a non-negative value for such
-     insns.
-
-     In the debugging output, this field is printed as a number
-     followed by a symbolic representation that locates the pattern in
-     the `md' file as some small positive or negative offset from a
-     named pattern.
-
-`LOG_LINKS (I)'
-     A list (chain of `insn_list' expressions) giving information about
-     dependencies between instructions within a basic block.  Neither a
-     jump nor a label may come between the related insns.
-
-`REG_NOTES (I)'
-     A list (chain of `expr_list' and `insn_list' expressions) giving
-     miscellaneous information about the insn.  It is often information
-     pertaining to the registers used in this insn.
-
-   The `LOG_LINKS' field of an insn is a chain of `insn_list'
-expressions.  Each of these has two operands: the first is an insn, and
-the second is another `insn_list' expression (the next one in the
-chain).  The last `insn_list' in the chain has a null pointer as second
-operand.  The significant thing about the chain is which insns appear
-in it (as first operands of `insn_list' expressions).  Their order is
-not significant.
-
-   This list is originally set up by the flow analysis pass; it is a
-null pointer until then.  Flow only adds links for those data
-dependencies which can be used for instruction combination.  For each
-insn, the flow analysis pass adds a link to insns which store into
-registers values that are used for the first time in this insn.  The
-instruction scheduling pass adds extra links so that every dependence
-will be represented.  Links represent data dependencies,
-antidependencies and output dependencies; the machine mode of the link
-distinguishes these three types: antidependencies have mode
-`REG_DEP_ANTI', output dependencies have mode `REG_DEP_OUTPUT', and
-data dependencies have mode `VOIDmode'.
-
-   The `REG_NOTES' field of an insn is a chain similar to the
-`LOG_LINKS' field but it includes `expr_list' expressions in addition
-to `insn_list' expressions.  There are several kinds of register notes,
-which are distinguished by the machine mode, which in a register note
-is really understood as being an `enum reg_note'.  The first operand OP
-of the note is data whose meaning depends on the kind of note.
-
-   The macro `REG_NOTE_KIND (X)' returns the kind of register note.
-Its counterpart, the macro `PUT_REG_NOTE_KIND (X, NEWKIND)' sets the
-register note type of X to be NEWKIND.
-
-   Register notes are of three classes: They may say something about an
-input to an insn, they may say something about an output of an insn, or
-they may create a linkage between two insns.  There are also a set of
-values that are only used in `LOG_LINKS'.
-
-   These register notes annotate inputs to an insn:
-
-`REG_DEAD'
-     The value in OP dies in this insn; that is to say, altering the
-     value immediately after this insn would not affect the future
-     behavior of the program.
-
-     This does not necessarily mean that the register OP has no useful
-     value after this insn since it may also be an output of the insn.
-     In such a case, however, a `REG_DEAD' note would be redundant and
-     is usually not present until after the reload pass, but no code
-     relies on this fact.
-
-`REG_INC'
-     The register OP is incremented (or decremented; at this level
-     there is no distinction) by an embedded side effect inside this
-     insn.  This means it appears in a `post_inc', `pre_inc',
-     `post_dec' or `pre_dec' expression.
-
-`REG_NONNEG'
-     The register OP is known to have a nonnegative value when this
-     insn is reached.  This is used so that decrement and branch until
-     zero instructions, such as the m68k dbra, can be matched.
-
-     The `REG_NONNEG' note is added to insns only if the machine
-     description has a `decrement_and_branch_until_zero' pattern.
-
-`REG_NO_CONFLICT'
-     This insn does not cause a conflict between OP and the item being
-     set by this insn even though it might appear that it does.  In
-     other words, if the destination register and OP could otherwise be
-     assigned the same register, this insn does not prevent that
-     assignment.
-
-     Insns with this note are usually part of a block that begins with a
-     `clobber' insn specifying a multi-word pseudo register (which will
-     be the output of the block), a group of insns that each set one
-     word of the value and have the `REG_NO_CONFLICT' note attached,
-     and a final insn that copies the output to itself with an attached
-     `REG_EQUAL' note giving the expression being computed.  This block
-     is encapsulated with `REG_LIBCALL' and `REG_RETVAL' notes on the
-     first and last insns, respectively.
-
-`REG_LABEL'
-     This insn uses OP, a `code_label', but is not a `jump_insn'.  The
-     presence of this note allows jump optimization to be aware that OP
-     is, in fact, being used.
-
-   The following notes describe attributes of outputs of an insn:
-
-`REG_EQUIV'
-`REG_EQUAL'
-     This note is only valid on an insn that sets only one register and
-     indicates that that register will be equal to OP at run time; the
-     scope of this equivalence differs between the two types of notes.
-     The value which the insn explicitly copies into the register may
-     look different from OP, but they will be equal at run time.  If the
-     output of the single `set' is a `strict_low_part' expression, the
-     note refers to the register that is contained in `SUBREG_REG' of
-     the `subreg' expression.
-
-     For `REG_EQUIV', the register is equivalent to OP throughout the
-     entire function, and could validly be replaced in all its
-     occurrences by OP.  ("Validly" here refers to the data flow of the
-     program; simple replacement may make some insns invalid.)  For
-     example, when a constant is loaded into a register that is never
-     assigned any other value, this kind of note is used.
-
-     When a parameter is copied into a pseudo-register at entry to a
-     function, a note of this kind records that the register is
-     equivalent to the stack slot where the parameter was passed.
-     Although in this case the register may be set by other insns, it
-     is still valid to replace the register by the stack slot
-     throughout the function.
-
-     A `REG_EQUIV' note is also used on an instruction which copies a
-     register parameter into a pseudo-register at entry to a function,
-     if there is a stack slot where that parameter could be stored.
-     Although other insns may set the pseudo-register, it is valid for
-     the compiler to replace the pseudo-register by stack slot
-     throughout the function, provided the compiler ensures that the
-     stack slot is properly initialized by making the replacement in
-     the initial copy instruction as well.  This is used on machines
-     for which the calling convention allocates stack space for
-     register parameters.  See `REG_PARM_STACK_SPACE' in *Note Stack
-     Arguments::.
-
-     In the case of `REG_EQUAL', the register that is set by this insn
-     will be equal to OP at run time at the end of this insn but not
-     necessarily elsewhere in the function.  In this case, OP is
-     typically an arithmetic expression.  For example, when a sequence
-     of insns such as a library call is used to perform an arithmetic
-     operation, this kind of note is attached to the insn that produces
-     or copies the final value.
-
-     These two notes are used in different ways by the compiler passes.
-     `REG_EQUAL' is used by passes prior to register allocation (such as
-     common subexpression elimination and loop optimization) to tell
-     them how to think of that value.  `REG_EQUIV' notes are used by
-     register allocation to indicate that there is an available
-     substitute expression (either a constant or a `mem' expression for
-     the location of a parameter on the stack) that may be used in
-     place of a register if insufficient registers are available.
-
-     Except for stack homes for parameters, which are indicated by a
-     `REG_EQUIV' note and are not useful to the early optimization
-     passes and pseudo registers that are equivalent to a memory
-     location throughout there entire life, which is not detected until
-     later in the compilation, all equivalences are initially indicated
-     by an attached `REG_EQUAL' note.  In the early stages of register
-     allocation, a `REG_EQUAL' note is changed into a `REG_EQUIV' note
-     if OP is a constant and the insn represents the only set of its
-     destination register.
-
-     Thus, compiler passes prior to register allocation need only check
-     for `REG_EQUAL' notes and passes subsequent to register allocation
-     need only check for `REG_EQUIV' notes.
-
-`REG_UNUSED'
-     The register OP being set by this insn will not be used in a
-     subsequent insn.  This differs from a `REG_DEAD' note, which
-     indicates that the value in an input will not be used subsequently.
-     These two notes are independent; both may be present for the same
-     register.
-
-`REG_WAS_0'
-     The single output of this insn contained zero before this insn.
-     OP is the insn that set it to zero.  You can rely on this note if
-     it is present and OP has not been deleted or turned into a `note';
-     its absence implies nothing.
-
-   These notes describe linkages between insns.  They occur in pairs:
-one insn has one of a pair of notes that points to a second insn, which
-has the inverse note pointing back to the first insn.
-
-`REG_RETVAL'
-     This insn copies the value of a multi-insn sequence (for example, a
-     library call), and OP is the first insn of the sequence (for a
-     library call, the first insn that was generated to set up the
-     arguments for the library call).
-
-     Loop optimization uses this note to treat such a sequence as a
-     single operation for code motion purposes and flow analysis uses
-     this note to delete such sequences whose results are dead.
-
-     A `REG_EQUAL' note will also usually be attached to this insn to
-     provide the expression being computed by the sequence.
-
-`REG_LIBCALL'
-     This is the inverse of `REG_RETVAL': it is placed on the first
-     insn of a multi-insn sequence, and it points to the last one.
-
-`REG_CC_SETTER'
-`REG_CC_USER'
-     On machines that use `cc0', the insns which set and use `cc0' set
-     and use `cc0' are adjacent.  However, when branch delay slot
-     filling is done, this may no longer be true.  In this case a
-     `REG_CC_USER' note will be placed on the insn setting `cc0' to
-     point to the insn using `cc0' and a `REG_CC_SETTER' note will be
-     placed on the insn using `cc0' to point to the insn setting `cc0'.
-
-   These values are only used in the `LOG_LINKS' field, and indicate
-the type of dependency that each link represents.  Links which indicate
-a data dependence (a read after write dependence) do not use any code,
-they simply have mode `VOIDmode', and are printed without any
-descriptive text.
-
-`REG_DEP_ANTI'
-     This indicates an anti dependence (a write after read dependence).
-
-`REG_DEP_OUTPUT'
-     This indicates an output dependence (a write after write
-     dependence).
-
-   These notes describe information gathered from gcov profile data.
-They are stored in the `REG_NOTES' field of an insn as an `expr_list'.
-
-`REG_EXEC_COUNT'
-     This is used to indicate the number of times a basic block was
-     executed according to the profile data.  The note is attached to
-     the first insn in the basic block.
-
-`REG_BR_PROB'
-     This is used to specify the ratio of branches to non-branches of a
-     branch insn according to the profile data.  The value is stored as
-     a value between 0 and REG_BR_PROB_BASE; larger values indicate a
-     higher probability that the branch will be taken.
-
-   For convenience, the machine mode in an `insn_list' or `expr_list'
-is printed using these symbolic codes in debugging dumps.
-
-   The only difference between the expression codes `insn_list' and
-`expr_list' is that the first operand of an `insn_list' is assumed to
-be an insn and is printed in debugging dumps as the insn's unique id;
-the first operand of an `expr_list' is printed in the ordinary way as
-an expression.
-
-\1f
-File: gcc.info,  Node: Calls,  Next: Sharing,  Prev: Insns,  Up: RTL
-
-RTL Representation of Function-Call Insns
-=========================================
-
-   Insns that call subroutines have the RTL expression code `call_insn'.
-These insns must satisfy special rules, and their bodies must use a
-special RTL expression code, `call'.
-
-   A `call' expression has two operands, as follows:
-
-     (call (mem:FM ADDR) NBYTES)
-
-Here NBYTES is an operand that represents the number of bytes of
-argument data being passed to the subroutine, FM is a machine mode
-(which must equal as the definition of the `FUNCTION_MODE' macro in the
-machine description) and ADDR represents the address of the subroutine.
-
-   For a subroutine that returns no value, the `call' expression as
-shown above is the entire body of the insn, except that the insn might
-also contain `use' or `clobber' expressions.
-
-   For a subroutine that returns a value whose mode is not `BLKmode',
-the value is returned in a hard register.  If this register's number is
-R, then the body of the call insn looks like this:
-
-     (set (reg:M R)
-          (call (mem:FM ADDR) NBYTES))
-
-This RTL expression makes it clear (to the optimizer passes) that the
-appropriate register receives a useful value in this insn.
-
-   When a subroutine returns a `BLKmode' value, it is handled by
-passing to the subroutine the address of a place to store the value.
-So the call insn itself does not "return" any value, and it has the
-same RTL form as a call that returns nothing.
-
-   On some machines, the call instruction itself clobbers some register,
-for example to contain the return address.  `call_insn' insns on these
-machines should have a body which is a `parallel' that contains both
-the `call' expression and `clobber' expressions that indicate which
-registers are destroyed.  Similarly, if the call instruction requires
-some register other than the stack pointer that is not explicitly
-mentioned it its RTL, a `use' subexpression should mention that
-register.
-
-   Functions that are called are assumed to modify all registers listed
-in the configuration macro `CALL_USED_REGISTERS' (*note Register
-Basics::.) and, with the exception of `const' functions and library
-calls, to modify all of memory.
-
-   Insns containing just `use' expressions directly precede the
-`call_insn' insn to indicate which registers contain inputs to the
-function.  Similarly, if registers other than those in
-`CALL_USED_REGISTERS' are clobbered by the called function, insns
-containing a single `clobber' follow immediately after the call to
-indicate which registers.
-
-\1f
-File: gcc.info,  Node: Sharing,  Next: Reading RTL,  Prev: Calls,  Up: RTL
-
-Structure Sharing Assumptions
-=============================
-
-   The compiler assumes that certain kinds of RTL expressions are
-unique; there do not exist two distinct objects representing the same
-value.  In other cases, it makes an opposite assumption: that no RTL
-expression object of a certain kind appears in more than one place in
-the containing structure.
-
-   These assumptions refer to a single function; except for the RTL
-objects that describe global variables and external functions, and a
-few standard objects such as small integer constants, no RTL objects
-are common to two functions.
-
-   * Each pseudo-register has only a single `reg' object to represent
-     it, and therefore only a single machine mode.
-
-   * For any symbolic label, there is only one `symbol_ref' object
-     referring to it.
-
-   * There is only one `const_int' expression with value 0, only one
-     with value 1, and only one with value -1.  Some other integer
-     values are also stored uniquely.
-
-   * There is only one `pc' expression.
-
-   * There is only one `cc0' expression.
-
-   * There is only one `const_double' expression with value 0 for each
-     floating point mode.  Likewise for values 1 and 2.
-
-   * No `label_ref' or `scratch' appears in more than one place in the
-     RTL structure; in other words, it is safe to do a tree-walk of all
-     the insns in the function and assume that each time a `label_ref'
-     or `scratch' is seen it is distinct from all others that are seen.
-
-   * Only one `mem' object is normally created for each static variable
-     or stack slot, so these objects are frequently shared in all the
-     places they appear.  However, separate but equal objects for these
-     variables are occasionally made.
-
-   * When a single `asm' statement has multiple output operands, a
-     distinct `asm_operands' expression is made for each output operand.
-     However, these all share the vector which contains the sequence of
-     input operands.  This sharing is used later on to test whether two
-     `asm_operands' expressions come from the same statement, so all
-     optimizations must carefully preserve the sharing if they copy the
-     vector at all.
-
-   * No RTL object appears in more than one place in the RTL structure
-     except as described above.  Many passes of the compiler rely on
-     this by assuming that they can modify RTL objects in place without
-     unwanted side-effects on other insns.
-
-   * During initial RTL generation, shared structure is freely
-     introduced.  After all the RTL for a function has been generated,
-     all shared structure is copied by `unshare_all_rtl' in
-     `emit-rtl.c', after which the above rules are guaranteed to be
-     followed.
-
-   * During the combiner pass, shared structure within an insn can exist
-     temporarily.  However, the shared structure is copied before the
-     combiner is finished with the insn.  This is done by calling
-     `copy_rtx_if_shared', which is a subroutine of `unshare_all_rtl'.
-
-\1f
-File: gcc.info,  Node: Reading RTL,  Prev: Sharing,  Up: RTL
-
-Reading RTL
-===========
-
-   To read an RTL object from a file, call `read_rtx'.  It takes one
-argument, a stdio stream, and returns a single RTL object.
-
-   Reading RTL from a file is very slow.  This is not currently a
-problem since reading RTL occurs only as part of building the compiler.
-
-   People frequently have the idea of using RTL stored as text in a
-file as an interface between a language front end and the bulk of GNU
-CC.  This idea is not feasible.
-
-   GNU CC was designed to use RTL internally only.  Correct RTL for a
-given program is very dependent on the particular target machine.  And
-the RTL does not contain all the information about the program.
-
-   The proper way to interface GNU CC to a new language front end is
-with the "tree" data structure.  There is no manual for this data
-structure, but it is described in the files `tree.h' and `tree.def'.
-
-\1f
-File: gcc.info,  Node: Machine Desc,  Next: Target Macros,  Prev: RTL,  Up: Top
-
-Machine Descriptions
-********************
-
-   A machine description has two parts: a file of instruction patterns
-(`.md' file) and a C header file of macro definitions.
-
-   The `.md' file for a target machine contains a pattern for each
-instruction that the target machine supports (or at least each
-instruction that is worth telling the compiler about).  It may also
-contain comments.  A semicolon causes the rest of the line to be a
-comment, unless the semicolon is inside a quoted string.
-
-   See the next chapter for information on the C header file.
-
-* Menu:
-
-* Patterns::            How to write instruction patterns.
-* Example::             An explained example of a `define_insn' pattern.
-* RTL Template::        The RTL template defines what insns match a pattern.
-* Output Template::     The output template says how to make assembler code
-                          from such an insn.
-* Output Statement::    For more generality, write C code to output
-                          the assembler code.
-* Constraints::         When not all operands are general operands.
-* Standard Names::      Names mark patterns to use for code generation.
-* Pattern Ordering::    When the order of patterns makes a difference.
-* Dependent Patterns::  Having one pattern may make you need another.
-* Jump Patterns::       Special considerations for patterns for jump insns.
-* Insn Canonicalizations::Canonicalization of Instructions
-* Peephole Definitions::Defining machine-specific peephole optimizations.
-* Expander Definitions::Generating a sequence of several RTL insns
-                         for a standard operation.
-* Insn Splitting::    Splitting Instructions into Multiple Instructions
-* Insn Attributes::     Specifying the value of attributes for generated insns.
-
-\1f
-File: gcc.info,  Node: Patterns,  Next: Example,  Up: Machine Desc
-
-Everything about Instruction Patterns
-=====================================
-
-   Each instruction pattern contains an incomplete RTL expression, with
-pieces to be filled in later, operand constraints that restrict how the
-pieces can be filled in, and an output pattern or C code to generate
-the assembler output, all wrapped up in a `define_insn' expression.
-
-   A `define_insn' is an RTL expression containing four or five
-operands:
-
-  1. An optional name.  The presence of a name indicate that this
-     instruction pattern can perform a certain standard job for the
-     RTL-generation pass of the compiler.  This pass knows certain
-     names and will use the instruction patterns with those names, if
-     the names are defined in the machine description.
-
-     The absence of a name is indicated by writing an empty string
-     where the name should go.  Nameless instruction patterns are never
-     used for generating RTL code, but they may permit several simpler
-     insns to be combined later on.
-
-     Names that are not thus known and used in RTL-generation have no
-     effect; they are equivalent to no name at all.
-
-  2. The "RTL template" (*note RTL Template::.) is a vector of
-     incomplete RTL expressions which show what the instruction should
-     look like.  It is incomplete because it may contain
-     `match_operand', `match_operator', and `match_dup' expressions
-     that stand for operands of the instruction.
-
-     If the vector has only one element, that element is the template
-     for the instruction pattern.  If the vector has multiple elements,
-     then the instruction pattern is a `parallel' expression containing
-     the elements described.
-
-  3. A condition.  This is a string which contains a C expression that
-     is the final test to decide whether an insn body matches this
-     pattern.
-
-     For a named pattern, the condition (if present) may not depend on
-     the data in the insn being matched, but only the
-     target-machine-type flags.  The compiler needs to test these
-     conditions during initialization in order to learn exactly which
-     named instructions are available in a particular run.
-
-     For nameless patterns, the condition is applied only when matching
-     an individual insn, and only after the insn has matched the
-     pattern's recognition template.  The insn's operands may be found
-     in the vector `operands'.
-
-  4. The "output template": a string that says how to output matching
-     insns as assembler code.  `%' in this string specifies where to
-     substitute the value of an operand.  *Note Output Template::.
-
-     When simple substitution isn't general enough, you can specify a
-     piece of C code to compute the output.  *Note Output Statement::.
-
-  5. Optionally, a vector containing the values of attributes for insns
-     matching this pattern.  *Note Insn Attributes::.
-
-\1f
-File: gcc.info,  Node: Example,  Next: RTL Template,  Prev: Patterns,  Up: Machine Desc
-
-Example of `define_insn'
-========================
-
-   Here is an actual example of an instruction pattern, for the
-68000/68020.
-
-     (define_insn "tstsi"
-       [(set (cc0)
-             (match_operand:SI 0 "general_operand" "rm"))]
-       ""
-       "*
-     { if (TARGET_68020 || ! ADDRESS_REG_P (operands[0]))
-         return \"tstl %0\";
-       return \"cmpl #0,%0\"; }")
-
-   This is an instruction that sets the condition codes based on the
-value of a general operand.  It has no condition, so any insn whose RTL
-description has the form shown may be handled according to this
-pattern.  The name `tstsi' means "test a `SImode' value" and tells the
-RTL generation pass that, when it is necessary to test such a value, an
-insn to do so can be constructed using this pattern.
-
-   The output control string is a piece of C code which chooses which
-output template to return based on the kind of operand and the specific
-type of CPU for which code is being generated.
-
-   `"rm"' is an operand constraint.  Its meaning is explained below.
-
-\1f
-File: gcc.info,  Node: RTL Template,  Next: Output Template,  Prev: Example,  Up: Machine Desc
-
-RTL Template
-============
-
-   The RTL template is used to define which insns match the particular
-pattern and how to find their operands.  For named patterns, the RTL
-template also says how to construct an insn from specified operands.
-
-   Construction involves substituting specified operands into a copy of
-the template.  Matching involves determining the values that serve as
-the operands in the insn being matched.  Both of these activities are
-controlled by special expression types that direct matching and
-substitution of the operands.
-
-`(match_operand:M N PREDICATE CONSTRAINT)'
-     This expression is a placeholder for operand number N of the insn.
-     When constructing an insn, operand number N will be substituted
-     at this point.  When matching an insn, whatever appears at this
-     position in the insn will be taken as operand number N; but it
-     must satisfy PREDICATE or this instruction pattern will not match
-     at all.
-
-     Operand numbers must be chosen consecutively counting from zero in
-     each instruction pattern.  There may be only one `match_operand'
-     expression in the pattern for each operand number.  Usually
-     operands are numbered in the order of appearance in `match_operand'
-     expressions.  In the case of a `define_expand', any operand numbers
-     used only in `match_dup' expressions have higher values than all
-     other operand numbers.
-
-     PREDICATE is a string that is the name of a C function that
-     accepts two arguments, an expression and a machine mode.  During
-     matching, the function will be called with the putative operand as
-     the expression and M as the mode argument (if M is not specified,
-     `VOIDmode' will be used, which normally causes PREDICATE to accept
-     any mode).  If it returns zero, this instruction pattern fails to
-     match.  PREDICATE may be an empty string; then it means no test is
-     to be done on the operand, so anything which occurs in this
-     position is valid.
-
-     Most of the time, PREDICATE will reject modes other than M--but
-     not always.  For example, the predicate `address_operand' uses M
-     as the mode of memory ref that the address should be valid for.
-     Many predicates accept `const_int' nodes even though their mode is
-     `VOIDmode'.
-
-     CONSTRAINT controls reloading and the choice of the best register
-     class to use for a value, as explained later (*note
-     Constraints::.).
-
-     People are often unclear on the difference between the constraint
-     and the predicate.  The predicate helps decide whether a given
-     insn matches the pattern.  The constraint plays no role in this
-     decision; instead, it controls various decisions in the case of an
-     insn which does match.
-
-     On CISC machines, the most common PREDICATE is
-     `"general_operand"'.  This function checks that the putative
-     operand is either a constant, a register or a memory reference,
-     and that it is valid for mode M.
-
-     For an operand that must be a register, PREDICATE should be
-     `"register_operand"'.  Using `"general_operand"' would be valid,
-     since the reload pass would copy any non-register operands through
-     registers, but this would make GNU CC do extra work, it would
-     prevent invariant operands (such as constant) from being removed
-     from loops, and it would prevent the register allocator from doing
-     the best possible job.  On RISC machines, it is usually most
-     efficient to allow PREDICATE to accept only objects that the
-     constraints allow.
-
-     For an operand that must be a constant, you must be sure to either
-     use `"immediate_operand"' for PREDICATE, or make the instruction
-     pattern's extra condition require a constant, or both.  You cannot
-     expect the constraints to do this work!  If the constraints allow
-     only constants, but the predicate allows something else, the
-     compiler will crash when that case arises.
-
-`(match_scratch:M N CONSTRAINT)'
-     This expression is also a placeholder for operand number N and
-     indicates that operand must be a `scratch' or `reg' expression.
-
-     When matching patterns, this is equivalent to
-
-          (match_operand:M N "scratch_operand" PRED)
-
-     but, when generating RTL, it produces a (`scratch':M) expression.
-
-     If the last few expressions in a `parallel' are `clobber'
-     expressions whose operands are either a hard register or
-     `match_scratch', the combiner can add or delete them when
-     necessary.  *Note Side Effects::.
-
-`(match_dup N)'
-     This expression is also a placeholder for operand number N.  It is
-     used when the operand needs to appear more than once in the insn.
-
-     In construction, `match_dup' acts just like `match_operand': the
-     operand is substituted into the insn being constructed.  But in
-     matching, `match_dup' behaves differently.  It assumes that operand
-     number N has already been determined by a `match_operand'
-     appearing earlier in the recognition template, and it matches only
-     an identical-looking expression.
-
-`(match_operator:M N PREDICATE [OPERANDS...])'
-     This pattern is a kind of placeholder for a variable RTL expression
-     code.
-
-     When constructing an insn, it stands for an RTL expression whose
-     expression code is taken from that of operand N, and whose
-     operands are constructed from the patterns OPERANDS.
-
-     When matching an expression, it matches an expression if the
-     function PREDICATE returns nonzero on that expression *and* the
-     patterns OPERANDS match the operands of the expression.
-
-     Suppose that the function `commutative_operator' is defined as
-     follows, to match any expression whose operator is one of the
-     commutative arithmetic operators of RTL and whose mode is MODE:
-
-          int
-          commutative_operator (x, mode)
-               rtx x;
-               enum machine_mode mode;
-          {
-            enum rtx_code code = GET_CODE (x);
-            if (GET_MODE (x) != mode)
-              return 0;
-            return (GET_RTX_CLASS (code) == 'c'
-                    || code == EQ || code == NE);
-          }
-
-     Then the following pattern will match any RTL expression consisting
-     of a commutative operator applied to two general operands:
-
-          (match_operator:SI 3 "commutative_operator"
-            [(match_operand:SI 1 "general_operand" "g")
-             (match_operand:SI 2 "general_operand" "g")])
-
-     Here the vector `[OPERANDS...]' contains two patterns because the
-     expressions to be matched all contain two operands.
-
-     When this pattern does match, the two operands of the commutative
-     operator are recorded as operands 1 and 2 of the insn.  (This is
-     done by the two instances of `match_operand'.)  Operand 3 of the
-     insn will be the entire commutative expression: use `GET_CODE
-     (operands[3])' to see which commutative operator was used.
-
-     The machine mode M of `match_operator' works like that of
-     `match_operand': it is passed as the second argument to the
-     predicate function, and that function is solely responsible for
-     deciding whether the expression to be matched "has" that mode.
-
-     When constructing an insn, argument 3 of the gen-function will
-     specify the operation (i.e. the expression code) for the
-     expression to be made.  It should be an RTL expression, whose
-     expression code is copied into a new expression whose operands are
-     arguments 1 and 2 of the gen-function.  The subexpressions of
-     argument 3 are not used; only its expression code matters.
-
-     When `match_operator' is used in a pattern for matching an insn,
-     it usually best if the operand number of the `match_operator' is
-     higher than that of the actual operands of the insn.  This improves
-     register allocation because the register allocator often looks at
-     operands 1 and 2 of insns to see if it can do register tying.
-
-     There is no way to specify constraints in `match_operator'.  The
-     operand of the insn which corresponds to the `match_operator'
-     never has any constraints because it is never reloaded as a whole.
-     However, if parts of its OPERANDS are matched by `match_operand'
-     patterns, those parts may have constraints of their own.
-
-`(match_op_dup:M N[OPERANDS...])'
-     Like `match_dup', except that it applies to operators instead of
-     operands.  When constructing an insn, operand number N will be
-     substituted at this point.  But in matching, `match_op_dup' behaves
-     differently.  It assumes that operand number N has already been
-     determined by a `match_operator' appearing earlier in the
-     recognition template, and it matches only an identical-looking
-     expression.
-
-`(match_parallel N PREDICATE [SUBPAT...])'
-     This pattern is a placeholder for an insn that consists of a
-     `parallel' expression with a variable number of elements.  This
-     expression should only appear at the top level of an insn pattern.
-
-     When constructing an insn, operand number N will be substituted at
-     this point.  When matching an insn, it matches if the body of the
-     insn is a `parallel' expression with at least as many elements as
-     the vector of SUBPAT expressions in the `match_parallel', if each
-     SUBPAT matches the corresponding element of the `parallel', *and*
-     the function PREDICATE returns nonzero on the `parallel' that is
-     the body of the insn.  It is the responsibility of the predicate
-     to validate elements of the `parallel' beyond those listed in the
-     `match_parallel'.
-
-     A typical use of `match_parallel' is to match load and store
-     multiple expressions, which can contain a variable number of
-     elements in a `parallel'.  For example,
-
-          (define_insn ""
-            [(match_parallel 0 "load_multiple_operation"
-               [(set (match_operand:SI 1 "gpc_reg_operand" "=r")
-                     (match_operand:SI 2 "memory_operand" "m"))
-                (use (reg:SI 179))
-                (clobber (reg:SI 179))])]
-            ""
-            "loadm 0,0,%1,%2")
-
-     This example comes from `a29k.md'.  The function
-     `load_multiple_operations' is defined in `a29k.c' and checks that
-     subsequent elements in the `parallel' are the same as the `set' in
-     the pattern, except that they are referencing subsequent registers
-     and memory locations.
-
-     An insn that matches this pattern might look like:
-
-          (parallel
-           [(set (reg:SI 20) (mem:SI (reg:SI 100)))
-            (use (reg:SI 179))
-            (clobber (reg:SI 179))
-            (set (reg:SI 21)
-                 (mem:SI (plus:SI (reg:SI 100)
-                                  (const_int 4))))
-            (set (reg:SI 22)
-                 (mem:SI (plus:SI (reg:SI 100)
-                                  (const_int 8))))])
-
-`(match_par_dup N [SUBPAT...])'
-     Like `match_op_dup', but for `match_parallel' instead of
-     `match_operator'.
-
-`(address (match_operand:M N "address_operand" ""))'
-     This complex of expressions is a placeholder for an operand number
-     N in a "load address" instruction: an operand which specifies a
-     memory location in the usual way, but for which the actual operand
-     value used is the address of the location, not the contents of the
-     location.
-
-     `address' expressions never appear in RTL code, only in machine
-     descriptions.  And they are used only in machine descriptions that
-     do not use the operand constraint feature.  When operand
-     constraints are in use, the letter `p' in the constraint serves
-     this purpose.
-
-     M is the machine mode of the *memory location being addressed*,
-     not the machine mode of the address itself.  That mode is always
-     the same on a given target machine (it is `Pmode', which normally
-     is `SImode'), so there is no point in mentioning it; thus, no
-     machine mode is written in the `address' expression.  If some day
-     support is added for machines in which addresses of different
-     kinds of objects appear differently or are used differently (such
-     as the PDP-10), different formats would perhaps need different
-     machine modes and these modes might be written in the `address'
-     expression.
-
diff --git a/gcc/gcc.info-17 b/gcc/gcc.info-17
deleted file mode 100644 (file)
index ec0d511..0000000
+++ /dev/null
@@ -1,1112 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Output Template,  Next: Output Statement,  Prev: RTL Template,  Up: Machine Desc
-
-Output Templates and Operand Substitution
-=========================================
-
-   The "output template" is a string which specifies how to output the
-assembler code for an instruction pattern.  Most of the template is a
-fixed string which is output literally.  The character `%' is used to
-specify where to substitute an operand; it can also be used to identify
-places where different variants of the assembler require different
-syntax.
-
-   In the simplest case, a `%' followed by a digit N says to output
-operand N at that point in the string.
-
-   `%' followed by a letter and a digit says to output an operand in an
-alternate fashion.  Four letters have standard, built-in meanings
-described below.  The machine description macro `PRINT_OPERAND' can
-define additional letters with nonstandard meanings.
-
-   `%cDIGIT' can be used to substitute an operand that is a constant
-value without the syntax that normally indicates an immediate operand.
-
-   `%nDIGIT' is like `%cDIGIT' except that the value of the constant is
-negated before printing.
-
-   `%aDIGIT' can be used to substitute an operand as if it were a
-memory reference, with the actual operand treated as the address.  This
-may be useful when outputting a "load address" instruction, because
-often the assembler syntax for such an instruction requires you to
-write the operand as if it were a memory reference.
-
-   `%lDIGIT' is used to substitute a `label_ref' into a jump
-instruction.
-
-   `%=' outputs a number which is unique to each instruction in the
-entire compilation.  This is useful for making local labels to be
-referred to more than once in a single template that generates multiple
-assembler instructions.
-
-   `%' followed by a punctuation character specifies a substitution that
-does not use an operand.  Only one case is standard: `%%' outputs a `%'
-into the assembler code.  Other nonstandard cases can be defined in the
-`PRINT_OPERAND' macro.  You must also define which punctuation
-characters are valid with the `PRINT_OPERAND_PUNCT_VALID_P' macro.
-
-   The template may generate multiple assembler instructions.  Write
-the text for the instructions, with `\;' between them.
-
-   When the RTL contains two operands which are required by constraint
-to match each other, the output template must refer only to the
-lower-numbered operand.  Matching operands are not always identical,
-and the rest of the compiler arranges to put the proper RTL expression
-for printing into the lower-numbered operand.
-
-   One use of nonstandard letters or punctuation following `%' is to
-distinguish between different assembler languages for the same machine;
-for example, Motorola syntax versus MIT syntax for the 68000.  Motorola
-syntax requires periods in most opcode names, while MIT syntax does
-not.  For example, the opcode `movel' in MIT syntax is `move.l' in
-Motorola syntax.  The same file of patterns is used for both kinds of
-output syntax, but the character sequence `%.' is used in each place
-where Motorola syntax wants a period.  The `PRINT_OPERAND' macro for
-Motorola syntax defines the sequence to output a period; the macro for
-MIT syntax defines it to do nothing.
-
-   As a special case, a template consisting of the single character `#'
-instructs the compiler to first split the insn, and then output the
-resulting instructions separately.  This helps eliminate redundancy in
-the output templates.   If you have a `define_insn' that needs to emit
-multiple assembler instructions, and there is an matching `define_split'
-already defined, then you can simply use `#' as the output template
-instead of writing an output template that emits the multiple assembler
-instructions.
-
-   If the macro `ASSEMBLER_DIALECT' is defined, you can use construct
-of the form `{option0|option1|option2}' in the templates.  These
-describe multiple variants of assembler language syntax.  *Note
-Instruction Output::.
-
-\1f
-File: gcc.info,  Node: Output Statement,  Next: Constraints,  Prev: Output Template,  Up: Machine Desc
-
-C Statements for Assembler Output
-=================================
-
-   Often a single fixed template string cannot produce correct and
-efficient assembler code for all the cases that are recognized by a
-single instruction pattern.  For example, the opcodes may depend on the
-kinds of operands; or some unfortunate combinations of operands may
-require extra machine instructions.
-
-   If the output control string starts with a `@', then it is actually
-a series of templates, each on a separate line.  (Blank lines and
-leading spaces and tabs are ignored.)  The templates correspond to the
-pattern's constraint alternatives (*note Multi-Alternative::.).  For
-example, if a target machine has a two-address add instruction `addr'
-to add into a register and another `addm' to add a register to memory,
-you might write this pattern:
-
-     (define_insn "addsi3"
-       [(set (match_operand:SI 0 "general_operand" "=r,m")
-             (plus:SI (match_operand:SI 1 "general_operand" "0,0")
-                      (match_operand:SI 2 "general_operand" "g,r")))]
-       ""
-       "@
-        addr %2,%0
-        addm %2,%0")
-
-   If the output control string starts with a `*', then it is not an
-output template but rather a piece of C program that should compute a
-template.  It should execute a `return' statement to return the
-template-string you want.  Most such templates use C string literals,
-which require doublequote characters to delimit them.  To include these
-doublequote characters in the string, prefix each one with `\'.
-
-   The operands may be found in the array `operands', whose C data type
-is `rtx []'.
-
-   It is very common to select different ways of generating assembler
-code based on whether an immediate operand is within a certain range.
-Be careful when doing this, because the result of `INTVAL' is an
-integer on the host machine.  If the host machine has more bits in an
-`int' than the target machine has in the mode in which the constant
-will be used, then some of the bits you get from `INTVAL' will be
-superfluous.  For proper results, you must carefully disregard the
-values of those bits.
-
-   It is possible to output an assembler instruction and then go on to
-output or compute more of them, using the subroutine `output_asm_insn'.
-This receives two arguments: a template-string and a vector of
-operands.  The vector may be `operands', or it may be another array of
-`rtx' that you declare locally and initialize yourself.
-
-   When an insn pattern has multiple alternatives in its constraints,
-often the appearance of the assembler code is determined mostly by
-which alternative was matched.  When this is so, the C code can test
-the variable `which_alternative', which is the ordinal number of the
-alternative that was actually satisfied (0 for the first, 1 for the
-second alternative, etc.).
-
-   For example, suppose there are two opcodes for storing zero, `clrreg'
-for registers and `clrmem' for memory locations.  Here is how a pattern
-could use `which_alternative' to choose between them:
-
-     (define_insn ""
-       [(set (match_operand:SI 0 "general_operand" "=r,m")
-             (const_int 0))]
-       ""
-       "*
-       return (which_alternative == 0
-               ? \"clrreg %0\" : \"clrmem %0\");
-       ")
-
-   The example above, where the assembler code to generate was *solely*
-determined by the alternative, could also have been specified as
-follows, having the output control string start with a `@':
-
-     (define_insn ""
-       [(set (match_operand:SI 0 "general_operand" "=r,m")
-             (const_int 0))]
-       ""
-       "@
-        clrreg %0
-        clrmem %0")
-
-\1f
-File: gcc.info,  Node: Constraints,  Next: Standard Names,  Prev: Output Statement,  Up: Machine Desc
-
-Operand Constraints
-===================
-
-   Each `match_operand' in an instruction pattern can specify a
-constraint for the type of operands allowed.  Constraints can say
-whether an operand may be in a register, and which kinds of register;
-whether the operand can be a memory reference, and which kinds of
-address; whether the operand may be an immediate constant, and which
-possible values it may have.  Constraints can also require two operands
-to match.
-
-* Menu:
-
-* Simple Constraints::  Basic use of constraints.
-* Multi-Alternative::   When an insn has two alternative constraint-patterns.
-* Class Preferences::   Constraints guide which hard register to put things in.
-* Modifiers::           More precise control over effects of constraints.
-* Machine Constraints:: Existing constraints for some particular machines.
-* No Constraints::      Describing a clean machine without constraints.
-
-\1f
-File: gcc.info,  Node: Simple Constraints,  Next: Multi-Alternative,  Up: Constraints
-
-Simple Constraints
-------------------
-
-   The simplest kind of constraint is a string full of letters, each of
-which describes one kind of operand that is permitted.  Here are the
-letters that are allowed:
-
-`m'
-     A memory operand is allowed, with any kind of address that the
-     machine supports in general.
-
-`o'
-     A memory operand is allowed, but only if the address is
-     "offsettable".  This means that adding a small integer (actually,
-     the width in bytes of the operand, as determined by its machine
-     mode) may be added to the address and the result is also a valid
-     memory address.
-
-     For example, an address which is constant is offsettable; so is an
-     address that is the sum of a register and a constant (as long as a
-     slightly larger constant is also within the range of
-     address-offsets supported by the machine); but an autoincrement or
-     autodecrement address is not offsettable.  More complicated
-     indirect/indexed addresses may or may not be offsettable depending
-     on the other addressing modes that the machine supports.
-
-     Note that in an output operand which can be matched by another
-     operand, the constraint letter `o' is valid only when accompanied
-     by both `<' (if the target machine has predecrement addressing)
-     and `>' (if the target machine has preincrement addressing).
-
-`V'
-     A memory operand that is not offsettable.  In other words,
-     anything that would fit the `m' constraint but not the `o'
-     constraint.
-
-`<'
-     A memory operand with autodecrement addressing (either
-     predecrement or postdecrement) is allowed.
-
-`>'
-     A memory operand with autoincrement addressing (either
-     preincrement or postincrement) is allowed.
-
-`r'
-     A register operand is allowed provided that it is in a general
-     register.
-
-`d', `a', `f', ...
-     Other letters can be defined in machine-dependent fashion to stand
-     for particular classes of registers.  `d', `a' and `f' are defined
-     on the 68000/68020 to stand for data, address and floating point
-     registers.
-
-`i'
-     An immediate integer operand (one with constant value) is allowed.
-     This includes symbolic constants whose values will be known only at
-     assembly time.
-
-`n'
-     An immediate integer operand with a known numeric value is allowed.
-     Many systems cannot support assembly-time constants for operands
-     less than a word wide.  Constraints for these operands should use
-     `n' rather than `i'.
-
-`I', `J', `K', ... `P'
-     Other letters in the range `I' through `P' may be defined in a
-     machine-dependent fashion to permit immediate integer operands with
-     explicit integer values in specified ranges.  For example, on the
-     68000, `I' is defined to stand for the range of values 1 to 8.
-     This is the range permitted as a shift count in the shift
-     instructions.
-
-`E'
-     An immediate floating operand (expression code `const_double') is
-     allowed, but only if the target floating point format is the same
-     as that of the host machine (on which the compiler is running).
-
-`F'
-     An immediate floating operand (expression code `const_double') is
-     allowed.
-
-`G', `H'
-     `G' and `H' may be defined in a machine-dependent fashion to
-     permit immediate floating operands in particular ranges of values.
-
-`s'
-     An immediate integer operand whose value is not an explicit
-     integer is allowed.
-
-     This might appear strange; if an insn allows a constant operand
-     with a value not known at compile time, it certainly must allow
-     any known value.  So why use `s' instead of `i'?  Sometimes it
-     allows better code to be generated.
-
-     For example, on the 68000 in a fullword instruction it is possible
-     to use an immediate operand; but if the immediate value is between
-     -128 and 127, better code results from loading the value into a
-     register and using the register.  This is because the load into
-     the register can be done with a `moveq' instruction.  We arrange
-     for this to happen by defining the letter `K' to mean "any integer
-     outside the range -128 to 127", and then specifying `Ks' in the
-     operand constraints.
-
-`g'
-     Any register, memory or immediate integer operand is allowed,
-     except for registers that are not general registers.
-
-`X'
-     Any operand whatsoever is allowed, even if it does not satisfy
-     `general_operand'.  This is normally used in the constraint of a
-     `match_scratch' when certain alternatives will not actually
-     require a scratch register.
-
-`0', `1', `2', ... `9'
-     An operand that matches the specified operand number is allowed.
-     If a digit is used together with letters within the same
-     alternative, the digit should come last.
-
-     This is called a "matching constraint" and what it really means is
-     that the assembler has only a single operand that fills two roles
-     considered separate in the RTL insn.  For example, an add insn has
-     two input operands and one output operand in the RTL, but on most
-     CISC machines an add instruction really has only two operands, one
-     of them an input-output operand:
-
-          addl #35,r12
-
-     Matching constraints are used in these circumstances.  More
-     precisely, the two operands that match must include one input-only
-     operand and one output-only operand.  Moreover, the digit must be a
-     smaller number than the number of the operand that uses it in the
-     constraint.
-
-     For operands to match in a particular case usually means that they
-     are identical-looking RTL expressions.  But in a few special cases
-     specific kinds of dissimilarity are allowed.  For example, `*x' as
-     an input operand will match `*x++' as an output operand.  For
-     proper results in such cases, the output template should always
-     use the output-operand's number when printing the operand.
-
-`p'
-     An operand that is a valid memory address is allowed.  This is for
-     "load address" and "push address" instructions.
-
-     `p' in the constraint must be accompanied by `address_operand' as
-     the predicate in the `match_operand'.  This predicate interprets
-     the mode specified in the `match_operand' as the mode of the memory
-     reference for which the address would be valid.
-
-`Q', `R', `S', ... `U'
-     Letters in the range `Q' through `U' may be defined in a
-     machine-dependent fashion to stand for arbitrary operand types.
-     The machine description macro `EXTRA_CONSTRAINT' is passed the
-     operand as its first argument and the constraint letter as its
-     second operand.
-
-     A typical use for this would be to distinguish certain types of
-     memory references that affect other insn operands.
-
-     Do not define these constraint letters to accept register
-     references (`reg'); the reload pass does not expect this and would
-     not handle it properly.
-
-   In order to have valid assembler code, each operand must satisfy its
-constraint.  But a failure to do so does not prevent the pattern from
-applying to an insn.  Instead, it directs the compiler to modify the
-code so that the constraint will be satisfied.  Usually this is done by
-copying an operand into a register.
-
-   Contrast, therefore, the two instruction patterns that follow:
-
-     (define_insn ""
-       [(set (match_operand:SI 0 "general_operand" "=r")
-             (plus:SI (match_dup 0)
-                      (match_operand:SI 1 "general_operand" "r")))]
-       ""
-       "...")
-
-which has two operands, one of which must appear in two places, and
-
-     (define_insn ""
-       [(set (match_operand:SI 0 "general_operand" "=r")
-             (plus:SI (match_operand:SI 1 "general_operand" "0")
-                      (match_operand:SI 2 "general_operand" "r")))]
-       ""
-       "...")
-
-which has three operands, two of which are required by a constraint to
-be identical.  If we are considering an insn of the form
-
-     (insn N PREV NEXT
-       (set (reg:SI 3)
-            (plus:SI (reg:SI 6) (reg:SI 109)))
-       ...)
-
-the first pattern would not apply at all, because this insn does not
-contain two identical subexpressions in the right place.  The pattern
-would say, "That does not look like an add instruction; try other
-patterns."  The second pattern would say, "Yes, that's an add
-instruction, but there is something wrong with it."  It would direct
-the reload pass of the compiler to generate additional insns to make
-the constraint true.  The results might look like this:
-
-     (insn N2 PREV N
-       (set (reg:SI 3) (reg:SI 6))
-       ...)
-     
-     (insn N N2 NEXT
-       (set (reg:SI 3)
-            (plus:SI (reg:SI 3) (reg:SI 109)))
-       ...)
-
-   It is up to you to make sure that each operand, in each pattern, has
-constraints that can handle any RTL expression that could be present for
-that operand.  (When multiple alternatives are in use, each pattern
-must, for each possible combination of operand expressions, have at
-least one alternative which can handle that combination of operands.)
-The constraints don't need to *allow* any possible operand--when this is
-the case, they do not constrain--but they must at least point the way to
-reloading any possible operand so that it will fit.
-
-   * If the constraint accepts whatever operands the predicate permits,
-     there is no problem: reloading is never necessary for this operand.
-
-     For example, an operand whose constraints permit everything except
-     registers is safe provided its predicate rejects registers.
-
-     An operand whose predicate accepts only constant values is safe
-     provided its constraints include the letter `i'.  If any possible
-     constant value is accepted, then nothing less than `i' will do; if
-     the predicate is more selective, then the constraints may also be
-     more selective.
-
-   * Any operand expression can be reloaded by copying it into a
-     register.  So if an operand's constraints allow some kind of
-     register, it is certain to be safe.  It need not permit all
-     classes of registers; the compiler knows how to copy a register
-     into another register of the proper class in order to make an
-     instruction valid.
-
-   * A nonoffsettable memory reference can be reloaded by copying the
-     address into a register.  So if the constraint uses the letter
-     `o', all memory references are taken care of.
-
-   * A constant operand can be reloaded by allocating space in memory to
-     hold it as preinitialized data.  Then the memory reference can be
-     used in place of the constant.  So if the constraint uses the
-     letters `o' or `m', constant operands are not a problem.
-
-   * If the constraint permits a constant and a pseudo register used in
-     an insn was not allocated to a hard register and is equivalent to
-     a constant, the register will be replaced with the constant.  If
-     the predicate does not permit a constant and the insn is
-     re-recognized for some reason, the compiler will crash.  Thus the
-     predicate must always recognize any objects allowed by the
-     constraint.
-
-   If the operand's predicate can recognize registers, but the
-constraint does not permit them, it can make the compiler crash.  When
-this operand happens to be a register, the reload pass will be stymied,
-because it does not know how to copy a register temporarily into memory.
-
-   If the predicate accepts a unary operator, the constraint applies to
-the operand.  For example, the MIPS processor at ISA level 3 supports an
-instruction which adds two registers in `SImode' to produce a `DImode'
-result, but only if the registers are correctly sign extended.  This
-predicate for the input operands accepts a `sign_extend' of an `SImode'
-register.  Write the constraint to indicate the type of register that
-is required for the operand of the `sign_extend'.
-
-\1f
-File: gcc.info,  Node: Multi-Alternative,  Next: Class Preferences,  Prev: Simple Constraints,  Up: Constraints
-
-Multiple Alternative Constraints
---------------------------------
-
-   Sometimes a single instruction has multiple alternative sets of
-possible operands.  For example, on the 68000, a logical-or instruction
-can combine register or an immediate value into memory, or it can
-combine any kind of operand into a register; but it cannot combine one
-memory location into another.
-
-   These constraints are represented as multiple alternatives.  An
-alternative can be described by a series of letters for each operand.
-The overall constraint for an operand is made from the letters for this
-operand from the first alternative, a comma, the letters for this
-operand from the second alternative, a comma, and so on until the last
-alternative.  Here is how it is done for fullword logical-or on the
-68000:
-
-     (define_insn "iorsi3"
-       [(set (match_operand:SI 0 "general_operand" "=m,d")
-             (ior:SI (match_operand:SI 1 "general_operand" "%0,0")
-                     (match_operand:SI 2 "general_operand" "dKs,dmKs")))]
-       ...)
-
-   The first alternative has `m' (memory) for operand 0, `0' for
-operand 1 (meaning it must match operand 0), and `dKs' for operand 2.
-The second alternative has `d' (data register) for operand 0, `0' for
-operand 1, and `dmKs' for operand 2.  The `=' and `%' in the
-constraints apply to all the alternatives; their meaning is explained
-in the next section (*note Class Preferences::.).
-
-   If all the operands fit any one alternative, the instruction is
-valid.  Otherwise, for each alternative, the compiler counts how many
-instructions must be added to copy the operands so that that
-alternative applies.  The alternative requiring the least copying is
-chosen.  If two alternatives need the same amount of copying, the one
-that comes first is chosen.  These choices can be altered with the `?'
-and `!' characters:
-
-`?'
-     Disparage slightly the alternative that the `?' appears in, as a
-     choice when no alternative applies exactly.  The compiler regards
-     this alternative as one unit more costly for each `?' that appears
-     in it.
-
-`!'
-     Disparage severely the alternative that the `!' appears in.  This
-     alternative can still be used if it fits without reloading, but if
-     reloading is needed, some other alternative will be used.
-
-   When an insn pattern has multiple alternatives in its constraints,
-often the appearance of the assembler code is determined mostly by which
-alternative was matched.  When this is so, the C code for writing the
-assembler code can use the variable `which_alternative', which is the
-ordinal number of the alternative that was actually satisfied (0 for
-the first, 1 for the second alternative, etc.).  *Note Output
-Statement::.
-
-\1f
-File: gcc.info,  Node: Class Preferences,  Next: Modifiers,  Prev: Multi-Alternative,  Up: Constraints
-
-Register Class Preferences
---------------------------
-
-   The operand constraints have another function: they enable the
-compiler to decide which kind of hardware register a pseudo register is
-best allocated to.  The compiler examines the constraints that apply to
-the insns that use the pseudo register, looking for the
-machine-dependent letters such as `d' and `a' that specify classes of
-registers.  The pseudo register is put in whichever class gets the most
-"votes".  The constraint letters `g' and `r' also vote: they vote in
-favor of a general register.  The machine description says which
-registers are considered general.
-
-   Of course, on some machines all registers are equivalent, and no
-register classes are defined.  Then none of this complexity is relevant.
-
-\1f
-File: gcc.info,  Node: Modifiers,  Next: Machine Constraints,  Prev: Class Preferences,  Up: Constraints
-
-Constraint Modifier Characters
-------------------------------
-
-   Here are constraint modifier characters.
-
-`='
-     Means that this operand is write-only for this instruction: the
-     previous value is discarded and replaced by output data.
-
-`+'
-     Means that this operand is both read and written by the
-     instruction.
-
-     When the compiler fixes up the operands to satisfy the constraints,
-     it needs to know which operands are inputs to the instruction and
-     which are outputs from it.  `=' identifies an output; `+'
-     identifies an operand that is both input and output; all other
-     operands are assumed to be input only.
-
-`&'
-     Means (in a particular alternative) that this operand is an
-     "earlyclobber" operand, which is modified before the instruction is
-     finished using the input operands.  Therefore, this operand may
-     not lie in a register that is used as an input operand or as part
-     of any memory address.
-
-     `&' applies only to the alternative in which it is written.  In
-     constraints with multiple alternatives, sometimes one alternative
-     requires `&' while others do not.  See, for example, the `movdf'
-     insn of the 68000.
-
-     An input operand can be tied to an earlyclobber operand if its only
-     use as an input occurs before the early result is written.  Adding
-     alternatives of this form often allows GCC to produce better code
-     when only some of the inputs can be affected by the earlyclobber.
-     See, for example, the `mulsi3' insn of the ARM.
-
-     `&' does not obviate the need to write `='.
-
-`%'
-     Declares the instruction to be commutative for this operand and the
-     following operand.  This means that the compiler may interchange
-     the two operands if that is the cheapest way to make all operands
-     fit the constraints.  This is often used in patterns for addition
-     instructions that really have only two operands: the result must
-     go in one of the arguments.  Here for example, is how the 68000
-     halfword-add instruction is defined:
-
-          (define_insn "addhi3"
-            [(set (match_operand:HI 0 "general_operand" "=m,r")
-               (plus:HI (match_operand:HI 1 "general_operand" "%0,0")
-                        (match_operand:HI 2 "general_operand" "di,g")))]
-            ...)
-
-`#'
-     Says that all following characters, up to the next comma, are to be
-     ignored as a constraint.  They are significant only for choosing
-     register preferences.
-
-`*'
-     Says that the following character should be ignored when choosing
-     register preferences.  `*' has no effect on the meaning of the
-     constraint as a constraint, and no effect on reloading.
-
-     Here is an example: the 68000 has an instruction to sign-extend a
-     halfword in a data register, and can also sign-extend a value by
-     copying it into an address register.  While either kind of
-     register is acceptable, the constraints on an address-register
-     destination are less strict, so it is best if register allocation
-     makes an address register its goal.  Therefore, `*' is used so
-     that the `d' constraint letter (for data register) is ignored when
-     computing register preferences.
-
-          (define_insn "extendhisi2"
-            [(set (match_operand:SI 0 "general_operand" "=*d,a")
-                  (sign_extend:SI
-                   (match_operand:HI 1 "general_operand" "0,g")))]
-            ...)
-
-\1f
-File: gcc.info,  Node: Machine Constraints,  Next: No Constraints,  Prev: Modifiers,  Up: Constraints
-
-Constraints for Particular Machines
------------------------------------
-
-   Whenever possible, you should use the general-purpose constraint
-letters in `asm' arguments, since they will convey meaning more readily
-to people reading your code.  Failing that, use the constraint letters
-that usually have very similar meanings across architectures.  The most
-commonly used constraints are `m' and `r' (for memory and
-general-purpose registers respectively; *note Simple Constraints::.),
-and `I', usually the letter indicating the most common
-immediate-constant format.
-
-   For each machine architecture, the `config/MACHINE.h' file defines
-additional constraints.  These constraints are used by the compiler
-itself for instruction generation, as well as for `asm' statements;
-therefore, some of the constraints are not particularly interesting for
-`asm'.  The constraints are defined through these macros:
-
-`REG_CLASS_FROM_LETTER'
-     Register class constraints (usually lower case).
-
-`CONST_OK_FOR_LETTER_P'
-     Immediate constant constraints, for non-floating point constants of
-     word size or smaller precision (usually upper case).
-
-`CONST_DOUBLE_OK_FOR_LETTER_P'
-     Immediate constant constraints, for all floating point constants
-     and for constants of greater than word size precision (usually
-     upper case).
-
-`EXTRA_CONSTRAINT'
-     Special cases of registers or memory.  This macro is not required,
-     and is only defined for some machines.
-
-   Inspecting these macro definitions in the compiler source for your
-machine is the best way to be certain you have the right constraints.
-However, here is a summary of the machine-dependent constraints
-available on some particular machines.
-
-*ARM family--`arm.h'*
-
-    `f'
-          Floating-point register
-
-    `F'
-          One of the floating-point constants 0.0, 0.5, 1.0, 2.0, 3.0,
-          4.0, 5.0 or 10.0
-
-    `G'
-          Floating-point constant that would satisfy the constraint `F'
-          if it were negated
-
-    `I'
-          Integer that is valid as an immediate operand in a data
-          processing instruction.  That is, an integer in the range 0
-          to 255 rotated by a multiple of 2
-
-    `J'
-          Integer in the range -4095 to 4095
-
-    `K'
-          Integer that satisfies constraint `I' when inverted (ones
-          complement)
-
-    `L'
-          Integer that satisfies constraint `I' when negated (twos
-          complement)
-
-    `M'
-          Integer in the range 0 to 32
-
-    `Q'
-          A memory reference where the exact address is in a single
-          register (``m'' is preferable for `asm' statements)
-
-    `R'
-          An item in the constant pool
-
-    `S'
-          A symbol in the text segment of the current file
-
-*AMD 29000 family--`a29k.h'*
-
-    `l'
-          Local register 0
-
-    `b'
-          Byte Pointer (`BP') register
-
-    `q'
-          `Q' register
-
-    `h'
-          Special purpose register
-
-    `A'
-          First accumulator register
-
-    `a'
-          Other accumulator register
-
-    `f'
-          Floating point register
-
-    `I'
-          Constant greater than 0, less than 0x100
-
-    `J'
-          Constant greater than 0, less than 0x10000
-
-    `K'
-          Constant whose high 24 bits are on (1)
-
-    `L'
-          16 bit constant whose high 8 bits are on (1)
-
-    `M'
-          32 bit constant whose high 16 bits are on (1)
-
-    `N'
-          32 bit negative constant that fits in 8 bits
-
-    `O'
-          The constant 0x80000000 or, on the 29050, any 32 bit constant
-          whose low 16 bits are 0.
-
-    `P'
-          16 bit negative constant that fits in 8 bits
-
-    `G'
-    `H'
-          A floating point constant (in `asm' statements, use the
-          machine independent `E' or `F' instead)
-
-*IBM RS6000--`rs6000.h'*
-
-    `b'
-          Address base register
-
-    `f'
-          Floating point register
-
-    `h'
-          `MQ', `CTR', or `LINK' register
-
-    `q'
-          `MQ' register
-
-    `c'
-          `CTR' register
-
-    `l'
-          `LINK' register
-
-    `x'
-          `CR' register (condition register) number 0
-
-    `y'
-          `CR' register (condition register)
-
-    `I'
-          Signed 16 bit constant
-
-    `J'
-          Constant whose low 16 bits are 0
-
-    `K'
-          Constant whose high 16 bits are 0
-
-    `L'
-          Constant suitable as a mask operand
-
-    `M'
-          Constant larger than 31
-
-    `N'
-          Exact power of 2
-
-    `O'
-          Zero
-
-    `P'
-          Constant whose negation is a signed 16 bit constant
-
-    `G'
-          Floating point constant that can be loaded into a register
-          with one instruction per word
-
-    `Q'
-          Memory operand that is an offset from a register (`m' is
-          preferable for `asm' statements)
-
-    `R'
-          AIX TOC entry
-
-    `S'
-          Windows NT SYMBOL_REF
-
-    `T'
-          Windows NT LABEL_REF
-
-    `U'
-          System V Release 4 small data area reference
-
-*Intel 386--`i386.h'*
-
-    `q'
-          `a', `b', `c', or `d' register
-
-    `A'
-          `a', or `d' register (for 64-bit ints)
-
-    `f'
-          Floating point register
-
-    `t'
-          First (top of stack) floating point register
-
-    `u'
-          Second floating point register
-
-    `a'
-          `a' register
-
-    `b'
-          `b' register
-
-    `c'
-          `c' register
-
-    `d'
-          `d' register
-
-    `D'
-          `di' register
-
-    `S'
-          `si' register
-
-    `I'
-          Constant in range 0 to 31 (for 32 bit shifts)
-
-    `J'
-          Constant in range 0 to 63 (for 64 bit shifts)
-
-    `K'
-          `0xff'
-
-    `L'
-          `0xffff'
-
-    `M'
-          0, 1, 2, or 3 (shifts for `lea' instruction)
-
-    `N'
-          Constant in range 0 to 255 (for `out' instruction)
-
-    `G'
-          Standard 80387 floating point constant
-
-*Intel 960--`i960.h'*
-
-    `f'
-          Floating point register (`fp0' to `fp3')
-
-    `l'
-          Local register (`r0' to `r15')
-
-    `b'
-          Global register (`g0' to `g15')
-
-    `d'
-          Any local or global register
-
-    `I'
-          Integers from 0 to 31
-
-    `J'
-          0
-
-    `K'
-          Integers from -31 to 0
-
-    `G'
-          Floating point 0
-
-    `H'
-          Floating point 1
-
-*MIPS--`mips.h'*
-
-    `d'
-          General-purpose integer register
-
-    `f'
-          Floating-point register (if available)
-
-    `h'
-          `Hi' register
-
-    `l'
-          `Lo' register
-
-    `x'
-          `Hi' or `Lo' register
-
-    `y'
-          General-purpose integer register
-
-    `z'
-          Floating-point status register
-
-    `I'
-          Signed 16 bit constant (for arithmetic instructions)
-
-    `J'
-          Zero
-
-    `K'
-          Zero-extended 16-bit constant (for logic instructions)
-
-    `L'
-          Constant with low 16 bits zero (can be loaded with `lui')
-
-    `M'
-          32 bit constant which requires two instructions to load (a
-          constant which is not `I', `K', or `L')
-
-    `N'
-          Negative 16 bit constant
-
-    `O'
-          Exact power of two
-
-    `P'
-          Positive 16 bit constant
-
-    `G'
-          Floating point zero
-
-    `Q'
-          Memory reference that can be loaded with more than one
-          instruction (`m' is preferable for `asm' statements)
-
-    `R'
-          Memory reference that can be loaded with one instruction (`m'
-          is preferable for `asm' statements)
-
-    `S'
-          Memory reference in external OSF/rose PIC format (`m' is
-          preferable for `asm' statements)
-
-*Motorola 680x0--`m68k.h'*
-
-    `a'
-          Address register
-
-    `d'
-          Data register
-
-    `f'
-          68881 floating-point register, if available
-
-    `x'
-          Sun FPA (floating-point) register, if available
-
-    `y'
-          First 16 Sun FPA registers, if available
-
-    `I'
-          Integer in the range 1 to 8
-
-    `J'
-          16 bit signed number
-
-    `K'
-          Signed number whose magnitude is greater than 0x80
-
-    `L'
-          Integer in the range -8 to -1
-
-    `M'
-          Signed number whose magnitude is greater than 0x100
-
-    `G'
-          Floating point constant that is not a 68881 constant
-
-    `H'
-          Floating point constant that can be used by Sun FPA
-
-*SPARC--`sparc.h'*
-
-    `f'
-          Floating-point register that can hold 32 or 64 bit values.
-
-    `e'
-          Floating-point register that can hold 64 or 128 bit values.
-
-    `I'
-          Signed 13 bit constant
-
-    `J'
-          Zero
-
-    `K'
-          32 bit constant with the low 12 bits clear (a constant that
-          can be loaded with the `sethi' instruction)
-
-    `G'
-          Floating-point zero
-
-    `H'
-          Signed 13 bit constant, sign-extended to 32 or 64 bits
-
-    `Q'
-          Memory reference that can be loaded with one instruction
-          (`m' is more appropriate for `asm' statements)
-
-    `S'
-          Constant, or memory address
-
-    `T'
-          Memory address aligned to an 8-byte boundary
-
-    `U'
-          Even register
-
-\1f
-File: gcc.info,  Node: No Constraints,  Prev: Machine Constraints,  Up: Constraints
-
-Not Using Constraints
----------------------
-
-   Some machines are so clean that operand constraints are not
-required.  For example, on the Vax, an operand valid in one context is
-valid in any other context.  On such a machine, every operand
-constraint would be `g', excepting only operands of "load address"
-instructions which are written as if they referred to a memory
-location's contents but actual refer to its address.  They would have
-constraint `p'.
-
-   For such machines, instead of writing `g' and `p' for all the
-constraints, you can choose to write a description with empty
-constraints.  Then you write `""' for the constraint in every
-`match_operand'.  Address operands are identified by writing an
-`address' expression around the `match_operand', not by their
-constraints.
-
-   When the machine description has just empty constraints, certain
-parts of compilation are skipped, making the compiler faster.  However,
-few machines actually do not need constraints; all machine descriptions
-now in existence use constraints.
-
diff --git a/gcc/gcc.info-18 b/gcc/gcc.info-18
deleted file mode 100644 (file)
index abec34e..0000000
+++ /dev/null
@@ -1,1031 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Standard Names,  Next: Pattern Ordering,  Prev: Constraints,  Up: Machine Desc
-
-Standard Pattern Names For Generation
-=====================================
-
-   Here is a table of the instruction names that are meaningful in the
-RTL generation pass of the compiler.  Giving one of these names to an
-instruction pattern tells the RTL generation pass that it can use the
-pattern in to accomplish a certain task.
-
-`movM'
-     Here M stands for a two-letter machine mode name, in lower case.
-     This instruction pattern moves data with that machine mode from
-     operand 1 to operand 0.  For example, `movsi' moves full-word data.
-
-     If operand 0 is a `subreg' with mode M of a register whose own
-     mode is wider than M, the effect of this instruction is to store
-     the specified value in the part of the register that corresponds
-     to mode M.  The effect on the rest of the register is undefined.
-
-     This class of patterns is special in several ways.  First of all,
-     each of these names *must* be defined, because there is no other
-     way to copy a datum from one place to another.
-
-     Second, these patterns are not used solely in the RTL generation
-     pass.  Even the reload pass can generate move insns to copy values
-     from stack slots into temporary registers.  When it does so, one
-     of the operands is a hard register and the other is an operand
-     that can need to be reloaded into a register.
-
-     Therefore, when given such a pair of operands, the pattern must
-     generate RTL which needs no reloading and needs no temporary
-     registers--no registers other than the operands.  For example, if
-     you support the pattern with a `define_expand', then in such a
-     case the `define_expand' mustn't call `force_reg' or any other such
-     function which might generate new pseudo registers.
-
-     This requirement exists even for subword modes on a RISC machine
-     where fetching those modes from memory normally requires several
-     insns and some temporary registers.  Look in `spur.md' to see how
-     the requirement can be satisfied.
-
-     During reload a memory reference with an invalid address may be
-     passed as an operand.  Such an address will be replaced with a
-     valid address later in the reload pass.  In this case, nothing may
-     be done with the address except to use it as it stands.  If it is
-     copied, it will not be replaced with a valid address.  No attempt
-     should be made to make such an address into a valid address and no
-     routine (such as `change_address') that will do so may be called.
-     Note that `general_operand' will fail when applied to such an
-     address.
-
-     The global variable `reload_in_progress' (which must be explicitly
-     declared if required) can be used to determine whether such special
-     handling is required.
-
-     The variety of operands that have reloads depends on the rest of
-     the machine description, but typically on a RISC machine these can
-     only be pseudo registers that did not get hard registers, while on
-     other machines explicit memory references will get optional
-     reloads.
-
-     If a scratch register is required to move an object to or from
-     memory, it can be allocated using `gen_reg_rtx' prior to reload.
-     But this is impossible during and after reload.  If there are
-     cases needing scratch registers after reload, you must define
-     `SECONDARY_INPUT_RELOAD_CLASS' and perhaps also
-     `SECONDARY_OUTPUT_RELOAD_CLASS' to detect them, and provide
-     patterns `reload_inM' or `reload_outM' to handle them.  *Note
-     Register Classes::.
-
-     The constraints on a `moveM' must permit moving any hard register
-     to any other hard register provided that `HARD_REGNO_MODE_OK'
-     permits mode M in both registers and `REGISTER_MOVE_COST' applied
-     to their classes returns a value of 2.
-
-     It is obligatory to support floating point `moveM' instructions
-     into and out of any registers that can hold fixed point values,
-     because unions and structures (which have modes `SImode' or
-     `DImode') can be in those registers and they may have floating
-     point members.
-
-     There may also be a need to support fixed point `moveM'
-     instructions in and out of floating point registers.
-     Unfortunately, I have forgotten why this was so, and I don't know
-     whether it is still true.  If `HARD_REGNO_MODE_OK' rejects fixed
-     point values in floating point registers, then the constraints of
-     the fixed point `moveM' instructions must be designed to avoid
-     ever trying to reload into a floating point register.
-
-`reload_inM'
-`reload_outM'
-     Like `movM', but used when a scratch register is required to move
-     between operand 0 and operand 1.  Operand 2 describes the scratch
-     register.  See the discussion of the `SECONDARY_RELOAD_CLASS'
-     macro in *note Register Classes::..
-
-`movstrictM'
-     Like `movM' except that if operand 0 is a `subreg' with mode M of
-     a register whose natural mode is wider, the `movstrictM'
-     instruction is guaranteed not to alter any of the register except
-     the part which belongs to mode M.
-
-`load_multiple'
-     Load several consecutive memory locations into consecutive
-     registers.  Operand 0 is the first of the consecutive registers,
-     operand 1 is the first memory location, and operand 2 is a
-     constant: the number of consecutive registers.
-
-     Define this only if the target machine really has such an
-     instruction; do not define this if the most efficient way of
-     loading consecutive registers from memory is to do them one at a
-     time.
-
-     On some machines, there are restrictions as to which consecutive
-     registers can be stored into memory, such as particular starting or
-     ending register numbers or only a range of valid counts.  For those
-     machines, use a `define_expand' (*note Expander Definitions::.)
-     and make the pattern fail if the restrictions are not met.
-
-     Write the generated insn as a `parallel' with elements being a
-     `set' of one register from the appropriate memory location (you may
-     also need `use' or `clobber' elements).  Use a `match_parallel'
-     (*note RTL Template::.) to recognize the insn.  See `a29k.md' and
-     `rs6000.md' for examples of the use of this insn pattern.
-
-`store_multiple'
-     Similar to `load_multiple', but store several consecutive registers
-     into consecutive memory locations.  Operand 0 is the first of the
-     consecutive memory locations, operand 1 is the first register, and
-     operand 2 is a constant: the number of consecutive registers.
-
-`addM3'
-     Add operand 2 and operand 1, storing the result in operand 0.  All
-     operands must have mode M.  This can be used even on two-address
-     machines, by means of constraints requiring operands 1 and 0 to be
-     the same location.
-
-`subM3', `mulM3'
-`divM3', `udivM3', `modM3', `umodM3'
-`sminM3', `smaxM3', `uminM3', `umaxM3'
-`andM3', `iorM3', `xorM3'
-     Similar, for other arithmetic operations.
-
-`mulhisi3'
-     Multiply operands 1 and 2, which have mode `HImode', and store a
-     `SImode' product in operand 0.
-
-`mulqihi3', `mulsidi3'
-     Similar widening-multiplication instructions of other widths.
-
-`umulqihi3', `umulhisi3', `umulsidi3'
-     Similar widening-multiplication instructions that do unsigned
-     multiplication.
-
-`mulM3_highpart'
-     Perform a signed multiplication of operands 1 and 2, which have
-     mode M, and store the most significant half of the product in
-     operand 0.  The least significant half of the product is discarded.
-
-`umulM3_highpart'
-     Similar, but the multiplication is unsigned.
-
-`divmodM4'
-     Signed division that produces both a quotient and a remainder.
-     Operand 1 is divided by operand 2 to produce a quotient stored in
-     operand 0 and a remainder stored in operand 3.
-
-     For machines with an instruction that produces both a quotient and
-     a remainder, provide a pattern for `divmodM4' but do not provide
-     patterns for `divM3' and `modM3'.  This allows optimization in the
-     relatively common case when both the quotient and remainder are
-     computed.
-
-     If an instruction that just produces a quotient or just a remainder
-     exists and is more efficient than the instruction that produces
-     both, write the output routine of `divmodM4' to call
-     `find_reg_note' and look for a `REG_UNUSED' note on the quotient
-     or remainder and generate the appropriate instruction.
-
-`udivmodM4'
-     Similar, but does unsigned division.
-
-`ashlM3'
-     Arithmetic-shift operand 1 left by a number of bits specified by
-     operand 2, and store the result in operand 0.  Here M is the mode
-     of operand 0 and operand 1; operand 2's mode is specified by the
-     instruction pattern, and the compiler will convert the operand to
-     that mode before generating the instruction.
-
-`ashrM3', `lshrM3', `rotlM3', `rotrM3'
-     Other shift and rotate instructions, analogous to the `ashlM3'
-     instructions.
-
-`negM2'
-     Negate operand 1 and store the result in operand 0.
-
-`absM2'
-     Store the absolute value of operand 1 into operand 0.
-
-`sqrtM2'
-     Store the square root of operand 1 into operand 0.
-
-     The `sqrt' built-in function of C always uses the mode which
-     corresponds to the C data type `double'.
-
-`ffsM2'
-     Store into operand 0 one plus the index of the least significant
-     1-bit of operand 1.  If operand 1 is zero, store zero.  M is the
-     mode of operand 0; operand 1's mode is specified by the instruction
-     pattern, and the compiler will convert the operand to that mode
-     before generating the instruction.
-
-     The `ffs' built-in function of C always uses the mode which
-     corresponds to the C data type `int'.
-
-`one_cmplM2'
-     Store the bitwise-complement of operand 1 into operand 0.
-
-`cmpM'
-     Compare operand 0 and operand 1, and set the condition codes.  The
-     RTL pattern should look like this:
-
-          (set (cc0) (compare (match_operand:M 0 ...)
-                              (match_operand:M 1 ...)))
-
-`tstM'
-     Compare operand 0 against zero, and set the condition codes.  The
-     RTL pattern should look like this:
-
-          (set (cc0) (match_operand:M 0 ...))
-
-     `tstM' patterns should not be defined for machines that do not use
-     `(cc0)'.  Doing so would confuse the optimizer since it would no
-     longer be clear which `set' operations were comparisons.  The
-     `cmpM' patterns should be used instead.
-
-`movstrM'
-     Block move instruction.  The addresses of the destination and
-     source strings are the first two operands, and both are in mode
-     `Pmode'.  The number of bytes to move is the third operand, in
-     mode M.
-
-     The fourth operand is the known shared alignment of the source and
-     destination, in the form of a `const_int' rtx.  Thus, if the
-     compiler knows that both source and destination are word-aligned,
-     it may provide the value 4 for this operand.
-
-     These patterns need not give special consideration to the
-     possibility that the source and destination strings might overlap.
-
-`clrstrM'
-     Block clear instruction.  The addresses of the destination string
-     is the first operand, in mode `Pmode'.  The number of bytes to
-     clear is the second operand, in mode M.
-
-     The third operand is the known alignment of the destination, in
-     the form of a `const_int' rtx.  Thus, if the compiler knows that
-     the destination is word-aligned, it may provide the value 4 for
-     this operand.
-
-`cmpstrM'
-     Block compare instruction, with five operands.  Operand 0 is the
-     output; it has mode M.  The remaining four operands are like the
-     operands of `movstrM'.  The two memory blocks specified are
-     compared byte by byte in lexicographic order.  The effect of the
-     instruction is to store a value in operand 0 whose sign indicates
-     the result of the comparison.
-
-`strlenM'
-     Compute the length of a string, with three operands.  Operand 0 is
-     the result (of mode M), operand 1 is a `mem' referring to the
-     first character of the string, operand 2 is the character to
-     search for (normally zero), and operand 3 is a constant describing
-     the known alignment of the beginning of the string.
-
-`floatMN2'
-     Convert signed integer operand 1 (valid for fixed point mode M) to
-     floating point mode N and store in operand 0 (which has mode N).
-
-`floatunsMN2'
-     Convert unsigned integer operand 1 (valid for fixed point mode M)
-     to floating point mode N and store in operand 0 (which has mode N).
-
-`fixMN2'
-     Convert operand 1 (valid for floating point mode M) to fixed point
-     mode N as a signed number and store in operand 0 (which has mode
-     N).  This instruction's result is defined only when the value of
-     operand 1 is an integer.
-
-`fixunsMN2'
-     Convert operand 1 (valid for floating point mode M) to fixed point
-     mode N as an unsigned number and store in operand 0 (which has
-     mode N).  This instruction's result is defined only when the value
-     of operand 1 is an integer.
-
-`ftruncM2'
-     Convert operand 1 (valid for floating point mode M) to an integer
-     value, still represented in floating point mode M, and store it in
-     operand 0 (valid for floating point mode M).
-
-`fix_truncMN2'
-     Like `fixMN2' but works for any floating point value of mode M by
-     converting the value to an integer.
-
-`fixuns_truncMN2'
-     Like `fixunsMN2' but works for any floating point value of mode M
-     by converting the value to an integer.
-
-`truncMN2'
-     Truncate operand 1 (valid for mode M) to mode N and store in
-     operand 0 (which has mode N).  Both modes must be fixed point or
-     both floating point.
-
-`extendMN2'
-     Sign-extend operand 1 (valid for mode M) to mode N and store in
-     operand 0 (which has mode N).  Both modes must be fixed point or
-     both floating point.
-
-`zero_extendMN2'
-     Zero-extend operand 1 (valid for mode M) to mode N and store in
-     operand 0 (which has mode N).  Both modes must be fixed point.
-
-`extv'
-     Extract a bit field from operand 1 (a register or memory operand),
-     where operand 2 specifies the width in bits and operand 3 the
-     starting bit, and store it in operand 0.  Operand 0 must have mode
-     `word_mode'.  Operand 1 may have mode `byte_mode' or `word_mode';
-     often `word_mode' is allowed only for registers.  Operands 2 and 3
-     must be valid for `word_mode'.
-
-     The RTL generation pass generates this instruction only with
-     constants for operands 2 and 3.
-
-     The bit-field value is sign-extended to a full word integer before
-     it is stored in operand 0.
-
-`extzv'
-     Like `extv' except that the bit-field value is zero-extended.
-
-`insv'
-     Store operand 3 (which must be valid for `word_mode') into a bit
-     field in operand 0, where operand 1 specifies the width in bits and
-     operand 2 the starting bit.  Operand 0 may have mode `byte_mode' or
-     `word_mode'; often `word_mode' is allowed only for registers.
-     Operands 1 and 2 must be valid for `word_mode'.
-
-     The RTL generation pass generates this instruction only with
-     constants for operands 1 and 2.
-
-`movMODEcc'
-     Conditionally move operand 2 or operand 3 into operand 0 according
-     to the comparison in operand 1.  If the comparison is true,
-     operand 2 is moved into operand 0, otherwise operand 3 is moved.
-
-     The mode of the operands being compared need not be the same as
-     the operands being moved.  Some machines, sparc64 for example,
-     have instructions that conditionally move an integer value based
-     on the floating point condition codes and vice versa.
-
-     If the machine does not have conditional move instructions, do not
-     define these patterns.
-
-`sCOND'
-     Store zero or nonzero in the operand according to the condition
-     codes.  Value stored is nonzero iff the condition COND is true.
-     COND is the name of a comparison operation expression code, such
-     as `eq', `lt' or `leu'.
-
-     You specify the mode that the operand must have when you write the
-     `match_operand' expression.  The compiler automatically sees which
-     mode you have used and supplies an operand of that mode.
-
-     The value stored for a true condition must have 1 as its low bit,
-     or else must be negative.  Otherwise the instruction is not
-     suitable and you should omit it from the machine description.  You
-     describe to the compiler exactly which value is stored by defining
-     the macro `STORE_FLAG_VALUE' (*note Misc::.).  If a description
-     cannot be found that can be used for all the `sCOND' patterns, you
-     should omit those operations from the machine description.
-
-     These operations may fail, but should do so only in relatively
-     uncommon cases; if they would fail for common cases involving
-     integer comparisons, it is best to omit these patterns.
-
-     If these operations are omitted, the compiler will usually
-     generate code that copies the constant one to the target and
-     branches around an assignment of zero to the target.  If this code
-     is more efficient than the potential instructions used for the
-     `sCOND' pattern followed by those required to convert the result
-     into a 1 or a zero in `SImode', you should omit the `sCOND'
-     operations from the machine description.
-
-`bCOND'
-     Conditional branch instruction.  Operand 0 is a `label_ref' that
-     refers to the label to jump to.  Jump if the condition codes meet
-     condition COND.
-
-     Some machines do not follow the model assumed here where a
-     comparison instruction is followed by a conditional branch
-     instruction.  In that case, the `cmpM' (and `tstM') patterns should
-     simply store the operands away and generate all the required insns
-     in a `define_expand' (*note Expander Definitions::.) for the
-     conditional branch operations.  All calls to expand `bCOND'
-     patterns are immediately preceded by calls to expand either a
-     `cmpM' pattern or a `tstM' pattern.
-
-     Machines that use a pseudo register for the condition code value,
-     or where the mode used for the comparison depends on the condition
-     being tested, should also use the above mechanism.  *Note Jump
-     Patterns::
-
-     The above discussion also applies to the `movMODEcc' and `sCOND'
-     patterns.
-
-`call'
-     Subroutine call instruction returning no value.  Operand 0 is the
-     function to call; operand 1 is the number of bytes of arguments
-     pushed (in mode `SImode', except it is normally a `const_int');
-     operand 2 is the number of registers used as operands.
-
-     On most machines, operand 2 is not actually stored into the RTL
-     pattern.  It is supplied for the sake of some RISC machines which
-     need to put this information into the assembler code; they can put
-     it in the RTL instead of operand 1.
-
-     Operand 0 should be a `mem' RTX whose address is the address of the
-     function.  Note, however, that this address can be a `symbol_ref'
-     expression even if it would not be a legitimate memory address on
-     the target machine.  If it is also not a valid argument for a call
-     instruction, the pattern for this operation should be a
-     `define_expand' (*note Expander Definitions::.) that places the
-     address into a register and uses that register in the call
-     instruction.
-
-`call_value'
-     Subroutine call instruction returning a value.  Operand 0 is the
-     hard register in which the value is returned.  There are three more
-     operands, the same as the three operands of the `call' instruction
-     (but with numbers increased by one).
-
-     Subroutines that return `BLKmode' objects use the `call' insn.
-
-`call_pop', `call_value_pop'
-     Similar to `call' and `call_value', except used if defined and if
-     `RETURN_POPS_ARGS' is non-zero.  They should emit a `parallel'
-     that contains both the function call and a `set' to indicate the
-     adjustment made to the frame pointer.
-
-     For machines where `RETURN_POPS_ARGS' can be non-zero, the use of
-     these patterns increases the number of functions for which the
-     frame pointer can be eliminated, if desired.
-
-`untyped_call'
-     Subroutine call instruction returning a value of any type.
-     Operand 0 is the function to call; operand 1 is a memory location
-     where the result of calling the function is to be stored; operand
-     2 is a `parallel' expression where each element is a `set'
-     expression that indicates the saving of a function return value
-     into the result block.
-
-     This instruction pattern should be defined to support
-     `__builtin_apply' on machines where special instructions are needed
-     to call a subroutine with arbitrary arguments or to save the value
-     returned.  This instruction pattern is required on machines that
-     have multiple registers that can hold a return value (i.e.
-     `FUNCTION_VALUE_REGNO_P' is true for more than one register).
-
-`return'
-     Subroutine return instruction.  This instruction pattern name
-     should be defined only if a single instruction can do all the work
-     of returning from a function.
-
-     Like the `movM' patterns, this pattern is also used after the RTL
-     generation phase.  In this case it is to support machines where
-     multiple instructions are usually needed to return from a
-     function, but some class of functions only requires one
-     instruction to implement a return.  Normally, the applicable
-     functions are those which do not need to save any registers or
-     allocate stack space.
-
-     For such machines, the condition specified in this pattern should
-     only be true when `reload_completed' is non-zero and the function's
-     epilogue would only be a single instruction.  For machines with
-     register windows, the routine `leaf_function_p' may be used to
-     determine if a register window push is required.
-
-     Machines that have conditional return instructions should define
-     patterns such as
-
-          (define_insn ""
-            [(set (pc)
-                  (if_then_else (match_operator
-                                   0 "comparison_operator"
-                                   [(cc0) (const_int 0)])
-                                (return)
-                                (pc)))]
-            "CONDITION"
-            "...")
-
-     where CONDITION would normally be the same condition specified on
-     the named `return' pattern.
-
-`untyped_return'
-     Untyped subroutine return instruction.  This instruction pattern
-     should be defined to support `__builtin_return' on machines where
-     special instructions are needed to return a value of any type.
-
-     Operand 0 is a memory location where the result of calling a
-     function with `__builtin_apply' is stored; operand 1 is a
-     `parallel' expression where each element is a `set' expression
-     that indicates the restoring of a function return value from the
-     result block.
-
-`nop'
-     No-op instruction.  This instruction pattern name should always be
-     defined to output a no-op in assembler code.  `(const_int 0)' will
-     do as an RTL pattern.
-
-`indirect_jump'
-     An instruction to jump to an address which is operand zero.  This
-     pattern name is mandatory on all machines.
-
-`casesi'
-     Instruction to jump through a dispatch table, including bounds
-     checking.  This instruction takes five operands:
-
-       1. The index to dispatch on, which has mode `SImode'.
-
-       2. The lower bound for indices in the table, an integer constant.
-
-       3. The total range of indices in the table--the largest index
-          minus the smallest one (both inclusive).
-
-       4. A label that precedes the table itself.
-
-       5. A label to jump to if the index has a value outside the
-          bounds.  (If the machine-description macro
-          `CASE_DROPS_THROUGH' is defined, then an out-of-bounds index
-          drops through to the code following the jump table instead of
-          jumping to this label.  In that case, this label is not
-          actually used by the `casesi' instruction, but it is always
-          provided as an operand.)
-
-     The table is a `addr_vec' or `addr_diff_vec' inside of a
-     `jump_insn'.  The number of elements in the table is one plus the
-     difference between the upper bound and the lower bound.
-
-`tablejump'
-     Instruction to jump to a variable address.  This is a low-level
-     capability which can be used to implement a dispatch table when
-     there is no `casesi' pattern.
-
-     This pattern requires two operands: the address or offset, and a
-     label which should immediately precede the jump table.  If the
-     macro `CASE_VECTOR_PC_RELATIVE' is defined then the first operand
-     is an offset which counts from the address of the table;
-     otherwise, it is an absolute address to jump to.  In either case,
-     the first operand has mode `Pmode'.
-
-     The `tablejump' insn is always the last insn before the jump table
-     it uses.  Its assembler code normally has no need to use the
-     second operand, but you should incorporate it in the RTL pattern so
-     that the jump optimizer will not delete the table as unreachable
-     code.
-
-`canonicalize_funcptr_for_compare'
-     Canonicalize the function pointer in operand 1 and store the result
-     into operand 0.
-
-     Operand 0 is always a `reg' and has mode `Pmode'; operand 1 may be
-     a `reg', `mem', `symbol_ref', `const_int', etc and also has mode
-     `Pmode'.
-
-     Canonicalization of a function pointer usually involves computing
-     the address of the function which would be called if the function
-     pointer were used in an indirect call.
-
-     Only define this pattern if function pointers on the target machine
-     can have different values but still call the same function when
-     used in an indirect call.
-
-`save_stack_block'
-`save_stack_function'
-`save_stack_nonlocal'
-`restore_stack_block'
-`restore_stack_function'
-`restore_stack_nonlocal'
-     Most machines save and restore the stack pointer by copying it to
-     or from an object of mode `Pmode'.  Do not define these patterns on
-     such machines.
-
-     Some machines require special handling for stack pointer saves and
-     restores.  On those machines, define the patterns corresponding to
-     the non-standard cases by using a `define_expand' (*note Expander
-     Definitions::.) that produces the required insns.  The three types
-     of saves and restores are:
-
-       1. `save_stack_block' saves the stack pointer at the start of a
-          block that allocates a variable-sized object, and
-          `restore_stack_block' restores the stack pointer when the
-          block is exited.
-
-       2. `save_stack_function' and `restore_stack_function' do a
-          similar job for the outermost block of a function and are
-          used when the function allocates variable-sized objects or
-          calls `alloca'.  Only the epilogue uses the restored stack
-          pointer, allowing a simpler save or restore sequence on some
-          machines.
-
-       3. `save_stack_nonlocal' is used in functions that contain labels
-          branched to by nested functions.  It saves the stack pointer
-          in such a way that the inner function can use
-          `restore_stack_nonlocal' to restore the stack pointer.  The
-          compiler generates code to restore the frame and argument
-          pointer registers, but some machines require saving and
-          restoring additional data such as register window information
-          or stack backchains.  Place insns in these patterns to save
-          and restore any such required data.
-
-     When saving the stack pointer, operand 0 is the save area and
-     operand 1 is the stack pointer.  The mode used to allocate the
-     save area is the mode of operand 0.  You must specify an integral
-     mode, or `VOIDmode' if no save area is needed for a particular
-     type of save (either because no save is needed or because a
-     machine-specific save area can be used).  Operand 0 is the stack
-     pointer and operand 1 is the save area for restore operations.  If
-     `save_stack_block' is defined, operand 0 must not be `VOIDmode'
-     since these saves can be arbitrarily nested.
-
-     A save area is a `mem' that is at a constant offset from
-     `virtual_stack_vars_rtx' when the stack pointer is saved for use by
-     nonlocal gotos and a `reg' in the other two cases.
-
-`allocate_stack'
-     Subtract (or add if `STACK_GROWS_DOWNWARD' is undefined) operand 1
-     from the stack pointer to create space for dynamically allocated
-     data.
-
-     Store the resultant pointer to this space into operand 0.  If you
-     are allocating space from the main stack, do this by emitting a
-     move insn to copy `virtual_stack_dynamic_rtx' to operand 0.  If
-     you are allocating the space elsewhere, generate code to copy the
-     location of the space to operand 0.  In the latter case, you must
-     ensure this space gets freed when the correspoinding space on the
-     main stack is free.
-
-     Do not define this pattern if all that must be done is the
-     subtraction.  Some machines require other operations such as stack
-     probes or maintaining the back chain.  Define this pattern to emit
-     those operations in addition to updating the stack pointer.
-
-`probe'
-     Some machines require instructions to be executed after space is
-     allocated from the stack, for example to generate a reference at
-     the bottom of the stack.
-
-     If you need to emit instructions before the stack has been
-     adjusted, put them into the `allocate_stack' pattern.  Otherwise,
-     define this pattern to emit the required instructions.
-
-     No operands are provided.
-
-`check_stack'
-     If stack checking cannot be done on your system by probing the
-     stack with a load or store instruction (*note Stack Checking::.),
-     define this pattern to perform the needed check and signaling an
-     error if the stack has overflowed.  The single operand is the
-     location in the stack furthest from the current stack pointer that
-     you need to validate.  Normally, on machines where this pattern is
-     needed, you would obtain the stack limit from a global or
-     thread-specific variable or register.
-
-`nonlocal_goto'
-     Emit code to generate a non-local goto, e.g., a jump from one
-     function to a label in an outer function.  This pattern has four
-     arguments, each representing a value to be used in the jump.  The
-     first argument is to be loadedd into the frame pointer, the second
-     is the address to branch to (code to dispatch to the actual label),
-     the third is the address of a location where the stack is saved,
-     and the last is the address of the label, to be placed in the
-     location for the incoming static chain.
-
-     On most machines you need not define this pattern, since GNU CC
-     will already generate the correct code, which is to load the frame
-     pointer and static chain, restore the stack (using the
-     `restore_stack_nonlocal' pattern, if defined), and jump indirectly
-     to the dispatcher.  You need only define this pattern if this code
-     will not work on your machine.
-
-`nonlocal_goto_receiver'
-     This pattern, if defined, contains code needed at the target of a
-     nonlocal goto after the code already generated by GNU CC.  You
-     will not normally need to define this pattern.  A typical reason
-     why you might need this pattern is if some value, such as a
-     pointer to a global table, must be restored when the frame pointer
-     is restored.  There are no arguments.
-
-`exception_receiver'
-     This pattern, if defined, contains code needed at the site of an
-     exception handler that isn't needed at the site of a nonlocal
-     goto.  You will not normally need to define this pattern.  A
-     typical reason why you might need this pattern is if some value,
-     such as a pointer to a global table, must be restored after
-     control flow is branched to the handler of an exception.  There
-     are no arguments.
-
-\1f
-File: gcc.info,  Node: Pattern Ordering,  Next: Dependent Patterns,  Prev: Standard Names,  Up: Machine Desc
-
-When the Order of Patterns Matters
-==================================
-
-   Sometimes an insn can match more than one instruction pattern.  Then
-the pattern that appears first in the machine description is the one
-used.  Therefore, more specific patterns (patterns that will match
-fewer things) and faster instructions (those that will produce better
-code when they do match) should usually go first in the description.
-
-   In some cases the effect of ordering the patterns can be used to hide
-a pattern when it is not valid.  For example, the 68000 has an
-instruction for converting a fullword to floating point and another for
-converting a byte to floating point.  An instruction converting an
-integer to floating point could match either one.  We put the pattern
-to convert the fullword first to make sure that one will be used rather
-than the other.  (Otherwise a large integer might be generated as a
-single-byte immediate quantity, which would not work.)  Instead of
-using this pattern ordering it would be possible to make the pattern
-for convert-a-byte smart enough to deal properly with any constant
-value.
-
-\1f
-File: gcc.info,  Node: Dependent Patterns,  Next: Jump Patterns,  Prev: Pattern Ordering,  Up: Machine Desc
-
-Interdependence of Patterns
-===========================
-
-   Every machine description must have a named pattern for each of the
-conditional branch names `bCOND'.  The recognition template must always
-have the form
-
-     (set (pc)
-          (if_then_else (COND (cc0) (const_int 0))
-                        (label_ref (match_operand 0 "" ""))
-                        (pc)))
-
-In addition, every machine description must have an anonymous pattern
-for each of the possible reverse-conditional branches.  Their templates
-look like
-
-     (set (pc)
-          (if_then_else (COND (cc0) (const_int 0))
-                        (pc)
-                        (label_ref (match_operand 0 "" ""))))
-
-They are necessary because jump optimization can turn direct-conditional
-branches into reverse-conditional branches.
-
-   It is often convenient to use the `match_operator' construct to
-reduce the number of patterns that must be specified for branches.  For
-example,
-
-     (define_insn ""
-       [(set (pc)
-             (if_then_else (match_operator 0 "comparison_operator"
-                                           [(cc0) (const_int 0)])
-                           (pc)
-                           (label_ref (match_operand 1 "" ""))))]
-       "CONDITION"
-       "...")
-
-   In some cases machines support instructions identical except for the
-machine mode of one or more operands.  For example, there may be
-"sign-extend halfword" and "sign-extend byte" instructions whose
-patterns are
-
-     (set (match_operand:SI 0 ...)
-          (extend:SI (match_operand:HI 1 ...)))
-     
-     (set (match_operand:SI 0 ...)
-          (extend:SI (match_operand:QI 1 ...)))
-
-Constant integers do not specify a machine mode, so an instruction to
-extend a constant value could match either pattern.  The pattern it
-actually will match is the one that appears first in the file.  For
-correct results, this must be the one for the widest possible mode
-(`HImode', here).  If the pattern matches the `QImode' instruction, the
-results will be incorrect if the constant value does not actually fit
-that mode.
-
-   Such instructions to extend constants are rarely generated because
-they are optimized away, but they do occasionally happen in nonoptimized
-compilations.
-
-   If a constraint in a pattern allows a constant, the reload pass may
-replace a register with a constant permitted by the constraint in some
-cases.  Similarly for memory references.  Because of this substitution,
-you should not provide separate patterns for increment and decrement
-instructions.  Instead, they should be generated from the same pattern
-that supports register-register add insns by examining the operands and
-generating the appropriate machine instruction.
-
-\1f
-File: gcc.info,  Node: Jump Patterns,  Next: Insn Canonicalizations,  Prev: Dependent Patterns,  Up: Machine Desc
-
-Defining Jump Instruction Patterns
-==================================
-
-   For most machines, GNU CC assumes that the machine has a condition
-code.  A comparison insn sets the condition code, recording the results
-of both signed and unsigned comparison of the given operands.  A
-separate branch insn tests the condition code and branches or not
-according its value.  The branch insns come in distinct signed and
-unsigned flavors.  Many common machines, such as the Vax, the 68000 and
-the 32000, work this way.
-
-   Some machines have distinct signed and unsigned compare
-instructions, and only one set of conditional branch instructions.  The
-easiest way to handle these machines is to treat them just like the
-others until the final stage where assembly code is written.  At this
-time, when outputting code for the compare instruction, peek ahead at
-the following branch using `next_cc0_user (insn)'.  (The variable
-`insn' refers to the insn being output, in the output-writing code in
-an instruction pattern.)  If the RTL says that is an unsigned branch,
-output an unsigned compare; otherwise output a signed compare.  When
-the branch itself is output, you can treat signed and unsigned branches
-identically.
-
-   The reason you can do this is that GNU CC always generates a pair of
-consecutive RTL insns, possibly separated by `note' insns, one to set
-the condition code and one to test it, and keeps the pair inviolate
-until the end.
-
-   To go with this technique, you must define the machine-description
-macro `NOTICE_UPDATE_CC' to do `CC_STATUS_INIT'; in other words, no
-compare instruction is superfluous.
-
-   Some machines have compare-and-branch instructions and no condition
-code.  A similar technique works for them.  When it is time to "output"
-a compare instruction, record its operands in two static variables.
-When outputting the branch-on-condition-code instruction that follows,
-actually output a compare-and-branch instruction that uses the
-remembered operands.
-
-   It also works to define patterns for compare-and-branch instructions.
-In optimizing compilation, the pair of compare and branch instructions
-will be combined according to these patterns.  But this does not happen
-if optimization is not requested.  So you must use one of the solutions
-above in addition to any special patterns you define.
-
-   In many RISC machines, most instructions do not affect the condition
-code and there may not even be a separate condition code register.  On
-these machines, the restriction that the definition and use of the
-condition code be adjacent insns is not necessary and can prevent
-important optimizations.  For example, on the IBM RS/6000, there is a
-delay for taken branches unless the condition code register is set three
-instructions earlier than the conditional branch.  The instruction
-scheduler cannot perform this optimization if it is not permitted to
-separate the definition and use of the condition code register.
-
-   On these machines, do not use `(cc0)', but instead use a register to
-represent the condition code.  If there is a specific condition code
-register in the machine, use a hard register.  If the condition code or
-comparison result can be placed in any general register, or if there are
-multiple condition registers, use a pseudo register.
-
-   On some machines, the type of branch instruction generated may
-depend on the way the condition code was produced; for example, on the
-68k and Sparc, setting the condition code directly from an add or
-subtract instruction does not clear the overflow bit the way that a test
-instruction does, so a different branch instruction must be used for
-some conditional branches.  For machines that use `(cc0)', the set and
-use of the condition code must be adjacent (separated only by `note'
-insns) allowing flags in `cc_status' to be used.  (*Note Condition
-Code::.)  Also, the comparison and branch insns can be located from
-each other by using the functions `prev_cc0_setter' and `next_cc0_user'.
-
-   However, this is not true on machines that do not use `(cc0)'.  On
-those machines, no assumptions can be made about the adjacency of the
-compare and branch insns and the above methods cannot be used.  Instead,
-we use the machine mode of the condition code register to record
-different formats of the condition code register.
-
-   Registers used to store the condition code value should have a mode
-that is in class `MODE_CC'.  Normally, it will be `CCmode'.  If
-additional modes are required (as for the add example mentioned above in
-the Sparc), define the macro `EXTRA_CC_MODES' to list the additional
-modes required (*note Condition Code::.).  Also define `EXTRA_CC_NAMES'
-to list the names of those modes and `SELECT_CC_MODE' to choose a mode
-given an operand of a compare.
-
-   If it is known during RTL generation that a different mode will be
-required (for example, if the machine has separate compare instructions
-for signed and unsigned quantities, like most IBM processors), they can
-be specified at that time.
-
-   If the cases that require different modes would be made by
-instruction combination, the macro `SELECT_CC_MODE' determines which
-machine mode should be used for the comparison result.  The patterns
-should be written using that mode.  To support the case of the add on
-the Sparc discussed above, we have the pattern
-
-     (define_insn ""
-       [(set (reg:CC_NOOV 0)
-             (compare:CC_NOOV
-               (plus:SI (match_operand:SI 0 "register_operand" "%r")
-                        (match_operand:SI 1 "arith_operand" "rI"))
-               (const_int 0)))]
-       ""
-       "...")
-
-   The `SELECT_CC_MODE' macro on the Sparc returns `CC_NOOVmode' for
-comparisons whose argument is a `plus'.
-
-\1f
-File: gcc.info,  Node: Insn Canonicalizations,  Next: Peephole Definitions,  Prev: Jump Patterns,  Up: Machine Desc
-
-Canonicalization of Instructions
-================================
-
-   There are often cases where multiple RTL expressions could represent
-an operation performed by a single machine instruction.  This situation
-is most commonly encountered with logical, branch, and
-multiply-accumulate instructions.  In such cases, the compiler attempts
-to convert these multiple RTL expressions into a single canonical form
-to reduce the number of insn patterns required.
-
-   In addition to algebraic simplifications, following canonicalizations
-are performed:
-
-   * For commutative and comparison operators, a constant is always
-     made the second operand.  If a machine only supports a constant as
-     the second operand, only patterns that match a constant in the
-     second operand need be supplied.
-
-     For these operators, if only one operand is a `neg', `not',
-     `mult', `plus', or `minus' expression, it will be the first
-     operand.
-
-   * For the `compare' operator, a constant is always the second operand
-     on machines where `cc0' is used (*note Jump Patterns::.).  On other
-     machines, there are rare cases where the compiler might want to
-     construct a `compare' with a constant as the first operand.
-     However, these cases are not common enough for it to be worthwhile
-     to provide a pattern matching a constant as the first operand
-     unless the machine actually has such an instruction.
-
-     An operand of `neg', `not', `mult', `plus', or `minus' is made the
-     first operand under the same conditions as above.
-
-   * `(minus X (const_int N))' is converted to `(plus X (const_int
-     -N))'.
-
-   * Within address computations (i.e., inside `mem'), a left shift is
-     converted into the appropriate multiplication by a power of two.
-
-     De`Morgan's Law is used to move bitwise negation inside a bitwise
-     logical-and or logical-or operation.  If this results in only one
-     operand being a `not' expression, it will be the first one.
-
-     A machine that has an instruction that performs a bitwise
-     logical-and of one operand with the bitwise negation of the other
-     should specify the pattern for that instruction as
-
-          (define_insn ""
-            [(set (match_operand:M 0 ...)
-                  (and:M (not:M (match_operand:M 1 ...))
-                               (match_operand:M 2 ...)))]
-            "..."
-            "...")
-
-     Similarly, a pattern for a "NAND" instruction should be written
-
-          (define_insn ""
-            [(set (match_operand:M 0 ...)
-                  (ior:M (not:M (match_operand:M 1 ...))
-                               (not:M (match_operand:M 2 ...))))]
-            "..."
-            "...")
-
-     In both cases, it is not necessary to include patterns for the many
-     logically equivalent RTL expressions.
-
-   * The only possible RTL expressions involving both bitwise
-     exclusive-or and bitwise negation are `(xor:M X Y)' and `(not:M
-     (xor:M X Y))'.
-
-   * The sum of three items, one of which is a constant, will only
-     appear in the form
-
-          (plus:M (plus:M X Y) CONSTANT)
-
-   * On machines that do not use `cc0', `(compare X (const_int 0))'
-     will be converted to X.
-
-   * Equality comparisons of a group of bits (usually a single bit)
-     with zero will be written using `zero_extract' rather than the
-     equivalent `and' or `sign_extract' operations.
-
diff --git a/gcc/gcc.info-19 b/gcc/gcc.info-19
deleted file mode 100644 (file)
index 3ba2b75..0000000
+++ /dev/null
@@ -1,1072 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Peephole Definitions,  Next: Expander Definitions,  Prev: Insn Canonicalizations,  Up: Machine Desc
-
-Machine-Specific Peephole Optimizers
-====================================
-
-   In addition to instruction patterns the `md' file may contain
-definitions of machine-specific peephole optimizations.
-
-   The combiner does not notice certain peephole optimizations when the
-data flow in the program does not suggest that it should try them.  For
-example, sometimes two consecutive insns related in purpose can be
-combined even though the second one does not appear to use a register
-computed in the first one.  A machine-specific peephole optimizer can
-detect such opportunities.
-
-   A definition looks like this:
-
-     (define_peephole
-       [INSN-PATTERN-1
-        INSN-PATTERN-2
-        ...]
-       "CONDITION"
-       "TEMPLATE"
-       "OPTIONAL INSN-ATTRIBUTES")
-
-The last string operand may be omitted if you are not using any
-machine-specific information in this machine description.  If present,
-it must obey the same rules as in a `define_insn'.
-
-   In this skeleton, INSN-PATTERN-1 and so on are patterns to match
-consecutive insns.  The optimization applies to a sequence of insns when
-INSN-PATTERN-1 matches the first one, INSN-PATTERN-2 matches the next,
-and so on.
-
-   Each of the insns matched by a peephole must also match a
-`define_insn'.  Peepholes are checked only at the last stage just
-before code generation, and only optionally.  Therefore, any insn which
-would match a peephole but no `define_insn' will cause a crash in code
-generation in an unoptimized compilation, or at various optimization
-stages.
-
-   The operands of the insns are matched with `match_operands',
-`match_operator', and `match_dup', as usual.  What is not usual is that
-the operand numbers apply to all the insn patterns in the definition.
-So, you can check for identical operands in two insns by using
-`match_operand' in one insn and `match_dup' in the other.
-
-   The operand constraints used in `match_operand' patterns do not have
-any direct effect on the applicability of the peephole, but they will
-be validated afterward, so make sure your constraints are general enough
-to apply whenever the peephole matches.  If the peephole matches but
-the constraints are not satisfied, the compiler will crash.
-
-   It is safe to omit constraints in all the operands of the peephole;
-or you can write constraints which serve as a double-check on the
-criteria previously tested.
-
-   Once a sequence of insns matches the patterns, the CONDITION is
-checked.  This is a C expression which makes the final decision whether
-to perform the optimization (we do so if the expression is nonzero).  If
-CONDITION is omitted (in other words, the string is empty) then the
-optimization is applied to every sequence of insns that matches the
-patterns.
-
-   The defined peephole optimizations are applied after register
-allocation is complete.  Therefore, the peephole definition can check
-which operands have ended up in which kinds of registers, just by
-looking at the operands.
-
-   The way to refer to the operands in CONDITION is to write
-`operands[I]' for operand number I (as matched by `(match_operand I
-...)').  Use the variable `insn' to refer to the last of the insns
-being matched; use `prev_active_insn' to find the preceding insns.
-
-   When optimizing computations with intermediate results, you can use
-CONDITION to match only when the intermediate results are not used
-elsewhere.  Use the C expression `dead_or_set_p (INSN, OP)', where INSN
-is the insn in which you expect the value to be used for the last time
-(from the value of `insn', together with use of `prev_nonnote_insn'),
-and OP is the intermediate value (from `operands[I]').
-
-   Applying the optimization means replacing the sequence of insns with
-one new insn.  The TEMPLATE controls ultimate output of assembler code
-for this combined insn.  It works exactly like the template of a
-`define_insn'.  Operand numbers in this template are the same ones used
-in matching the original sequence of insns.
-
-   The result of a defined peephole optimizer does not need to match
-any of the insn patterns in the machine description; it does not even
-have an opportunity to match them.  The peephole optimizer definition
-itself serves as the insn pattern to control how the insn is output.
-
-   Defined peephole optimizers are run as assembler code is being
-output, so the insns they produce are never combined or rearranged in
-any way.
-
-   Here is an example, taken from the 68000 machine description:
-
-     (define_peephole
-       [(set (reg:SI 15) (plus:SI (reg:SI 15) (const_int 4)))
-        (set (match_operand:DF 0 "register_operand" "=f")
-             (match_operand:DF 1 "register_operand" "ad"))]
-       "FP_REG_P (operands[0]) && ! FP_REG_P (operands[1])"
-       "*
-     {
-       rtx xoperands[2];
-       xoperands[1] = gen_rtx (REG, SImode, REGNO (operands[1]) + 1);
-     #ifdef MOTOROLA
-       output_asm_insn (\"move.l %1,(sp)\", xoperands);
-       output_asm_insn (\"move.l %1,-(sp)\", operands);
-       return \"fmove.d (sp)+,%0\";
-     #else
-       output_asm_insn (\"movel %1,sp@\", xoperands);
-       output_asm_insn (\"movel %1,sp@-\", operands);
-       return \"fmoved sp@+,%0\";
-     #endif
-     }
-     ")
-
-   The effect of this optimization is to change
-
-     jbsr _foobar
-     addql #4,sp
-     movel d1,sp@-
-     movel d0,sp@-
-     fmoved sp@+,fp0
-
-into
-
-     jbsr _foobar
-     movel d1,sp@
-     movel d0,sp@-
-     fmoved sp@+,fp0
-
-   INSN-PATTERN-1 and so on look *almost* like the second operand of
-`define_insn'.  There is one important difference: the second operand
-of `define_insn' consists of one or more RTX's enclosed in square
-brackets.  Usually, there is only one: then the same action can be
-written as an element of a `define_peephole'.  But when there are
-multiple actions in a `define_insn', they are implicitly enclosed in a
-`parallel'.  Then you must explicitly write the `parallel', and the
-square brackets within it, in the `define_peephole'.  Thus, if an insn
-pattern looks like this,
-
-     (define_insn "divmodsi4"
-       [(set (match_operand:SI 0 "general_operand" "=d")
-             (div:SI (match_operand:SI 1 "general_operand" "0")
-                     (match_operand:SI 2 "general_operand" "dmsK")))
-        (set (match_operand:SI 3 "general_operand" "=d")
-             (mod:SI (match_dup 1) (match_dup 2)))]
-       "TARGET_68020"
-       "divsl%.l %2,%3:%0")
-
-then the way to mention this insn in a peephole is as follows:
-
-     (define_peephole
-       [...
-        (parallel
-         [(set (match_operand:SI 0 "general_operand" "=d")
-               (div:SI (match_operand:SI 1 "general_operand" "0")
-                       (match_operand:SI 2 "general_operand" "dmsK")))
-          (set (match_operand:SI 3 "general_operand" "=d")
-               (mod:SI (match_dup 1) (match_dup 2)))])
-        ...]
-       ...)
-
-\1f
-File: gcc.info,  Node: Expander Definitions,  Next: Insn Splitting,  Prev: Peephole Definitions,  Up: Machine Desc
-
-Defining RTL Sequences for Code Generation
-==========================================
-
-   On some target machines, some standard pattern names for RTL
-generation cannot be handled with single insn, but a sequence of RTL
-insns can represent them.  For these target machines, you can write a
-`define_expand' to specify how to generate the sequence of RTL.
-
-   A `define_expand' is an RTL expression that looks almost like a
-`define_insn'; but, unlike the latter, a `define_expand' is used only
-for RTL generation and it can produce more than one RTL insn.
-
-   A `define_expand' RTX has four operands:
-
-   * The name.  Each `define_expand' must have a name, since the only
-     use for it is to refer to it by name.
-
-   * The RTL template.  This is just like the RTL template for a
-     `define_peephole' in that it is a vector of RTL expressions each
-     being one insn.
-
-   * The condition, a string containing a C expression.  This
-     expression is used to express how the availability of this pattern
-     depends on subclasses of target machine, selected by command-line
-     options when GNU CC is run.  This is just like the condition of a
-     `define_insn' that has a standard name.  Therefore, the condition
-     (if present) may not depend on the data in the insn being matched,
-     but only the target-machine-type flags.  The compiler needs to
-     test these conditions during initialization in order to learn
-     exactly which named instructions are available in a particular run.
-
-   * The preparation statements, a string containing zero or more C
-     statements which are to be executed before RTL code is generated
-     from the RTL template.
-
-     Usually these statements prepare temporary registers for use as
-     internal operands in the RTL template, but they can also generate
-     RTL insns directly by calling routines such as `emit_insn', etc.
-     Any such insns precede the ones that come from the RTL template.
-
-   Every RTL insn emitted by a `define_expand' must match some
-`define_insn' in the machine description.  Otherwise, the compiler will
-crash when trying to generate code for the insn or trying to optimize
-it.
-
-   The RTL template, in addition to controlling generation of RTL insns,
-also describes the operands that need to be specified when this pattern
-is used.  In particular, it gives a predicate for each operand.
-
-   A true operand, which needs to be specified in order to generate RTL
-from the pattern, should be described with a `match_operand' in its
-first occurrence in the RTL template.  This enters information on the
-operand's predicate into the tables that record such things.  GNU CC
-uses the information to preload the operand into a register if that is
-required for valid RTL code.  If the operand is referred to more than
-once, subsequent references should use `match_dup'.
-
-   The RTL template may also refer to internal "operands" which are
-temporary registers or labels used only within the sequence made by the
-`define_expand'.  Internal operands are substituted into the RTL
-template with `match_dup', never with `match_operand'.  The values of
-the internal operands are not passed in as arguments by the compiler
-when it requests use of this pattern.  Instead, they are computed
-within the pattern, in the preparation statements.  These statements
-compute the values and store them into the appropriate elements of
-`operands' so that `match_dup' can find them.
-
-   There are two special macros defined for use in the preparation
-statements: `DONE' and `FAIL'.  Use them with a following semicolon, as
-a statement.
-
-`DONE'
-     Use the `DONE' macro to end RTL generation for the pattern.  The
-     only RTL insns resulting from the pattern on this occasion will be
-     those already emitted by explicit calls to `emit_insn' within the
-     preparation statements; the RTL template will not be generated.
-
-`FAIL'
-     Make the pattern fail on this occasion.  When a pattern fails, it
-     means that the pattern was not truly available.  The calling
-     routines in the compiler will try other strategies for code
-     generation using other patterns.
-
-     Failure is currently supported only for binary (addition,
-     multiplication, shifting, etc.) and bitfield (`extv', `extzv', and
-     `insv') operations.
-
-   Here is an example, the definition of left-shift for the SPUR chip:
-
-     (define_expand "ashlsi3"
-       [(set (match_operand:SI 0 "register_operand" "")
-             (ashift:SI
-
-     (match_operand:SI 1 "register_operand" "")
-               (match_operand:SI 2 "nonmemory_operand" "")))]
-       ""
-       "
-
-     {
-       if (GET_CODE (operands[2]) != CONST_INT
-           || (unsigned) INTVAL (operands[2]) > 3)
-         FAIL;
-     }")
-
-This example uses `define_expand' so that it can generate an RTL insn
-for shifting when the shift-count is in the supported range of 0 to 3
-but fail in other cases where machine insns aren't available.  When it
-fails, the compiler tries another strategy using different patterns
-(such as, a library call).
-
-   If the compiler were able to handle nontrivial condition-strings in
-patterns with names, then it would be possible to use a `define_insn'
-in that case.  Here is another case (zero-extension on the 68000) which
-makes more use of the power of `define_expand':
-
-     (define_expand "zero_extendhisi2"
-       [(set (match_operand:SI 0 "general_operand" "")
-             (const_int 0))
-        (set (strict_low_part
-               (subreg:HI
-                 (match_dup 0)
-                 0))
-             (match_operand:HI 1 "general_operand" ""))]
-       ""
-       "operands[1] = make_safe_from (operands[1], operands[0]);")
-
-Here two RTL insns are generated, one to clear the entire output operand
-and the other to copy the input operand into its low half.  This
-sequence is incorrect if the input operand refers to [the old value of]
-the output operand, so the preparation statement makes sure this isn't
-so.  The function `make_safe_from' copies the `operands[1]' into a
-temporary register if it refers to `operands[0]'.  It does this by
-emitting another RTL insn.
-
-   Finally, a third example shows the use of an internal operand.
-Zero-extension on the SPUR chip is done by `and'-ing the result against
-a halfword mask.  But this mask cannot be represented by a `const_int'
-because the constant value is too large to be legitimate on this
-machine.  So it must be copied into a register with `force_reg' and
-then the register used in the `and'.
-
-     (define_expand "zero_extendhisi2"
-       [(set (match_operand:SI 0 "register_operand" "")
-             (and:SI (subreg:SI
-                       (match_operand:HI 1 "register_operand" "")
-                       0)
-                     (match_dup 2)))]
-       ""
-       "operands[2]
-          = force_reg (SImode, gen_rtx (CONST_INT,
-                                        VOIDmode, 65535)); ")
-
-   *Note:* If the `define_expand' is used to serve a standard binary or
-unary arithmetic operation or a bitfield operation, then the last insn
-it generates must not be a `code_label', `barrier' or `note'.  It must
-be an `insn', `jump_insn' or `call_insn'.  If you don't need a real insn
-at the end, emit an insn to copy the result of the operation into
-itself.  Such an insn will generate no code, but it can avoid problems
-in the compiler.
-
-\1f
-File: gcc.info,  Node: Insn Splitting,  Next: Insn Attributes,  Prev: Expander Definitions,  Up: Machine Desc
-
-Defining How to Split Instructions
-==================================
-
-   There are two cases where you should specify how to split a pattern
-into multiple insns.  On machines that have instructions requiring delay
-slots (*note Delay Slots::.) or that have instructions whose output is
-not available for multiple cycles (*note Function Units::.), the
-compiler phases that optimize these cases need to be able to move insns
-into one-instruction delay slots.  However, some insns may generate
-more than one machine instruction.  These insns cannot be placed into a
-delay slot.
-
-   Often you can rewrite the single insn as a list of individual insns,
-each corresponding to one machine instruction.  The disadvantage of
-doing so is that it will cause the compilation to be slower and require
-more space.  If the resulting insns are too complex, it may also
-suppress some optimizations.  The compiler splits the insn if there is a
-reason to believe that it might improve instruction or delay slot
-scheduling.
-
-   The insn combiner phase also splits putative insns.  If three insns
-are merged into one insn with a complex expression that cannot be
-matched by some `define_insn' pattern, the combiner phase attempts to
-split the complex pattern into two insns that are recognized.  Usually
-it can break the complex pattern into two patterns by splitting out some
-subexpression.  However, in some other cases, such as performing an
-addition of a large constant in two insns on a RISC machine, the way to
-split the addition into two insns is machine-dependent.
-
-   The `define_split' definition tells the compiler how to split a
-complex insn into several simpler insns.  It looks like this:
-
-     (define_split
-       [INSN-PATTERN]
-       "CONDITION"
-       [NEW-INSN-PATTERN-1
-        NEW-INSN-PATTERN-2
-        ...]
-       "PREPARATION STATEMENTS")
-
-   INSN-PATTERN is a pattern that needs to be split and CONDITION is
-the final condition to be tested, as in a `define_insn'.  When an insn
-matching INSN-PATTERN and satisfying CONDITION is found, it is replaced
-in the insn list with the insns given by NEW-INSN-PATTERN-1,
-NEW-INSN-PATTERN-2, etc.
-
-   The PREPARATION STATEMENTS are similar to those statements that are
-specified for `define_expand' (*note Expander Definitions::.)  and are
-executed before the new RTL is generated to prepare for the generated
-code or emit some insns whose pattern is not fixed.  Unlike those in
-`define_expand', however, these statements must not generate any new
-pseudo-registers.  Once reload has completed, they also must not
-allocate any space in the stack frame.
-
-   Patterns are matched against INSN-PATTERN in two different
-circumstances.  If an insn needs to be split for delay slot scheduling
-or insn scheduling, the insn is already known to be valid, which means
-that it must have been matched by some `define_insn' and, if
-`reload_completed' is non-zero, is known to satisfy the constraints of
-that `define_insn'.  In that case, the new insn patterns must also be
-insns that are matched by some `define_insn' and, if `reload_completed'
-is non-zero, must also satisfy the constraints of those definitions.
-
-   As an example of this usage of `define_split', consider the following
-example from `a29k.md', which splits a `sign_extend' from `HImode' to
-`SImode' into a pair of shift insns:
-
-     (define_split
-       [(set (match_operand:SI 0 "gen_reg_operand" "")
-             (sign_extend:SI (match_operand:HI 1 "gen_reg_operand" "")))]
-       ""
-       [(set (match_dup 0)
-             (ashift:SI (match_dup 1)
-                        (const_int 16)))
-        (set (match_dup 0)
-             (ashiftrt:SI (match_dup 0)
-                          (const_int 16)))]
-       "
-     { operands[1] = gen_lowpart (SImode, operands[1]); }")
-
-   When the combiner phase tries to split an insn pattern, it is always
-the case that the pattern is *not* matched by any `define_insn'.  The
-combiner pass first tries to split a single `set' expression and then
-the same `set' expression inside a `parallel', but followed by a
-`clobber' of a pseudo-reg to use as a scratch register.  In these
-cases, the combiner expects exactly two new insn patterns to be
-generated.  It will verify that these patterns match some `define_insn'
-definitions, so you need not do this test in the `define_split' (of
-course, there is no point in writing a `define_split' that will never
-produce insns that match).
-
-   Here is an example of this use of `define_split', taken from
-`rs6000.md':
-
-     (define_split
-       [(set (match_operand:SI 0 "gen_reg_operand" "")
-             (plus:SI (match_operand:SI 1 "gen_reg_operand" "")
-                      (match_operand:SI 2 "non_add_cint_operand" "")))]
-       ""
-       [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 3)))
-        (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 4)))]
-     "
-     {
-       int low = INTVAL (operands[2]) & 0xffff;
-       int high = (unsigned) INTVAL (operands[2]) >> 16;
-     
-       if (low & 0x8000)
-         high++, low |= 0xffff0000;
-     
-       operands[3] = gen_rtx (CONST_INT, VOIDmode, high << 16);
-       operands[4] = gen_rtx (CONST_INT, VOIDmode, low);
-     }")
-
-   Here the predicate `non_add_cint_operand' matches any `const_int'
-that is *not* a valid operand of a single add insn.  The add with the
-smaller displacement is written so that it can be substituted into the
-address of a subsequent operation.
-
-   An example that uses a scratch register, from the same file,
-generates an equality comparison of a register and a large constant:
-
-     (define_split
-       [(set (match_operand:CC 0 "cc_reg_operand" "")
-             (compare:CC (match_operand:SI 1 "gen_reg_operand" "")
-                         (match_operand:SI 2 "non_short_cint_operand" "")))
-        (clobber (match_operand:SI 3 "gen_reg_operand" ""))]
-       "find_single_use (operands[0], insn, 0)
-        && (GET_CODE (*find_single_use (operands[0], insn, 0)) == EQ
-            || GET_CODE (*find_single_use (operands[0], insn, 0)) == NE)"
-       [(set (match_dup 3) (xor:SI (match_dup 1) (match_dup 4)))
-        (set (match_dup 0) (compare:CC (match_dup 3) (match_dup 5)))]
-       "
-     {
-       /* Get the constant we are comparing against, C, and see what it
-          looks like sign-extended to 16 bits.  Then see what constant
-          could be XOR'ed with C to get the sign-extended value.  */
-     
-       int c = INTVAL (operands[2]);
-       int sextc = (c << 16) >> 16;
-       int xorv = c ^ sextc;
-     
-       operands[4] = gen_rtx (CONST_INT, VOIDmode, xorv);
-       operands[5] = gen_rtx (CONST_INT, VOIDmode, sextc);
-     }")
-
-   To avoid confusion, don't write a single `define_split' that accepts
-some insns that match some `define_insn' as well as some insns that
-don't.  Instead, write two separate `define_split' definitions, one for
-the insns that are valid and one for the insns that are not valid.
-
-\1f
-File: gcc.info,  Node: Insn Attributes,  Prev: Insn Splitting,  Up: Machine Desc
-
-Instruction Attributes
-======================
-
-   In addition to describing the instruction supported by the target
-machine, the `md' file also defines a group of "attributes" and a set of
-values for each.  Every generated insn is assigned a value for each
-attribute.  One possible attribute would be the effect that the insn
-has on the machine's condition code.  This attribute can then be used
-by `NOTICE_UPDATE_CC' to track the condition codes.
-
-* Menu:
-
-* Defining Attributes:: Specifying attributes and their values.
-* Expressions::         Valid expressions for attribute values.
-* Tagging Insns::       Assigning attribute values to insns.
-* Attr Example::        An example of assigning attributes.
-* Insn Lengths::        Computing the length of insns.
-* Constant Attributes:: Defining attributes that are constant.
-* Delay Slots::         Defining delay slots required for a machine.
-* Function Units::      Specifying information for insn scheduling.
-
-\1f
-File: gcc.info,  Node: Defining Attributes,  Next: Expressions,  Up: Insn Attributes
-
-Defining Attributes and their Values
-------------------------------------
-
-   The `define_attr' expression is used to define each attribute
-required by the target machine.  It looks like:
-
-     (define_attr NAME LIST-OF-VALUES DEFAULT)
-
-   NAME is a string specifying the name of the attribute being defined.
-
-   LIST-OF-VALUES is either a string that specifies a comma-separated
-list of values that can be assigned to the attribute, or a null string
-to indicate that the attribute takes numeric values.
-
-   DEFAULT is an attribute expression that gives the value of this
-attribute for insns that match patterns whose definition does not
-include an explicit value for this attribute.  *Note Attr Example::,
-for more information on the handling of defaults.  *Note Constant
-Attributes::, for information on attributes that do not depend on any
-particular insn.
-
-   For each defined attribute, a number of definitions are written to
-the `insn-attr.h' file.  For cases where an explicit set of values is
-specified for an attribute, the following are defined:
-
-   * A `#define' is written for the symbol `HAVE_ATTR_NAME'.
-
-   * An enumeral class is defined for `attr_NAME' with elements of the
-     form `UPPER-NAME_UPPER-VALUE' where the attribute name and value
-     are first converted to upper case.
-
-   * A function `get_attr_NAME' is defined that is passed an insn and
-     returns the attribute value for that insn.
-
-   For example, if the following is present in the `md' file:
-
-     (define_attr "type" "branch,fp,load,store,arith" ...)
-
-the following lines will be written to the file `insn-attr.h'.
-
-     #define HAVE_ATTR_type
-     enum attr_type {TYPE_BRANCH, TYPE_FP, TYPE_LOAD,
-                      TYPE_STORE, TYPE_ARITH};
-     extern enum attr_type get_attr_type ();
-
-   If the attribute takes numeric values, no `enum' type will be
-defined and the function to obtain the attribute's value will return
-`int'.
-
-\1f
-File: gcc.info,  Node: Expressions,  Next: Tagging Insns,  Prev: Defining Attributes,  Up: Insn Attributes
-
-Attribute Expressions
----------------------
-
-   RTL expressions used to define attributes use the codes described
-above plus a few specific to attribute definitions, to be discussed
-below.  Attribute value expressions must have one of the following
-forms:
-
-`(const_int I)'
-     The integer I specifies the value of a numeric attribute.  I must
-     be non-negative.
-
-     The value of a numeric attribute can be specified either with a
-     `const_int' or as an integer represented as a string in
-     `const_string', `eq_attr' (see below), and `set_attr' (*note
-     Tagging Insns::.) expressions.
-
-`(const_string VALUE)'
-     The string VALUE specifies a constant attribute value.  If VALUE
-     is specified as `"*"', it means that the default value of the
-     attribute is to be used for the insn containing this expression.
-     `"*"' obviously cannot be used in the DEFAULT expression of a
-     `define_attr'.
-
-     If the attribute whose value is being specified is numeric, VALUE
-     must be a string containing a non-negative integer (normally
-     `const_int' would be used in this case).  Otherwise, it must
-     contain one of the valid values for the attribute.
-
-`(if_then_else TEST TRUE-VALUE FALSE-VALUE)'
-     TEST specifies an attribute test, whose format is defined below.
-     The value of this expression is TRUE-VALUE if TEST is true,
-     otherwise it is FALSE-VALUE.
-
-`(cond [TEST1 VALUE1 ...] DEFAULT)'
-     The first operand of this expression is a vector containing an even
-     number of expressions and consisting of pairs of TEST and VALUE
-     expressions.  The value of the `cond' expression is that of the
-     VALUE corresponding to the first true TEST expression.  If none of
-     the TEST expressions are true, the value of the `cond' expression
-     is that of the DEFAULT expression.
-
-   TEST expressions can have one of the following forms:
-
-`(const_int I)'
-     This test is true if I is non-zero and false otherwise.
-
-`(not TEST)'
-`(ior TEST1 TEST2)'
-`(and TEST1 TEST2)'
-     These tests are true if the indicated logical function is true.
-
-`(match_operand:M N PRED CONSTRAINTS)'
-     This test is true if operand N of the insn whose attribute value
-     is being determined has mode M (this part of the test is ignored
-     if M is `VOIDmode') and the function specified by the string PRED
-     returns a non-zero value when passed operand N and mode M (this
-     part of the test is ignored if PRED is the null string).
-
-     The CONSTRAINTS operand is ignored and should be the null string.
-
-`(le ARITH1 ARITH2)'
-`(leu ARITH1 ARITH2)'
-`(lt ARITH1 ARITH2)'
-`(ltu ARITH1 ARITH2)'
-`(gt ARITH1 ARITH2)'
-`(gtu ARITH1 ARITH2)'
-`(ge ARITH1 ARITH2)'
-`(geu ARITH1 ARITH2)'
-`(ne ARITH1 ARITH2)'
-`(eq ARITH1 ARITH2)'
-     These tests are true if the indicated comparison of the two
-     arithmetic expressions is true.  Arithmetic expressions are formed
-     with `plus', `minus', `mult', `div', `mod', `abs', `neg', `and',
-     `ior', `xor', `not', `ashift', `lshiftrt', and `ashiftrt'
-     expressions.
-
-     `const_int' and `symbol_ref' are always valid terms (*note Insn
-     Lengths::.,for additional forms).  `symbol_ref' is a string
-     denoting a C expression that yields an `int' when evaluated by the
-     `get_attr_...' routine.  It should normally be a global variable.
-
-`(eq_attr NAME VALUE)'
-     NAME is a string specifying the name of an attribute.
-
-     VALUE is a string that is either a valid value for attribute NAME,
-     a comma-separated list of values, or `!' followed by a value or
-     list.  If VALUE does not begin with a `!', this test is true if
-     the value of the NAME attribute of the current insn is in the list
-     specified by VALUE.  If VALUE begins with a `!', this test is true
-     if the attribute's value is *not* in the specified list.
-
-     For example,
-
-          (eq_attr "type" "load,store")
-
-     is equivalent to
-
-          (ior (eq_attr "type" "load") (eq_attr "type" "store"))
-
-     If NAME specifies an attribute of `alternative', it refers to the
-     value of the compiler variable `which_alternative' (*note Output
-     Statement::.) and the values must be small integers.  For example,
-
-          (eq_attr "alternative" "2,3")
-
-     is equivalent to
-
-          (ior (eq (symbol_ref "which_alternative") (const_int 2))
-               (eq (symbol_ref "which_alternative") (const_int 3)))
-
-     Note that, for most attributes, an `eq_attr' test is simplified in
-     cases where the value of the attribute being tested is known for
-     all insns matching a particular pattern.  This is by far the most
-     common case.
-
-`(attr_flag NAME)'
-     The value of an `attr_flag' expression is true if the flag
-     specified by NAME is true for the `insn' currently being scheduled.
-
-     NAME is a string specifying one of a fixed set of flags to test.
-     Test the flags `forward' and `backward' to determine the direction
-     of a conditional branch.  Test the flags `very_likely', `likely',
-     `very_unlikely', and `unlikely' to determine if a conditional
-     branch is expected to be taken.
-
-     If the `very_likely' flag is true, then the `likely' flag is also
-     true.  Likewise for the `very_unlikely' and `unlikely' flags.
-
-     This example describes a conditional branch delay slot which can
-     be nullified for forward branches that are taken (annul-true) or
-     for backward branches which are not taken (annul-false).
-
-          (define_delay (eq_attr "type" "cbranch")
-            [(eq_attr "in_branch_delay" "true")
-             (and (eq_attr "in_branch_delay" "true")
-                  (attr_flag "forward"))
-             (and (eq_attr "in_branch_delay" "true")
-                  (attr_flag "backward"))])
-
-     The `forward' and `backward' flags are false if the current `insn'
-     being scheduled is not a conditional branch.
-
-     The `very_likely' and `likely' flags are true if the `insn' being
-     scheduled is not a conditional branch.  The `very_unlikely' and
-     `unlikely' flags are false if the `insn' being scheduled is not a
-     conditional branch.
-
-     `attr_flag' is only used during delay slot scheduling and has no
-     meaning to other passes of the compiler.
-
-\1f
-File: gcc.info,  Node: Tagging Insns,  Next: Attr Example,  Prev: Expressions,  Up: Insn Attributes
-
-Assigning Attribute Values to Insns
------------------------------------
-
-   The value assigned to an attribute of an insn is primarily
-determined by which pattern is matched by that insn (or which
-`define_peephole' generated it).  Every `define_insn' and
-`define_peephole' can have an optional last argument to specify the
-values of attributes for matching insns.  The value of any attribute
-not specified in a particular insn is set to the default value for that
-attribute, as specified in its `define_attr'.  Extensive use of default
-values for attributes permits the specification of the values for only
-one or two attributes in the definition of most insn patterns, as seen
-in the example in the next section.
-
-   The optional last argument of `define_insn' and `define_peephole' is
-a vector of expressions, each of which defines the value for a single
-attribute.  The most general way of assigning an attribute's value is
-to use a `set' expression whose first operand is an `attr' expression
-giving the name of the attribute being set.  The second operand of the
-`set' is an attribute expression (*note Expressions::.) giving the
-value of the attribute.
-
-   When the attribute value depends on the `alternative' attribute
-(i.e., which is the applicable alternative in the constraint of the
-insn), the `set_attr_alternative' expression can be used.  It allows
-the specification of a vector of attribute expressions, one for each
-alternative.
-
-   When the generality of arbitrary attribute expressions is not
-required, the simpler `set_attr' expression can be used, which allows
-specifying a string giving either a single attribute value or a list of
-attribute values, one for each alternative.
-
-   The form of each of the above specifications is shown below.  In
-each case, NAME is a string specifying the attribute to be set.
-
-`(set_attr NAME VALUE-STRING)'
-     VALUE-STRING is either a string giving the desired attribute value,
-     or a string containing a comma-separated list giving the values for
-     succeeding alternatives.  The number of elements must match the
-     number of alternatives in the constraint of the insn pattern.
-
-     Note that it may be useful to specify `*' for some alternative, in
-     which case the attribute will assume its default value for insns
-     matching that alternative.
-
-`(set_attr_alternative NAME [VALUE1 VALUE2 ...])'
-     Depending on the alternative of the insn, the value will be one of
-     the specified values.  This is a shorthand for using a `cond' with
-     tests on the `alternative' attribute.
-
-`(set (attr NAME) VALUE)'
-     The first operand of this `set' must be the special RTL expression
-     `attr', whose sole operand is a string giving the name of the
-     attribute being set.  VALUE is the value of the attribute.
-
-   The following shows three different ways of representing the same
-attribute value specification:
-
-     (set_attr "type" "load,store,arith")
-     
-     (set_attr_alternative "type"
-                           [(const_string "load") (const_string "store")
-                            (const_string "arith")])
-     
-     (set (attr "type")
-          (cond [(eq_attr "alternative" "1") (const_string "load")
-                 (eq_attr "alternative" "2") (const_string "store")]
-                (const_string "arith")))
-
-   The `define_asm_attributes' expression provides a mechanism to
-specify the attributes assigned to insns produced from an `asm'
-statement.  It has the form:
-
-     (define_asm_attributes [ATTR-SETS])
-
-where ATTR-SETS is specified the same as for both the `define_insn' and
-the `define_peephole' expressions.
-
-   These values will typically be the "worst case" attribute values.
-For example, they might indicate that the condition code will be
-clobbered.
-
-   A specification for a `length' attribute is handled specially.  The
-way to compute the length of an `asm' insn is to multiply the length
-specified in the expression `define_asm_attributes' by the number of
-machine instructions specified in the `asm' statement, determined by
-counting the number of semicolons and newlines in the string.
-Therefore, the value of the `length' attribute specified in a
-`define_asm_attributes' should be the maximum possible length of a
-single machine instruction.
-
-\1f
-File: gcc.info,  Node: Attr Example,  Next: Insn Lengths,  Prev: Tagging Insns,  Up: Insn Attributes
-
-Example of Attribute Specifications
------------------------------------
-
-   The judicious use of defaulting is important in the efficient use of
-insn attributes.  Typically, insns are divided into "types" and an
-attribute, customarily called `type', is used to represent this value.
-This attribute is normally used only to define the default value for
-other attributes.  An example will clarify this usage.
-
-   Assume we have a RISC machine with a condition code and in which only
-full-word operations are performed in registers.  Let us assume that we
-can divide all insns into loads, stores, (integer) arithmetic
-operations, floating point operations, and branches.
-
-   Here we will concern ourselves with determining the effect of an
-insn on the condition code and will limit ourselves to the following
-possible effects:  The condition code can be set unpredictably
-(clobbered), not be changed, be set to agree with the results of the
-operation, or only changed if the item previously set into the
-condition code has been modified.
-
-   Here is part of a sample `md' file for such a machine:
-
-     (define_attr "type" "load,store,arith,fp,branch" (const_string "arith"))
-     
-     (define_attr "cc" "clobber,unchanged,set,change0"
-                  (cond [(eq_attr "type" "load")
-                             (const_string "change0")
-                         (eq_attr "type" "store,branch")
-                             (const_string "unchanged")
-                         (eq_attr "type" "arith")
-                             (if_then_else (match_operand:SI 0 "" "")
-                                           (const_string "set")
-                                           (const_string "clobber"))]
-                        (const_string "clobber")))
-     
-     (define_insn ""
-       [(set (match_operand:SI 0 "general_operand" "=r,r,m")
-             (match_operand:SI 1 "general_operand" "r,m,r"))]
-       ""
-       "@
-        move %0,%1
-        load %0,%1
-        store %0,%1"
-       [(set_attr "type" "arith,load,store")])
-
-   Note that we assume in the above example that arithmetic operations
-performed on quantities smaller than a machine word clobber the
-condition code since they will set the condition code to a value
-corresponding to the full-word result.
-
-\1f
-File: gcc.info,  Node: Insn Lengths,  Next: Constant Attributes,  Prev: Attr Example,  Up: Insn Attributes
-
-Computing the Length of an Insn
--------------------------------
-
-   For many machines, multiple types of branch instructions are
-provided, each for different length branch displacements.  In most
-cases, the assembler will choose the correct instruction to use.
-However, when the assembler cannot do so, GCC can when a special
-attribute, the `length' attribute, is defined.  This attribute must be
-defined to have numeric values by specifying a null string in its
-`define_attr'.
-
-   In the case of the `length' attribute, two additional forms of
-arithmetic terms are allowed in test expressions:
-
-`(match_dup N)'
-     This refers to the address of operand N of the current insn, which
-     must be a `label_ref'.
-
-`(pc)'
-     This refers to the address of the *current* insn.  It might have
-     been more consistent with other usage to make this the address of
-     the *next* insn but this would be confusing because the length of
-     the current insn is to be computed.
-
-   For normal insns, the length will be determined by value of the
-`length' attribute.  In the case of `addr_vec' and `addr_diff_vec' insn
-patterns, the length is computed as the number of vectors multiplied by
-the size of each vector.
-
-   Lengths are measured in addressable storage units (bytes).
-
-   The following macros can be used to refine the length computation:
-
-`FIRST_INSN_ADDRESS'
-     When the `length' insn attribute is used, this macro specifies the
-     value to be assigned to the address of the first insn in a
-     function.  If not specified, 0 is used.
-
-`ADJUST_INSN_LENGTH (INSN, LENGTH)'
-     If defined, modifies the length assigned to instruction INSN as a
-     function of the context in which it is used.  LENGTH is an lvalue
-     that contains the initially computed length of the insn and should
-     be updated with the correct length of the insn.  If updating is
-     required, INSN must not be a varying-length insn.
-
-     This macro will normally not be required.  A case in which it is
-     required is the ROMP.  On this machine, the size of an `addr_vec'
-     insn must be increased by two to compensate for the fact that
-     alignment may be required.
-
-   The routine that returns `get_attr_length' (the value of the
-`length' attribute) can be used by the output routine to determine the
-form of the branch instruction to be written, as the example below
-illustrates.
-
-   As an example of the specification of variable-length branches,
-consider the IBM 360.  If we adopt the convention that a register will
-be set to the starting address of a function, we can jump to labels
-within 4k of the start using a four-byte instruction.  Otherwise, we
-need a six-byte sequence to load the address from memory and then
-branch to it.
-
-   On such a machine, a pattern for a branch instruction might be
-specified as follows:
-
-     (define_insn "jump"
-       [(set (pc)
-             (label_ref (match_operand 0 "" "")))]
-       ""
-       "*
-     {
-        return (get_attr_length (insn) == 4
-                ? \"b %l0\" : \"l r15,=a(%l0); br r15\");
-     }"
-       [(set (attr "length") (if_then_else (lt (match_dup 0) (const_int 4096))
-                                           (const_int 4)
-                                           (const_int 6)))])
-
-\1f
-File: gcc.info,  Node: Constant Attributes,  Next: Delay Slots,  Prev: Insn Lengths,  Up: Insn Attributes
-
-Constant Attributes
--------------------
-
-   A special form of `define_attr', where the expression for the
-default value is a `const' expression, indicates an attribute that is
-constant for a given run of the compiler.  Constant attributes may be
-used to specify which variety of processor is used.  For example,
-
-     (define_attr "cpu" "m88100,m88110,m88000"
-      (const
-       (cond [(symbol_ref "TARGET_88100") (const_string "m88100")
-              (symbol_ref "TARGET_88110") (const_string "m88110")]
-             (const_string "m88000"))))
-     
-     (define_attr "memory" "fast,slow"
-      (const
-       (if_then_else (symbol_ref "TARGET_FAST_MEM")
-                     (const_string "fast")
-                     (const_string "slow"))))
-
-   The routine generated for constant attributes has no parameters as it
-does not depend on any particular insn.  RTL expressions used to define
-the value of a constant attribute may use the `symbol_ref' form, but
-may not use either the `match_operand' form or `eq_attr' forms
-involving insn attributes.
-
-\1f
-File: gcc.info,  Node: Delay Slots,  Next: Function Units,  Prev: Constant Attributes,  Up: Insn Attributes
-
-Delay Slot Scheduling
----------------------
-
-   The insn attribute mechanism can be used to specify the requirements
-for delay slots, if any, on a target machine.  An instruction is said to
-require a "delay slot" if some instructions that are physically after
-the instruction are executed as if they were located before it.
-Classic examples are branch and call instructions, which often execute
-the following instruction before the branch or call is performed.
-
-   On some machines, conditional branch instructions can optionally
-"annul" instructions in the delay slot.  This means that the
-instruction will not be executed for certain branch outcomes.  Both
-instructions that annul if the branch is true and instructions that
-annul if the branch is false are supported.
-
-   Delay slot scheduling differs from instruction scheduling in that
-determining whether an instruction needs a delay slot is dependent only
-on the type of instruction being generated, not on data flow between the
-instructions.  See the next section for a discussion of data-dependent
-instruction scheduling.
-
-   The requirement of an insn needing one or more delay slots is
-indicated via the `define_delay' expression.  It has the following form:
-
-     (define_delay TEST
-                   [DELAY-1 ANNUL-TRUE-1 ANNUL-FALSE-1
-                    DELAY-2 ANNUL-TRUE-2 ANNUL-FALSE-2
-                    ...])
-
-   TEST is an attribute test that indicates whether this `define_delay'
-applies to a particular insn.  If so, the number of required delay
-slots is determined by the length of the vector specified as the second
-argument.  An insn placed in delay slot N must satisfy attribute test
-DELAY-N.  ANNUL-TRUE-N is an attribute test that specifies which insns
-may be annulled if the branch is true.  Similarly, ANNUL-FALSE-N
-specifies which insns in the delay slot may be annulled if the branch
-is false.  If annulling is not supported for that delay slot, `(nil)'
-should be coded.
-
-   For example, in the common case where branch and call insns require
-a single delay slot, which may contain any insn other than a branch or
-call, the following would be placed in the `md' file:
-
-     (define_delay (eq_attr "type" "branch,call")
-                   [(eq_attr "type" "!branch,call") (nil) (nil)])
-
-   Multiple `define_delay' expressions may be specified.  In this case,
-each such expression specifies different delay slot requirements and
-there must be no insn for which tests in two `define_delay' expressions
-are both true.
-
-   For example, if we have a machine that requires one delay slot for
-branches but two for calls,  no delay slot can contain a branch or call
-insn, and any valid insn in the delay slot for the branch can be
-annulled if the branch is true, we might represent this as follows:
-
-     (define_delay (eq_attr "type" "branch")
-        [(eq_attr "type" "!branch,call")
-         (eq_attr "type" "!branch,call")
-         (nil)])
-     
-     (define_delay (eq_attr "type" "call")
-                   [(eq_attr "type" "!branch,call") (nil) (nil)
-                    (eq_attr "type" "!branch,call") (nil) (nil)])
-
diff --git a/gcc/gcc.info-2 b/gcc/gcc.info-2
deleted file mode 100644 (file)
index 1e15a30..0000000
+++ /dev/null
@@ -1,1142 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Warning Options,  Next: Debugging Options,  Prev: C++ Dialect Options,  Up: Invoking GCC
-
-Options to Request or Suppress Warnings
-=======================================
-
-   Warnings are diagnostic messages that report constructions which are
-not inherently erroneous but which are risky or suggest there may have
-been an error.
-
-   You can request many specific warnings with options beginning `-W',
-for example `-Wimplicit' to request warnings on implicit declarations.
-Each of these specific warning options also has a negative form
-beginning `-Wno-' to turn off warnings; for example, `-Wno-implicit'.
-This manual lists only one of the two forms, whichever is not the
-default.
-
-   These options control the amount and kinds of warnings produced by
-GNU CC:
-
-`-fsyntax-only'
-     Check the code for syntax errors, but don't do anything beyond
-     that.
-
-`-pedantic'
-     Issue all the warnings demanded by strict ANSI standard C; reject
-     all programs that use forbidden extensions.
-
-     Valid ANSI standard C programs should compile properly with or
-     without this option (though a rare few will require `-ansi').
-     However, without this option, certain GNU extensions and
-     traditional C features are supported as well.  With this option,
-     they are rejected.
-
-     `-pedantic' does not cause warning messages for use of the
-     alternate keywords whose names begin and end with `__'.  Pedantic
-     warnings are also disabled in the expression that follows
-     `__extension__'.  However, only system header files should use
-     these escape routes; application programs should avoid them.
-     *Note Alternate Keywords::.
-
-     This option is not intended to be useful; it exists only to satisfy
-     pedants who would otherwise claim that GNU CC fails to support the
-     ANSI standard.
-
-     Some users try to use `-pedantic' to check programs for strict ANSI
-     C conformance.  They soon find that it does not do quite what they
-     want: it finds some non-ANSI practices, but not all--only those
-     for which ANSI C *requires* a diagnostic.
-
-     A feature to report any failure to conform to ANSI C might be
-     useful in some instances, but would require considerable
-     additional work and would be quite different from `-pedantic'.  We
-     recommend, rather, that users take advantage of the extensions of
-     GNU C and disregard the limitations of other compilers.  Aside
-     from certain supercomputers and obsolete small machines, there is
-     less and less reason ever to use any other C compiler other than
-     for bootstrapping GNU CC.
-
-`-pedantic-errors'
-     Like `-pedantic', except that errors are produced rather than
-     warnings.
-
-`-w'
-     Inhibit all warning messages.
-
-`-Wno-import'
-     Inhibit warning messages about the use of `#import'.
-
-`-Wchar-subscripts'
-     Warn if an array subscript has type `char'.  This is a common cause
-     of error, as programmers often forget that this type is signed on
-     some machines.
-
-`-Wcomment'
-     Warn whenever a comment-start sequence `/*' appears in a `/*'
-     comment, or whenever a Backslash-Newline appears in a `//' comment.
-
-`-Wformat'
-     Check calls to `printf' and `scanf', etc., to make sure that the
-     arguments supplied have types appropriate to the format string
-     specified.
-
-`-Wimplicit-int'
-     Warn when a declaration does not specify a type.
-
-`-Wimplicit-function-declarations'
-     Warn whenever a function is used before being declared.
-
-`-Wimplicit'
-     Same as `-Wimplicit-int' `-Wimplicit-function-declaration'.
-
-`-Wmain'
-     Warn if the type of `main' is suspicious.  `main' should be a
-     function with external linkage, returning int, taking either zero
-     arguments, two, or three arguments of appropriate types.
-
-`-Wparentheses'
-     Warn if parentheses are omitted in certain contexts, such as when
-     there is an assignment in a context where a truth value is
-     expected, or when operators are nested whose precedence people
-     often get confused about.
-
-     Also warn about constructions where there may be confusion to which
-     `if' statement an `else' branch belongs.  Here is an example of
-     such a case:
-
-          {
-            if (a)
-              if (b)
-                foo ();
-            else
-              bar ();
-          }
-
-     In C, every `else' branch belongs to the innermost possible `if'
-     statement, which in this example is `if (b)'.  This is often not
-     what the programmer expected, as illustrated in the above example
-     by indentation the programmer chose.  When there is the potential
-     for this confusion, GNU C will issue a warning when this flag is
-     specified.  To eliminate the warning, add explicit braces around
-     the innermost `if' statement so there is no way the `else' could
-     belong to the enclosing `if'.  The resulting code would look like
-     this:
-
-          {
-            if (a)
-              {
-                if (b)
-                  foo ();
-                else
-                  bar ();
-              }
-          }
-
-`-Wreturn-type'
-     Warn whenever a function is defined with a return-type that
-     defaults to `int'.  Also warn about any `return' statement with no
-     return-value in a function whose return-type is not `void'.
-
-`-Wswitch'
-     Warn whenever a `switch' statement has an index of enumeral type
-     and lacks a `case' for one or more of the named codes of that
-     enumeration.  (The presence of a `default' label prevents this
-     warning.)  `case' labels outside the enumeration range also
-     provoke warnings when this option is used.
-
-`-Wtrigraphs'
-     Warn if any trigraphs are encountered (assuming they are enabled).
-
-`-Wunused'
-     Warn whenever a variable is unused aside from its declaration,
-     whenever a function is declared static but never defined, whenever
-     a label is declared but not used, and whenever a statement
-     computes a result that is explicitly not used.
-
-     To suppress this warning for an expression, simply cast it to
-     void.  For unused variables and parameters, use the `unused'
-     attribute (*note Variable Attributes::.).
-
-`-Wuninitialized'
-     An automatic variable is used without first being initialized.
-
-     These warnings are possible only in optimizing compilation,
-     because they require data flow information that is computed only
-     when optimizing.  If you don't specify `-O', you simply won't get
-     these warnings.
-
-     These warnings occur only for variables that are candidates for
-     register allocation.  Therefore, they do not occur for a variable
-     that is declared `volatile', or whose address is taken, or whose
-     size is other than 1, 2, 4 or 8 bytes.  Also, they do not occur for
-     structures, unions or arrays, even when they are in registers.
-
-     Note that there may be no warning about a variable that is used
-     only to compute a value that itself is never used, because such
-     computations may be deleted by data flow analysis before the
-     warnings are printed.
-
-     These warnings are made optional because GNU CC is not smart
-     enough to see all the reasons why the code might be correct
-     despite appearing to have an error.  Here is one example of how
-     this can happen:
-
-          {
-            int x;
-            switch (y)
-              {
-              case 1: x = 1;
-                break;
-              case 2: x = 4;
-                break;
-              case 3: x = 5;
-              }
-            foo (x);
-          }
-
-     If the value of `y' is always 1, 2 or 3, then `x' is always
-     initialized, but GNU CC doesn't know this.  Here is another common
-     case:
-
-          {
-            int save_y;
-            if (change_y) save_y = y, y = new_y;
-            ...
-            if (change_y) y = save_y;
-          }
-
-     This has no bug because `save_y' is used only if it is set.
-
-     Some spurious warnings can be avoided if you declare all the
-     functions you use that never return as `noreturn'.  *Note Function
-     Attributes::.
-
-`-Wreorder (C++ only)'
-     Warn when the order of member initializers given in the code does
-     not match the order in which they must be executed.  For instance:
-
-          struct A {
-            int i;
-            int j;
-            A(): j (0), i (1) { }
-          };
-
-     Here the compiler will warn that the member initializers for `i'
-     and `j' will be rearranged to match the declaration order of the
-     members.
-
-`-Wtemplate-debugging'
-     When using templates in a C++ program, warn if debugging is not yet
-     fully available (C++ only).
-
-`-Wall'
-     All of the above `-W' options combined.  This enables all the
-     warnings about constructions that some users consider
-     questionable, and that are easy to avoid (or modify to prevent the
-     warning), even in conjunction with macros.
-
-   The following `-W...' options are not implied by `-Wall'.  Some of
-them warn about constructions that users generally do not consider
-questionable, but which occasionally you might wish to check for;
-others warn about constructions that are necessary or hard to avoid in
-some cases, and there is no simple way to modify the code to suppress
-the warning.
-
-`-W'
-     Print extra warning messages for these events:
-
-        * A nonvolatile automatic variable might be changed by a call to
-          `longjmp'.  These warnings as well are possible only in
-          optimizing compilation.
-
-          The compiler sees only the calls to `setjmp'.  It cannot know
-          where `longjmp' will be called; in fact, a signal handler
-          could call it at any point in the code.  As a result, you may
-          get a warning even when there is in fact no problem because
-          `longjmp' cannot in fact be called at the place which would
-          cause a problem.
-
-        * A function can return either with or without a value.
-          (Falling off the end of the function body is considered
-          returning without a value.)  For example, this function would
-          evoke such a warning:
-
-               foo (a)
-               {
-                 if (a > 0)
-                   return a;
-               }
-
-        * An expression-statement or the left-hand side of a comma
-          expression contains no side effects.  To suppress the
-          warning, cast the unused expression to void.  For example, an
-          expression such as `x[i,j]' will cause a warning, but
-          `x[(void)i,j]' will not.
-
-        * An unsigned value is compared against zero with `<' or `<='.
-
-        * A comparison like `x<=y<=z' appears; this is equivalent to
-          `(x<=y ? 1 : 0) <= z', which is a different interpretation
-          from that of ordinary mathematical notation.
-
-        * Storage-class specifiers like `static' are not the first
-          things in a declaration.  According to the C Standard, this
-          usage is obsolescent.
-
-        * If `-Wall' or `-Wunused' is also specified, warn about unused
-          arguments.
-
-        * A comparison between signed and unsigned values could produce
-          an incorrect result when the signed value is converted to
-          unsigned.  (But do not warn if `-Wno-sign-compare' is also
-          specified.)
-
-        * An aggregate has a partly bracketed initializer.  For
-          example, the following code would evoke such a warning,
-          because braces are missing around the initializer for `x.h':
-
-               struct s { int f, g; };
-               struct t { struct s h; int i; };
-               struct t x = { 1, 2, 3 };
-
-`-Wtraditional'
-     Warn about certain constructs that behave differently in
-     traditional and ANSI C.
-
-        * Macro arguments occurring within string constants in the
-          macro body.  These would substitute the argument in
-          traditional C, but are part of the constant in ANSI C.
-
-        * A function declared external in one block and then used after
-          the end of the block.
-
-        * A `switch' statement has an operand of type `long'.
-
-`-Wundef'
-     Warn if an undefined identifier is evaluated in an `#if' directive.
-
-`-Wshadow'
-     Warn whenever a local variable shadows another local variable.
-
-`-Wid-clash-LEN'
-     Warn whenever two distinct identifiers match in the first LEN
-     characters.  This may help you prepare a program that will compile
-     with certain obsolete, brain-damaged compilers.
-
-`-Wlarger-than-LEN'
-     Warn whenever an object of larger than LEN bytes is defined.
-
-`-Wpointer-arith'
-     Warn about anything that depends on the "size of" a function type
-     or of `void'.  GNU C assigns these types a size of 1, for
-     convenience in calculations with `void *' pointers and pointers to
-     functions.
-
-`-Wbad-function-cast'
-     Warn whenever a function call is cast to a non-matching type.  For
-     example, warn if `int malloc()' is cast to `anything *'.
-
-`-Wcast-qual'
-     Warn whenever a pointer is cast so as to remove a type qualifier
-     from the target type.  For example, warn if a `const char *' is
-     cast to an ordinary `char *'.
-
-`-Wcast-align'
-     Warn whenever a pointer is cast such that the required alignment
-     of the target is increased.  For example, warn if a `char *' is
-     cast to an `int *' on machines where integers can only be accessed
-     at two- or four-byte boundaries.
-
-`-Wwrite-strings'
-     Give string constants the type `const char[LENGTH]' so that
-     copying the address of one into a non-`const' `char *' pointer
-     will get a warning.  These warnings will help you find at compile
-     time code that can try to write into a string constant, but only
-     if you have been very careful about using `const' in declarations
-     and prototypes.  Otherwise, it will just be a nuisance; this is
-     why we did not make `-Wall' request these warnings.
-
-`-Wconversion'
-     Warn if a prototype causes a type conversion that is different
-     from what would happen to the same argument in the absence of a
-     prototype.  This includes conversions of fixed point to floating
-     and vice versa, and conversions changing the width or signedness
-     of a fixed point argument except when the same as the default
-     promotion.
-
-     Also, warn if a negative integer constant expression is implicitly
-     converted to an unsigned type.  For example, warn about the
-     assignment `x = -1' if `x' is unsigned.  But do not warn about
-     explicit casts like `(unsigned) -1'.
-
-`-Wsign-compare'
-     Warn when a comparison between signed and unsigned values could
-     produce an incorrect result when the signed value is converted to
-     unsigned.  This warning is also enabled by `-W'; to get the other
-     warnings of `-W' without this warning, use `-W -Wno-sign-compare'.
-
-`-Waggregate-return'
-     Warn if any functions that return structures or unions are defined
-     or called.  (In languages where you can return an array, this also
-     elicits a warning.)
-
-`-Wstrict-prototypes'
-     Warn if a function is declared or defined without specifying the
-     argument types.  (An old-style function definition is permitted
-     without a warning if preceded by a declaration which specifies the
-     argument types.)
-
-`-Wmissing-prototypes'
-     Warn if a global function is defined without a previous prototype
-     declaration.  This warning is issued even if the definition itself
-     provides a prototype.  The aim is to detect global functions that
-     fail to be declared in header files.
-
-`-Wmissing-declarations'
-     Warn if a global function is defined without a previous
-     declaration.  Do so even if the definition itself provides a
-     prototype.  Use this option to detect global functions that are
-     not declared in header files.
-
-`-Wredundant-decls'
-     Warn if anything is declared more than once in the same scope,
-     even in cases where multiple declaration is valid and changes
-     nothing.
-
-`-Wnested-externs'
-     Warn if an `extern' declaration is encountered within an function.
-
-`-Winline'
-     Warn if a function can not be inlined, and either it was declared
-     as inline, or else the `-finline-functions' option was given.
-
-`-Woverloaded-virtual'
-     Warn when a derived class function declaration may be an error in
-     defining a virtual function (C++ only).  In a derived class, the
-     definitions of virtual functions must match the type signature of a
-     virtual function declared in the base class.  With this option, the
-     compiler warns when you define a function with the same name as a
-     virtual function, but with a type signature that does not match any
-     declarations from the base class.
-
-`-Wsynth (C++ only)'
-     Warn when g++'s synthesis behavior does not match that of cfront.
-     For instance:
-
-          struct A {
-            operator int ();
-            A& operator = (int);
-          };
-          
-          main ()
-          {
-            A a,b;
-            a = b;
-          }
-
-     In this example, g++ will synthesize a default `A& operator =
-     (const A&);', while cfront will use the user-defined `operator ='.
-
-`-Werror'
-     Make all warnings into errors.
-
-\1f
-File: gcc.info,  Node: Debugging Options,  Next: Optimize Options,  Prev: Warning Options,  Up: Invoking GCC
-
-Options for Debugging Your Program or GNU CC
-============================================
-
-   GNU CC has various special options that are used for debugging
-either your program or GCC:
-
-`-g'
-     Produce debugging information in the operating system's native
-     format (stabs, COFF, XCOFF, or DWARF).  GDB can work with this
-     debugging information.
-
-     On most systems that use stabs format, `-g' enables use of extra
-     debugging information that only GDB can use; this extra information
-     makes debugging work better in GDB but will probably make other
-     debuggers crash or refuse to read the program.  If you want to
-     control for certain whether to generate the extra information, use
-     `-gstabs+', `-gstabs', `-gxcoff+', `-gxcoff', `-gdwarf-1+', or
-     `-gdwarf-1' (see below).
-
-     Unlike most other C compilers, GNU CC allows you to use `-g' with
-     `-O'.  The shortcuts taken by optimized code may occasionally
-     produce surprising results: some variables you declared may not
-     exist at all; flow of control may briefly move where you did not
-     expect it; some statements may not be executed because they
-     compute constant results or their values were already at hand;
-     some statements may execute in different places because they were
-     moved out of loops.
-
-     Nevertheless it proves possible to debug optimized output.  This
-     makes it reasonable to use the optimizer for programs that might
-     have bugs.
-
-     The following options are useful when GNU CC is generated with the
-     capability for more than one debugging format.
-
-`-ggdb'
-     Produce debugging information for use by GDB.  This means to use
-     the most expressive format available (DWARF 2, stabs, or the
-     native format if neither of those are supported), including GDB
-     extensions if at all possible.
-
-`-gstabs'
-     Produce debugging information in stabs format (if that is
-     supported), without GDB extensions.  This is the format used by
-     DBX on most BSD systems.  On MIPS, Alpha and System V Release 4
-     systems this option produces stabs debugging output which is not
-     understood by DBX or SDB.  On System V Release 4 systems this
-     option requires the GNU assembler.
-
-`-gstabs+'
-     Produce debugging information in stabs format (if that is
-     supported), using GNU extensions understood only by the GNU
-     debugger (GDB).  The use of these extensions is likely to make
-     other debuggers crash or refuse to read the program.
-
-`-gcoff'
-     Produce debugging information in COFF format (if that is
-     supported).  This is the format used by SDB on most System V
-     systems prior to System V Release 4.
-
-`-gxcoff'
-     Produce debugging information in XCOFF format (if that is
-     supported).  This is the format used by the DBX debugger on IBM
-     RS/6000 systems.
-
-`-gxcoff+'
-     Produce debugging information in XCOFF format (if that is
-     supported), using GNU extensions understood only by the GNU
-     debugger (GDB).  The use of these extensions is likely to make
-     other debuggers crash or refuse to read the program, and may cause
-     assemblers other than the GNU assembler (GAS) to fail with an
-     error.
-
-`-gdwarf'
-     Produce debugging information in DWARF version 1 format (if that is
-     supported).  This is the format used by SDB on most System V
-     Release 4 systems.
-
-`-gdwarf+'
-     Produce debugging information in DWARF version 1 format (if that is
-     supported), using GNU extensions understood only by the GNU
-     debugger (GDB).  The use of these extensions is likely to make
-     other debuggers crash or refuse to read the program.
-
-`-gdwarf-2'
-     Produce debugging information in DWARF version 2 format (if that is
-     supported).  This is the format used by DBX on IRIX 6.
-
-`-gLEVEL'
-`-ggdbLEVEL'
-`-gstabsLEVEL'
-`-gcoffLEVEL'
-`-gxcoffLEVEL'
-`-gdwarfLEVEL'
-`-gdwarf-2LEVEL'
-     Request debugging information and also use LEVEL to specify how
-     much information.  The default level is 2.
-
-     Level 1 produces minimal information, enough for making backtraces
-     in parts of the program that you don't plan to debug.  This
-     includes descriptions of functions and external variables, but no
-     information about local variables and no line numbers.
-
-     Level 3 includes extra information, such as all the macro
-     definitions present in the program.  Some debuggers support macro
-     expansion when you use `-g3'.
-
-`-p'
-     Generate extra code to write profile information suitable for the
-     analysis program `prof'.  You must use this option when compiling
-     the source files you want data about, and you must also use it when
-     linking.
-
-`-pg'
-     Generate extra code to write profile information suitable for the
-     analysis program `gprof'.  You must use this option when compiling
-     the source files you want data about, and you must also use it when
-     linking.
-
-`-a'
-     Generate extra code to write profile information for basic blocks,
-     which will record the number of times each basic block is
-     executed, the basic block start address, and the function name
-     containing the basic block.  If `-g' is used, the line number and
-     filename of the start of the basic block will also be recorded.
-     If not overridden by the machine description, the default action is
-     to append to the text file `bb.out'.
-
-     This data could be analyzed by a program like `tcov'.  Note,
-     however, that the format of the data is not what `tcov' expects.
-     Eventually GNU `gprof' should be extended to process this data.
-
-`-ax'
-     Generate extra code to profile basic blocks.  Your executable will
-     produce output that is a superset of that produced when `-a' is
-     used.  Additional output is the source and target address of the
-     basic blocks where a jump takes place, the number of times a jump
-     is executed, and (optionally) the complete sequence of basic
-     blocks being executed.  The output is appended to file `bb.out'.
-
-     You can examine different profiling aspects without recompilation.
-     Your execuable will read a list of function names from file
-     `bb.in'.  Profiling starts when a function on the list is entered
-     and stops when that invocation is exited.  To exclude a function
-     from profiling, prefix its name with `-'.  If a function name is
-     not unique, you can disambiguate it by writing it in the form
-     `/path/filename.d:functionname'.  Your executable will write the
-     available paths and filenames in file `bb.out'.
-
-     Several function names have a special meaning:
-    `__bb_jumps__'
-          Write source, target and frequency of jumps to file `bb.out'.
-
-    `__bb_hidecall__'
-          Exclude function calls from frequency count.
-
-    `__bb_showret__'
-          Include function returns in frequency count.
-
-    `__bb_trace__'
-          Write the sequence of basic blocks executed to file
-          `bbtrace.gz'.  The file will be compressed using the program
-          `gzip', which must exist in your `PATH'.  On systems without
-          the `popen' function, the file will be named `bbtrace' and
-          will not be compressed.  *Profiling for even a few seconds on
-          these systems will produce a very large file.*  Note:
-          `__bb_hidecall__' and `__bb_showret__' will not affect the
-          sequence written to `bbtrace.gz'.
-
-     Here's a short example using different profiling parameters in
-     file `bb.in'.  Assume function `foo' consists of basic blocks 1
-     and 2 and is called twice from block 3 of function `main'.  After
-     the calls, block 3 transfers control to block 4 of `main'.
-
-     With `__bb_trace__' and `main' contained in file `bb.in', the
-     following sequence of blocks is written to file `bbtrace.gz': 0 3
-     1 2 1 2 4.  The return from block 2 to block 3 is not shown,
-     because the return is to a point inside the block and not to the
-     top.  The block address 0 always indicates, that control is
-     transferred to the trace from somewhere outside the observed
-     functions.  With `-foo' added to `bb.in', the blocks of function
-     `foo' are removed from the trace, so only 0 3 4 remains.
-
-     With `__bb_jumps__' and `main' contained in file `bb.in', jump
-     frequencies will be written to file `bb.out'.  The frequencies are
-     obtained by constructing a trace of blocks and incrementing a
-     counter for every neighbouring pair of blocks in the trace.  The
-     trace 0 3 1 2 1 2 4 displays the following frequencies:
-
-          Jump from block 0x0 to block 0x3 executed 1 time(s)
-          Jump from block 0x3 to block 0x1 executed 1 time(s)
-          Jump from block 0x1 to block 0x2 executed 2 time(s)
-          Jump from block 0x2 to block 0x1 executed 1 time(s)
-          Jump from block 0x2 to block 0x4 executed 1 time(s)
-
-     With `__bb_hidecall__', control transfer due to call instructions
-     is removed from the trace, that is the trace is cut into three
-     parts: 0 3 4, 0 1 2 and 0 1 2.  With `__bb_showret__', control
-     transfer due to return instructions is added to the trace.  The
-     trace becomes: 0 3 1 2 3 1 2 3 4.  Note, that this trace is not
-     the same, as the sequence written to `bbtrace.gz'.  It is solely
-     used for counting jump frequencies.
-
-`-fprofile-arcs'
-     Instrument "arcs" during compilation.  For each function of your
-     program, GNU CC creates a program flow graph, then finds a
-     spanning tree for the graph.  Only arcs that are not on the
-     spanning tree have to be instrumented: the compiler adds code to
-     count the number of times that these arcs are executed.  When an
-     arc is the only exit or only entrance to a block, the
-     instrumentation code can be added to the block; otherwise, a new
-     basic block must be created to hold the instrumentation code.
-
-     Since not every arc in the program must be instrumented, programs
-     compiled with this option run faster than programs compiled with
-     `-a', which adds instrumentation code to every basic block in the
-     program.  The tradeoff: since `gcov' does not have execution
-     counts for all branches, it must start with the execution counts
-     for the instrumented branches, and then iterate over the program
-     flow graph until the entire graph has been solved.  Hence, `gcov'
-     runs a little more slowly than a program which uses information
-     from `-a'.
-
-     `-fprofile-arcs' also makes it possible to estimate branch
-     probabilities, and to calculate basic block execution counts.  In
-     general, basic block execution counts do not give enough
-     information to estimate all branch probabilities.  When the
-     compiled program exits, it saves the arc execution counts to a
-     file called `SOURCENAME.da'.  Use the compiler option
-     `-fbranch-probabilities' (*note Options that Control Optimization:
-     Optimize Options.) when recompiling, to optimize using estimated
-     branch probabilities.
-
-`-ftest-coverage'
-     Create data files for the `gcov' code-coverage utility (*note
-     `gcov': a GNU CC Test Coverage Program: Gcov.).  The data file
-     names begin with the name of your source file:
-
-    `SOURCENAME.bb'
-          A mapping from basic blocks to line numbers, which `gcov'
-          uses to associate basic block execution counts with line
-          numbers.
-
-    `SOURCENAME.bbg'
-          A list of all arcs in the program flow graph.  This allows
-          `gcov' to reconstruct the program flow graph, so that it can
-          compute all basic block and arc execution counts from the
-          information in the `SOURCENAME.da' file (this last file is
-          the output from `-fprofile-arcs').
-
-`-dLETTERS'
-     Says to make debugging dumps during compilation at times specified
-     by LETTERS.  This is used for debugging the compiler.  The file
-     names for most of the dumps are made by appending a word to the
-     source file name (e.g.  `foo.c.rtl' or `foo.c.jump').  Here are the
-     possible letters for use in LETTERS, and their meanings:
-
-    `M'
-          Dump all macro definitions, at the end of preprocessing, and
-          write no output.
-
-    `N'
-          Dump all macro names, at the end of preprocessing.
-
-    `D'
-          Dump all macro definitions, at the end of preprocessing, in
-          addition to normal output.
-
-    `y'
-          Dump debugging information during parsing, to standard error.
-
-    `r'
-          Dump after RTL generation, to `FILE.rtl'.
-
-    `x'
-          Just generate RTL for a function instead of compiling it.
-          Usually used with `r'.
-
-    `j'
-          Dump after first jump optimization, to `FILE.jump'.
-
-    `s'
-          Dump after CSE (including the jump optimization that sometimes
-          follows CSE), to `FILE.cse'.
-
-    `L'
-          Dump after loop optimization, to `FILE.loop'.
-
-    `t'
-          Dump after the second CSE pass (including the jump
-          optimization that sometimes follows CSE), to `FILE.cse2'.
-
-    `f'
-          Dump after flow analysis, to `FILE.flow'.
-
-    `c'
-          Dump after instruction combination, to the file
-          `FILE.combine'.
-
-    `S'
-          Dump after the first instruction scheduling pass, to
-          `FILE.sched'.
-
-    `l'
-          Dump after local register allocation, to `FILE.lreg'.
-
-    `g'
-          Dump after global register allocation, to `FILE.greg'.
-
-    `R'
-          Dump after the second instruction scheduling pass, to
-          `FILE.sched2'.
-
-    `J'
-          Dump after last jump optimization, to `FILE.jump2'.
-
-    `d'
-          Dump after delayed branch scheduling, to `FILE.dbr'.
-
-    `k'
-          Dump after conversion from registers to stack, to
-          `FILE.stack'.
-
-    `a'
-          Produce all the dumps listed above.
-
-    `m'
-          Print statistics on memory usage, at the end of the run, to
-          standard error.
-
-    `p'
-          Annotate the assembler output with a comment indicating which
-          pattern and alternative was used.
-
-    `A'
-          Annotate the assembler output with miscellaneous debugging
-          information.
-
-`-fpretend-float'
-     When running a cross-compiler, pretend that the target machine
-     uses the same floating point format as the host machine.  This
-     causes incorrect output of the actual floating constants, but the
-     actual instruction sequence will probably be the same as GNU CC
-     would make when running on the target machine.
-
-`-save-temps'
-     Store the usual "temporary" intermediate files permanently; place
-     them in the current directory and name them based on the source
-     file.  Thus, compiling `foo.c' with `-c -save-temps' would produce
-     files `foo.i' and `foo.s', as well as `foo.o'.
-
-`-print-file-name=LIBRARY'
-     Print the full absolute name of the library file LIBRARY that
-     would be used when linking--and don't do anything else.  With this
-     option, GNU CC does not compile or link anything; it just prints
-     the file name.
-
-`-print-prog-name=PROGRAM'
-     Like `-print-file-name', but searches for a program such as `cpp'.
-
-`-print-libgcc-file-name'
-     Same as `-print-file-name=libgcc.a'.
-
-     This is useful when you use `-nostdlib' or `-nodefaultlibs' but
-     you do want to link with `libgcc.a'.  You can do
-
-          gcc -nostdlib FILES... `gcc -print-libgcc-file-name`
-
-`-print-search-dirs'
-     Print the name of the configured installation directory and a list
-     of program and library directories gcc will search--and don't do
-     anything else.
-
-     This is useful when gcc prints the error message `installation
-     problem, cannot exec cpp: No such file or directory'.  To resolve
-     this you either need to put `cpp' and the other compiler
-     components where gcc expects to find them, or you can set the
-     environment variable `GCC_EXEC_PREFIX' to the directory where you
-     installed them.  Don't forget the trailing '/'.  *Note Environment
-     Variables::.
-
-\1f
-File: gcc.info,  Node: Optimize Options,  Next: Preprocessor Options,  Prev: Debugging Options,  Up: Invoking GCC
-
-Options That Control Optimization
-=================================
-
-   These options control various sorts of optimizations:
-
-`-O'
-`-O1'
-     Optimize.  Optimizing compilation takes somewhat more time, and a
-     lot more memory for a large function.
-
-     Without `-O', the compiler's goal is to reduce the cost of
-     compilation and to make debugging produce the expected results.
-     Statements are independent: if you stop the program with a
-     breakpoint between statements, you can then assign a new value to
-     any variable or change the program counter to any other statement
-     in the function and get exactly the results you would expect from
-     the source code.
-
-     Without `-O', the compiler only allocates variables declared
-     `register' in registers.  The resulting compiled code is a little
-     worse than produced by PCC without `-O'.
-
-     With `-O', the compiler tries to reduce code size and execution
-     time.
-
-     When you specify `-O', the compiler turns on `-fthread-jumps' and
-     `-fdefer-pop' on all machines.  The compiler turns on
-     `-fdelayed-branch' on machines that have delay slots, and
-     `-fomit-frame-pointer' on machines that can support debugging even
-     without a frame pointer.  On some machines the compiler also turns
-     on other flags.
-
-`-O2'
-     Optimize even more.  GNU CC performs nearly all supported
-     optimizations that do not involve a space-speed tradeoff.  The
-     compiler does not perform loop unrolling or function inlining when
-     you specify `-O2'.  As compared to `-O', this option increases
-     both compilation time and the performance of the generated code.
-
-     `-O2' turns on all optional optimizations except for loop unrolling
-     and function inlining.  It also turns on the `-fforce-mem' option
-     on all machines and frame pointer elimination on machines where
-     doing so does not interfere with debugging.
-
-`-O3'
-     Optimize yet more.  `-O3' turns on all optimizations specified by
-     `-O2' and also turns on the `inline-functions' option.
-
-`-O0'
-     Do not optimize.
-
-     If you use multiple `-O' options, with or without level numbers,
-     the last such option is the one that is effective.
-
-   Options of the form `-fFLAG' specify machine-independent flags.
-Most flags have both positive and negative forms; the negative form of
-`-ffoo' would be `-fno-foo'.  In the table below, only one of the forms
-is listed--the one which is not the default.  You can figure out the
-other form by either removing `no-' or adding it.
-
-`-ffloat-store'
-     Do not store floating point variables in registers, and inhibit
-     other options that might change whether a floating point value is
-     taken from a register or memory.
-
-     This option prevents undesirable excess precision on machines such
-     as the 68000 where the floating registers (of the 68881) keep more
-     precision than a `double' is supposed to have.  Similarly for the
-     x86 architecture.  For most programs, the excess precision does
-     only good, but a few programs rely on the precise definition of
-     IEEE floating point.  Use `-ffloat-store' for such programs.
-
-`-fno-default-inline'
-     Do not make member functions inline by default merely because they
-     are defined inside the class scope (C++ only).  Otherwise, when
-     you specify `-O', member functions defined inside class scope are
-     compiled inline by default; i.e., you don't need to add `inline'
-     in front of the member function name.
-
-`-fno-defer-pop'
-     Always pop the arguments to each function call as soon as that
-     function returns.  For machines which must pop arguments after a
-     function call, the compiler normally lets arguments accumulate on
-     the stack for several function calls and pops them all at once.
-
-`-fforce-mem'
-     Force memory operands to be copied into registers before doing
-     arithmetic on them.  This produces better code by making all memory
-     references potential common subexpressions.  When they are not
-     common subexpressions, instruction combination should eliminate
-     the separate register-load.  The `-O2' option turns on this option.
-
-`-fforce-addr'
-     Force memory address constants to be copied into registers before
-     doing arithmetic on them.  This may produce better code just as
-     `-fforce-mem' may.
-
-`-fomit-frame-pointer'
-     Don't keep the frame pointer in a register for functions that
-     don't need one.  This avoids the instructions to save, set up and
-     restore frame pointers; it also makes an extra register available
-     in many functions.  *It also makes debugging impossible on some
-     machines.*
-
-     On some machines, such as the Vax, this flag has no effect, because
-     the standard calling sequence automatically handles the frame
-     pointer and nothing is saved by pretending it doesn't exist.  The
-     machine-description macro `FRAME_POINTER_REQUIRED' controls
-     whether a target machine supports this flag.  *Note Registers::.
-
-`-fno-inline'
-     Don't pay attention to the `inline' keyword.  Normally this option
-     is used to keep the compiler from expanding any functions inline.
-     Note that if you are not optimizing, no functions can be expanded
-     inline.
-
-`-finline-functions'
-     Integrate all simple functions into their callers.  The compiler
-     heuristically decides which functions are simple enough to be worth
-     integrating in this way.
-
-     If all calls to a given function are integrated, and the function
-     is declared `static', then the function is normally not output as
-     assembler code in its own right.
-
-`-fkeep-inline-functions'
-     Even if all calls to a given function are integrated, and the
-     function is declared `static', nevertheless output a separate
-     run-time callable version of the function.  This switch does not
-     affect `extern inline' functions.
-
-`-fkeep-static-consts'
-     Emit variables declared `static const' when optimization isn't
-     turned on, even if the variables aren't referenced.
-
-     GNU CC enables this option by default.  If you want to force the
-     compiler to check if the variable was referenced, regardless of
-     whether or not optimization is turned on, use the
-     `-fno-keep-static-consts' option.
-
-`-fno-function-cse'
-     Do not put function addresses in registers; make each instruction
-     that calls a constant function contain the function's address
-     explicitly.
-
-     This option results in less efficient code, but some strange hacks
-     that alter the assembler output may be confused by the
-     optimizations performed when this option is not used.
-
-`-ffast-math'
-     This option allows GCC to violate some ANSI or IEEE rules and/or
-     specifications in the interest of optimizing code for speed.  For
-     example, it allows the compiler to assume arguments to the `sqrt'
-     function are non-negative numbers and that no floating-point values
-     are NaNs.
-
-     This option should never be turned on by any `-O' option since it
-     can result in incorrect output for programs which depend on an
-     exact implementation of IEEE or ANSI rules/specifications for math
-     functions.
-
-   The following options control specific optimizations.  The `-O2'
-option turns on all of these optimizations except `-funroll-loops' and
-`-funroll-all-loops'.  On most machines, the `-O' option turns on the
-`-fthread-jumps' and `-fdelayed-branch' options, but specific machines
-may handle it differently.
-
-   You can use the following flags in the rare cases when "fine-tuning"
-of optimizations to be performed is desired.
-
-`-fstrength-reduce'
-     Perform the optimizations of loop strength reduction and
-     elimination of iteration variables.
-
-`-fthread-jumps'
-     Perform optimizations where we check to see if a jump branches to a
-     location where another comparison subsumed by the first is found.
-     If so, the first branch is redirected to either the destination of
-     the second branch or a point immediately following it, depending
-     on whether the condition is known to be true or false.
-
-`-fcse-follow-jumps'
-     In common subexpression elimination, scan through jump instructions
-     when the target of the jump is not reached by any other path.  For
-     example, when CSE encounters an `if' statement with an `else'
-     clause, CSE will follow the jump when the condition tested is
-     false.
-
-`-fcse-skip-blocks'
-     This is similar to `-fcse-follow-jumps', but causes CSE to follow
-     jumps which conditionally skip over blocks.  When CSE encounters a
-     simple `if' statement with no else clause, `-fcse-skip-blocks'
-     causes CSE to follow the jump around the body of the `if'.
-
-`-frerun-cse-after-loop'
-     Re-run common subexpression elimination after loop optimizations
-     has been performed.
-
-`-fexpensive-optimizations'
-     Perform a number of minor optimizations that are relatively
-     expensive.
-
-`-fdelayed-branch'
-     If supported for the target machine, attempt to reorder
-     instructions to exploit instruction slots available after delayed
-     branch instructions.
-
-`-fschedule-insns'
-     If supported for the target machine, attempt to reorder
-     instructions to eliminate execution stalls due to required data
-     being unavailable.  This helps machines that have slow floating
-     point or memory load instructions by allowing other instructions
-     to be issued until the result of the load or floating point
-     instruction is required.
-
-`-fschedule-insns2'
-     Similar to `-fschedule-insns', but requests an additional pass of
-     instruction scheduling after register allocation has been done.
-     This is especially useful on machines with a relatively small
-     number of registers and where memory load instructions take more
-     than one cycle.
-
-`-ffunction-sections'
-     Place each function into its own section in the output file if the
-     target supports arbitrary sections.  The function's name determines
-     the section's name in the output file.
-
-     Use this option on systems where the linker can perform
-     optimizations to improve locality of reference in the instruction
-     space.  HPPA processors running HP-UX and Sparc processors running
-     Solaris 2 have linkers with such optimizations.  Other systems
-     using the ELF object format as well as AIX may have these
-     optimizations in the future.
-
-     Only use this option when there are significant benefits from doing
-     so.  When you specify this option, the assembler and linker will
-     create larger object and executable files and will also be slower.
-     You will not be able to use `gprof' on all systems if you specify
-     this option and you may have problems with debugging if you
-     specify both this option and `-g'.
-
-`-fcaller-saves'
-     Enable values to be allocated in registers that will be clobbered
-     by function calls, by emitting extra instructions to save and
-     restore the registers around such calls.  Such allocation is done
-     only when it seems to result in better code than would otherwise
-     be produced.
-
-     This option is enabled by default on certain machines, usually
-     those which have no call-preserved registers to use instead.
-
-`-funroll-loops'
-     Perform the optimization of loop unrolling.  This is only done for
-     loops whose number of iterations can be determined at compile time
-     or run time.  `-funroll-loop' implies both `-fstrength-reduce' and
-     `-frerun-cse-after-loop'.
-
-`-funroll-all-loops'
-     Perform the optimization of loop unrolling.  This is done for all
-     loops and usually makes programs run more slowly.
-     `-funroll-all-loops' implies `-fstrength-reduce' as well as
-     `-frerun-cse-after-loop'.
-
-`-fno-peephole'
-     Disable any machine-specific peephole optimizations.
-
-`-fbranch-probabilities'
-     After running a program compiled with `-fprofile-arcs' (*note
-     Options for Debugging Your Program or `gcc': Debugging Options.),
-     you can compile it a second time using `-fbranch-probabilities',
-     to improve optimizations based on guessing the path a branch might
-     take.
-
-     With `-fbranch-probabilities', GNU CC puts a `REG_EXEC_COUNT' note
-     on the first instruction of each basic block, and a `REG_BR_PROB'
-     note on each `JUMP_INSN' and `CALL_INSN'.  These can be used to
-     improve optimization.  Currently, they are only used in one place:
-     in `reorg.c', instead of guessing which path a branch is mostly to
-     take, the `REG_BR_PROB' values are used to exactly determine which
-     path is taken more often.
-
diff --git a/gcc/gcc.info-20 b/gcc/gcc.info-20
deleted file mode 100644 (file)
index cf674a4..0000000
+++ /dev/null
@@ -1,1207 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Function Units,  Prev: Delay Slots,  Up: Insn Attributes
-
-Specifying Function Units
--------------------------
-
-   On most RISC machines, there are instructions whose results are not
-available for a specific number of cycles.  Common cases are
-instructions that load data from memory.  On many machines, a pipeline
-stall will result if the data is referenced too soon after the load
-instruction.
-
-   In addition, many newer microprocessors have multiple function
-units, usually one for integer and one for floating point, and often
-will incur pipeline stalls when a result that is needed is not yet
-ready.
-
-   The descriptions in this section allow the specification of how much
-time must elapse between the execution of an instruction and the time
-when its result is used.  It also allows specification of when the
-execution of an instruction will delay execution of similar instructions
-due to function unit conflicts.
-
-   For the purposes of the specifications in this section, a machine is
-divided into "function units", each of which execute a specific class
-of instructions in first-in-first-out order.  Function units that
-accept one instruction each cycle and allow a result to be used in the
-succeeding instruction (usually via forwarding) need not be specified.
-Classic RISC microprocessors will normally have a single function unit,
-which we can call `memory'.  The newer "superscalar" processors will
-often have function units for floating point operations, usually at
-least a floating point adder and multiplier.
-
-   Each usage of a function units by a class of insns is specified with
-a `define_function_unit' expression, which looks like this:
-
-     (define_function_unit NAME MULTIPLICITY SIMULTANEITY
-                           TEST READY-DELAY ISSUE-DELAY
-                          [CONFLICT-LIST])
-
-   NAME is a string giving the name of the function unit.
-
-   MULTIPLICITY is an integer specifying the number of identical units
-in the processor.  If more than one unit is specified, they will be
-scheduled independently.  Only truly independent units should be
-counted; a pipelined unit should be specified as a single unit.  (The
-only common example of a machine that has multiple function units for a
-single instruction class that are truly independent and not pipelined
-are the two multiply and two increment units of the CDC 6600.)
-
-   SIMULTANEITY specifies the maximum number of insns that can be
-executing in each instance of the function unit simultaneously or zero
-if the unit is pipelined and has no limit.
-
-   All `define_function_unit' definitions referring to function unit
-NAME must have the same name and values for MULTIPLICITY and
-SIMULTANEITY.
-
-   TEST is an attribute test that selects the insns we are describing
-in this definition.  Note that an insn may use more than one function
-unit and a function unit may be specified in more than one
-`define_function_unit'.
-
-   READY-DELAY is an integer that specifies the number of cycles after
-which the result of the instruction can be used without introducing any
-stalls.
-
-   ISSUE-DELAY is an integer that specifies the number of cycles after
-the instruction matching the TEST expression begins using this unit
-until a subsequent instruction can begin.  A cost of N indicates an N-1
-cycle delay.  A subsequent instruction may also be delayed if an
-earlier instruction has a longer READY-DELAY value.  This blocking
-effect is computed using the SIMULTANEITY, READY-DELAY, ISSUE-DELAY,
-and CONFLICT-LIST terms.  For a normal non-pipelined function unit,
-SIMULTANEITY is one, the unit is taken to block for the READY-DELAY
-cycles of the executing insn, and smaller values of ISSUE-DELAY are
-ignored.
-
-   CONFLICT-LIST is an optional list giving detailed conflict costs for
-this unit.  If specified, it is a list of condition test expressions to
-be applied to insns chosen to execute in NAME following the particular
-insn matching TEST that is already executing in NAME.  For each insn in
-the list, ISSUE-DELAY specifies the conflict cost; for insns not in the
-list, the cost is zero.  If not specified, CONFLICT-LIST defaults to
-all instructions that use the function unit.
-
-   Typical uses of this vector are where a floating point function unit
-can pipeline either single- or double-precision operations, but not
-both, or where a memory unit can pipeline loads, but not stores, etc.
-
-   As an example, consider a classic RISC machine where the result of a
-load instruction is not available for two cycles (a single "delay"
-instruction is required) and where only one load instruction can be
-executed simultaneously.  This would be specified as:
-
-     (define_function_unit "memory" 1 1 (eq_attr "type" "load") 2 0)
-
-   For the case of a floating point function unit that can pipeline
-either single or double precision, but not both, the following could be
-specified:
-
-     (define_function_unit
-        "fp" 1 0 (eq_attr "type" "sp_fp") 4 4 [(eq_attr "type" "dp_fp")])
-     (define_function_unit
-        "fp" 1 0 (eq_attr "type" "dp_fp") 4 4 [(eq_attr "type" "sp_fp")])
-
-   *Note:* The scheduler attempts to avoid function unit conflicts and
-uses all the specifications in the `define_function_unit' expression.
-It has recently come to our attention that these specifications may not
-allow modeling of some of the newer "superscalar" processors that have
-insns using multiple pipelined units.  These insns will cause a
-potential conflict for the second unit used during their execution and
-there is no way of representing that conflict.  We welcome any examples
-of how function unit conflicts work in such processors and suggestions
-for their representation.
-
-\1f
-File: gcc.info,  Node: Target Macros,  Next: Config,  Prev: Machine Desc,  Up: Top
-
-Target Description Macros
-*************************
-
-   In addition to the file `MACHINE.md', a machine description includes
-a C header file conventionally given the name `MACHINE.h'.  This header
-file defines numerous macros that convey the information about the
-target machine that does not fit into the scheme of the `.md' file.
-The file `tm.h' should be a link to `MACHINE.h'.  The header file
-`config.h' includes `tm.h' and most compiler source files include
-`config.h'.
-
-* Menu:
-
-* Driver::              Controlling how the driver runs the compilation passes.
-* Run-time Target::     Defining `-m' options like `-m68000' and `-m68020'.
-* Storage Layout::      Defining sizes and alignments of data.
-* Type Layout::         Defining sizes and properties of basic user data types.
-* Registers::           Naming and describing the hardware registers.
-* Register Classes::    Defining the classes of hardware registers.
-* Stack and Calling::   Defining which way the stack grows and by how much.
-* Varargs::            Defining the varargs macros.
-* Trampolines::         Code set up at run time to enter a nested function.
-* Library Calls::       Controlling how library routines are implicitly called.
-* Addressing Modes::    Defining addressing modes valid for memory operands.
-* Condition Code::      Defining how insns update the condition code.
-* Costs::               Defining relative costs of different operations.
-* Sections::            Dividing storage into text, data, and other sections.
-* PIC::                        Macros for position independent code.
-* Assembler Format::    Defining how to write insns and pseudo-ops to output.
-* Debugging Info::      Defining the format of debugging output.
-* Cross-compilation::   Handling floating point for cross-compilers.
-* Misc::                Everything else.
-
-\1f
-File: gcc.info,  Node: Driver,  Next: Run-time Target,  Up: Target Macros
-
-Controlling the Compilation Driver, `gcc'
-=========================================
-
-   You can control the compilation driver.
-
-`SWITCH_TAKES_ARG (CHAR)'
-     A C expression which determines whether the option `-CHAR' takes
-     arguments.  The value should be the number of arguments that
-     option takes-zero, for many options.
-
-     By default, this macro is defined as `DEFAULT_SWITCH_TAKES_ARG',
-     which handles the standard options properly.  You need not define
-     `SWITCH_TAKES_ARG' unless you wish to add additional options which
-     take arguments.  Any redefinition should call
-     `DEFAULT_SWITCH_TAKES_ARG' and then check for additional options.
-
-`WORD_SWITCH_TAKES_ARG (NAME)'
-     A C expression which determines whether the option `-NAME' takes
-     arguments.  The value should be the number of arguments that
-     option takes-zero, for many options.  This macro rather than
-     `SWITCH_TAKES_ARG' is used for multi-character option names.
-
-     By default, this macro is defined as
-     `DEFAULT_WORD_SWITCH_TAKES_ARG', which handles the standard options
-     properly.  You need not define `WORD_SWITCH_TAKES_ARG' unless you
-     wish to add additional options which take arguments.  Any
-     redefinition should call `DEFAULT_WORD_SWITCH_TAKES_ARG' and then
-     check for additional options.
-
-`SWITCHES_NEED_SPACES'
-     A string-valued C expression which enumerates the options for which
-     the linker needs a space between the option and its argument.
-
-     If this macro is not defined, the default value is `""'.
-
-`CPP_SPEC'
-     A C string constant that tells the GNU CC driver program options to
-     pass to CPP.  It can also specify how to translate options you
-     give to GNU CC into options for GNU CC to pass to the CPP.
-
-     Do not define this macro if it does not need to do anything.
-
-`NO_BUILTIN_SIZE_TYPE'
-     If this macro is defined, the preprocessor will not define the
-     builtin macro `__SIZE_TYPE__'.  The macro `__SIZE_TYPE__' must
-     then be defined by `CPP_SPEC' instead.
-
-     This should be defined if `SIZE_TYPE' depends on target dependent
-     flags which are not accessible to the preprocessor.  Otherwise, it
-     should not be defined.
-
-`NO_BUILTIN_PTRDIFF_TYPE'
-     If this macro is defined, the preprocessor will not define the
-     builtin macro `__PTRDIFF_TYPE__'.  The macro `__PTRDIFF_TYPE__'
-     must then be defined by `CPP_SPEC' instead.
-
-     This should be defined if `PTRDIFF_TYPE' depends on target
-     dependent flags which are not accessible to the preprocessor.
-     Otherwise, it should not be defined.
-
-`SIGNED_CHAR_SPEC'
-     A C string constant that tells the GNU CC driver program options to
-     pass to CPP.  By default, this macro is defined to pass the option
-     `-D__CHAR_UNSIGNED__' to CPP if `char' will be treated as
-     `unsigned char' by `cc1'.
-
-     Do not define this macro unless you need to override the default
-     definition.
-
-`CC1_SPEC'
-     A C string constant that tells the GNU CC driver program options to
-     pass to `cc1'.  It can also specify how to translate options you
-     give to GNU CC into options for GNU CC to pass to the `cc1'.
-
-     Do not define this macro if it does not need to do anything.
-
-`CC1PLUS_SPEC'
-     A C string constant that tells the GNU CC driver program options to
-     pass to `cc1plus'.  It can also specify how to translate options
-     you give to GNU CC into options for GNU CC to pass to the
-     `cc1plus'.
-
-     Do not define this macro if it does not need to do anything.
-
-`ASM_SPEC'
-     A C string constant that tells the GNU CC driver program options to
-     pass to the assembler.  It can also specify how to translate
-     options you give to GNU CC into options for GNU CC to pass to the
-     assembler.  See the file `sun3.h' for an example of this.
-
-     Do not define this macro if it does not need to do anything.
-
-`ASM_FINAL_SPEC'
-     A C string constant that tells the GNU CC driver program how to
-     run any programs which cleanup after the normal assembler.
-     Normally, this is not needed.  See the file `mips.h' for an
-     example of this.
-
-     Do not define this macro if it does not need to do anything.
-
-`LINK_SPEC'
-     A C string constant that tells the GNU CC driver program options to
-     pass to the linker.  It can also specify how to translate options
-     you give to GNU CC into options for GNU CC to pass to the linker.
-
-     Do not define this macro if it does not need to do anything.
-
-`LIB_SPEC'
-     Another C string constant used much like `LINK_SPEC'.  The
-     difference between the two is that `LIB_SPEC' is used at the end
-     of the command given to the linker.
-
-     If this macro is not defined, a default is provided that loads the
-     standard C library from the usual place.  See `gcc.c'.
-
-`LIBGCC_SPEC'
-     Another C string constant that tells the GNU CC driver program how
-     and when to place a reference to `libgcc.a' into the linker
-     command line.  This constant is placed both before and after the
-     value of `LIB_SPEC'.
-
-     If this macro is not defined, the GNU CC driver provides a default
-     that passes the string `-lgcc' to the linker unless the `-shared'
-     option is specified.
-
-`STARTFILE_SPEC'
-     Another C string constant used much like `LINK_SPEC'.  The
-     difference between the two is that `STARTFILE_SPEC' is used at the
-     very beginning of the command given to the linker.
-
-     If this macro is not defined, a default is provided that loads the
-     standard C startup file from the usual place.  See `gcc.c'.
-
-`ENDFILE_SPEC'
-     Another C string constant used much like `LINK_SPEC'.  The
-     difference between the two is that `ENDFILE_SPEC' is used at the
-     very end of the command given to the linker.
-
-     Do not define this macro if it does not need to do anything.
-
-`EXTRA_SPECS'
-     Define this macro to provide additional specifications to put in
-     the `specs' file that can be used in various specifications like
-     `CC1_SPEC'.
-
-     The definition should be an initializer for an array of structures,
-     containing a string constant, that defines the specification name,
-     and a string constant that provides the specification.
-
-     Do not define this macro if it does not need to do anything.
-
-     `EXTRA_SPECS' is useful when an architecture contains several
-     related targets, which have various `..._SPECS' which are similar
-     to each other, and the maintainer would like one central place to
-     keep these definitions.
-
-     For example, the PowerPC System V.4 targets use `EXTRA_SPECS' to
-     define either `_CALL_SYSV' when the System V calling sequence is
-     used or `_CALL_AIX' when the older AIX-based calling sequence is
-     used.
-
-     The `config/rs6000/rs6000.h' target file defines:
-
-          #define EXTRA_SPECS \
-            { "cpp_sysv_default", CPP_SYSV_DEFAULT },
-          
-          #define CPP_SYS_DEFAULT ""
-
-     The `config/rs6000/sysv.h' target file defines:
-          #undef CPP_SPEC
-          #define CPP_SPEC \
-          "%{posix: -D_POSIX_SOURCE } \
-          %{mcall-sysv: -D_CALL_SYSV } %{mcall-aix: -D_CALL_AIX } \
-          %{!mcall-sysv: %{!mcall-aix: %(cpp_sysv_default) }} \
-          %{msoft-float: -D_SOFT_FLOAT} %{mcpu=403: -D_SOFT_FLOAT}"
-          
-          #undef CPP_SYSV_DEFAULT
-          #define CPP_SYSV_DEFAULT "-D_CALL_SYSV"
-
-     while the `config/rs6000/eabiaix.h' target file defines
-     `CPP_SYSV_DEFAULT' as:
-
-          #undef CPP_SYSV_DEFAULT
-          #define CPP_SYSV_DEFAULT "-D_CALL_AIX"
-
-`LINK_LIBGCC_SPECIAL'
-     Define this macro if the driver program should find the library
-     `libgcc.a' itself and should not pass `-L' options to the linker.
-     If you do not define this macro, the driver program will pass the
-     argument `-lgcc' to tell the linker to do the search and will pass
-     `-L' options to it.
-
-`LINK_LIBGCC_SPECIAL_1'
-     Define this macro if the driver program should find the library
-     `libgcc.a'.  If you do not define this macro, the driver program
-     will pass the argument `-lgcc' to tell the linker to do the search.
-     This macro is similar to `LINK_LIBGCC_SPECIAL', except that it does
-     not affect `-L' options.
-
-`MULTILIB_DEFAULTS'
-     Define this macro as a C expression for the initializer of an
-     array of string to tell the driver program which options are
-     defaults for this target and thus do not need to be handled
-     specially when using `MULTILIB_OPTIONS'.
-
-     Do not define this macro if `MULTILIB_OPTIONS' is not defined in
-     the target makefile fragment or if none of the options listed in
-     `MULTILIB_OPTIONS' are set by default.  *Note Target Fragment::.
-
-`RELATIVE_PREFIX_NOT_LINKDIR'
-     Define this macro to tell `gcc' that it should only translate a
-     `-B' prefix into a `-L' linker option if the prefix indicates an
-     absolute file name.
-
-`STANDARD_EXEC_PREFIX'
-     Define this macro as a C string constant if you wish to override
-     the standard choice of `/usr/local/lib/gcc-lib/' as the default
-     prefix to try when searching for the executable files of the
-     compiler.
-
-`MD_EXEC_PREFIX'
-     If defined, this macro is an additional prefix to try after
-     `STANDARD_EXEC_PREFIX'.  `MD_EXEC_PREFIX' is not searched when the
-     `-b' option is used, or the compiler is built as a cross compiler.
-
-`STANDARD_STARTFILE_PREFIX'
-     Define this macro as a C string constant if you wish to override
-     the standard choice of `/usr/local/lib/' as the default prefix to
-     try when searching for startup files such as `crt0.o'.
-
-`MD_STARTFILE_PREFIX'
-     If defined, this macro supplies an additional prefix to try after
-     the standard prefixes.  `MD_EXEC_PREFIX' is not searched when the
-     `-b' option is used, or when the compiler is built as a cross
-     compiler.
-
-`MD_STARTFILE_PREFIX_1'
-     If defined, this macro supplies yet another prefix to try after the
-     standard prefixes.  It is not searched when the `-b' option is
-     used, or when the compiler is built as a cross compiler.
-
-`INIT_ENVIRONMENT'
-     Define this macro as a C string constant if you wish to set
-     environment variables for programs called by the driver, such as
-     the assembler and loader.  The driver passes the value of this
-     macro to `putenv' to initialize the necessary environment
-     variables.
-
-`LOCAL_INCLUDE_DIR'
-     Define this macro as a C string constant if you wish to override
-     the standard choice of `/usr/local/include' as the default prefix
-     to try when searching for local header files.  `LOCAL_INCLUDE_DIR'
-     comes before `SYSTEM_INCLUDE_DIR' in the search order.
-
-     Cross compilers do not use this macro and do not search either
-     `/usr/local/include' or its replacement.
-
-`SYSTEM_INCLUDE_DIR'
-     Define this macro as a C string constant if you wish to specify a
-     system-specific directory to search for header files before the
-     standard directory.  `SYSTEM_INCLUDE_DIR' comes before
-     `STANDARD_INCLUDE_DIR' in the search order.
-
-     Cross compilers do not use this macro and do not search the
-     directory specified.
-
-`STANDARD_INCLUDE_DIR'
-     Define this macro as a C string constant if you wish to override
-     the standard choice of `/usr/include' as the default prefix to try
-     when searching for header files.
-
-     Cross compilers do not use this macro and do not search either
-     `/usr/include' or its replacement.
-
-`STANDARD_INCLUDE_COMPONENT'
-     The "component" corresponding to `STANDARD_INCLUDE_DIR'.  See
-     `INCLUDE_DEFAULTS', below, for the description of components.  If
-     you do not define this macro, no component is used.
-
-`INCLUDE_DEFAULTS'
-     Define this macro if you wish to override the entire default
-     search path for include files.  For a native compiler, the default
-     search path usually consists of `GCC_INCLUDE_DIR',
-     `LOCAL_INCLUDE_DIR', `SYSTEM_INCLUDE_DIR',
-     `GPLUSPLUS_INCLUDE_DIR', and `STANDARD_INCLUDE_DIR'.  In addition,
-     `GPLUSPLUS_INCLUDE_DIR' and `GCC_INCLUDE_DIR' are defined
-     automatically by `Makefile', and specify private search areas for
-     GCC.  The directory `GPLUSPLUS_INCLUDE_DIR' is used only for C++
-     programs.
-
-     The definition should be an initializer for an array of structures.
-     Each array element should have four elements: the directory name (a
-     string constant), the component name, and flag for C++-only
-     directories, and a flag showing that the includes in the directory
-     don't need to be wrapped in `extern `C'' when compiling C++.  Mark
-     the end of the array with a null element.
-
-     The component name denotes what GNU package the include file is
-     part of, if any, in all upper-case letters.  For example, it might
-     be `GCC' or `BINUTILS'.  If the package is part of the a
-     vendor-supplied operating system, code the component name as `0'.
-
-     For example, here is the definition used for VAX/VMS:
-
-          #define INCLUDE_DEFAULTS \
-          {                                       \
-            { "GNU_GXX_INCLUDE:", "G++", 1, 1},   \
-            { "GNU_CC_INCLUDE:", "GCC", 0, 0},    \
-            { "SYS$SYSROOT:[SYSLIB.]", 0, 0, 0},  \
-            { ".", 0, 0, 0},                      \
-            { 0, 0, 0, 0}                         \
-          }
-
-   Here is the order of prefixes tried for exec files:
-
-  1. Any prefixes specified by the user with `-B'.
-
-  2. The environment variable `GCC_EXEC_PREFIX', if any.
-
-  3. The directories specified by the environment variable
-     `COMPILER_PATH'.
-
-  4. The macro `STANDARD_EXEC_PREFIX'.
-
-  5. `/usr/lib/gcc/'.
-
-  6. The macro `MD_EXEC_PREFIX', if any.
-
-   Here is the order of prefixes tried for startfiles:
-
-  1. Any prefixes specified by the user with `-B'.
-
-  2. The environment variable `GCC_EXEC_PREFIX', if any.
-
-  3. The directories specified by the environment variable
-     `LIBRARY_PATH' (native only, cross compilers do not use this).
-
-  4. The macro `STANDARD_EXEC_PREFIX'.
-
-  5. `/usr/lib/gcc/'.
-
-  6. The macro `MD_EXEC_PREFIX', if any.
-
-  7. The macro `MD_STARTFILE_PREFIX', if any.
-
-  8. The macro `STANDARD_STARTFILE_PREFIX'.
-
-  9. `/lib/'.
-
- 10. `/usr/lib/'.
-
-\1f
-File: gcc.info,  Node: Run-time Target,  Next: Storage Layout,  Prev: Driver,  Up: Target Macros
-
-Run-time Target Specification
-=============================
-
-   Here are run-time target specifications.
-
-`CPP_PREDEFINES'
-     Define this to be a string constant containing `-D' options to
-     define the predefined macros that identify this machine and system.
-     These macros will be predefined unless the `-ansi' option is
-     specified.
-
-     In addition, a parallel set of macros are predefined, whose names
-     are made by appending `__' at the beginning and at the end.  These
-     `__' macros are permitted by the ANSI standard, so they are
-     predefined regardless of whether `-ansi' is specified.
-
-     For example, on the Sun, one can use the following value:
-
-          "-Dmc68000 -Dsun -Dunix"
-
-     The result is to define the macros `__mc68000__', `__sun__' and
-     `__unix__' unconditionally, and the macros `mc68000', `sun' and
-     `unix' provided `-ansi' is not specified.
-
-`extern int target_flags;'
-     This declaration should be present.
-
-`TARGET_...'
-     This series of macros is to allow compiler command arguments to
-     enable or disable the use of optional features of the target
-     machine.  For example, one machine description serves both the
-     68000 and the 68020; a command argument tells the compiler whether
-     it should use 68020-only instructions or not.  This command
-     argument works by means of a macro `TARGET_68020' that tests a bit
-     in `target_flags'.
-
-     Define a macro `TARGET_FEATURENAME' for each such option.  Its
-     definition should test a bit in `target_flags'; for example:
-
-          #define TARGET_68020 (target_flags & 1)
-
-     One place where these macros are used is in the
-     condition-expressions of instruction patterns.  Note how
-     `TARGET_68020' appears frequently in the 68000 machine description
-     file, `m68k.md'.  Another place they are used is in the
-     definitions of the other macros in the `MACHINE.h' file.
-
-`TARGET_SWITCHES'
-     This macro defines names of command options to set and clear bits
-     in `target_flags'.  Its definition is an initializer with a
-     subgrouping for each command option.
-
-     Each subgrouping contains a string constant, that defines the
-     option name, and a number, which contains the bits to set in
-     `target_flags'.  A negative number says to clear bits instead; the
-     negative of the number is which bits to clear.  The actual option
-     name is made by appending `-m' to the specified name.
-
-     One of the subgroupings should have a null string.  The number in
-     this grouping is the default value for `target_flags'.  Any target
-     options act starting with that value.
-
-     Here is an example which defines `-m68000' and `-m68020' with
-     opposite meanings, and picks the latter as the default:
-
-          #define TARGET_SWITCHES \
-            { { "68020", 1},      \
-              { "68000", -1},     \
-              { "", 1}}
-
-`TARGET_OPTIONS'
-     This macro is similar to `TARGET_SWITCHES' but defines names of
-     command options that have values.  Its definition is an
-     initializer with a subgrouping for each command option.
-
-     Each subgrouping contains a string constant, that defines the
-     fixed part of the option name, and the address of a variable.  The
-     variable, type `char *', is set to the variable part of the given
-     option if the fixed part matches.  The actual option name is made
-     by appending `-m' to the specified name.
-
-     Here is an example which defines `-mshort-data-NUMBER'.  If the
-     given option is `-mshort-data-512', the variable `m88k_short_data'
-     will be set to the string `"512"'.
-
-          extern char *m88k_short_data;
-          #define TARGET_OPTIONS \
-           { { "short-data-", &m88k_short_data } }
-
-`TARGET_VERSION'
-     This macro is a C statement to print on `stderr' a string
-     describing the particular machine description choice.  Every
-     machine description should define `TARGET_VERSION'.  For example:
-
-          #ifdef MOTOROLA
-          #define TARGET_VERSION \
-            fprintf (stderr, " (68k, Motorola syntax)");
-          #else
-          #define TARGET_VERSION \
-            fprintf (stderr, " (68k, MIT syntax)");
-          #endif
-
-`OVERRIDE_OPTIONS'
-     Sometimes certain combinations of command options do not make
-     sense on a particular target machine.  You can define a macro
-     `OVERRIDE_OPTIONS' to take account of this.  This macro, if
-     defined, is executed once just after all the command options have
-     been parsed.
-
-     Don't use this macro to turn on various extra optimizations for
-     `-O'.  That is what `OPTIMIZATION_OPTIONS' is for.
-
-`OPTIMIZATION_OPTIONS (LEVEL)'
-     Some machines may desire to change what optimizations are
-     performed for various optimization levels.   This macro, if
-     defined, is executed once just after the optimization level is
-     determined and before the remainder of the command options have
-     been parsed.  Values set in this macro are used as the default
-     values for the other command line options.
-
-     LEVEL is the optimization level specified; 2 if `-O2' is
-     specified, 1 if `-O' is specified, and 0 if neither is specified.
-
-     You should not use this macro to change options that are not
-     machine-specific.  These should uniformly selected by the same
-     optimization level on all supported machines.  Use this macro to
-     enable machine-specific optimizations.
-
-     *Do not examine `write_symbols' in this macro!* The debugging
-     options are not supposed to alter the generated code.
-
-`CAN_DEBUG_WITHOUT_FP'
-     Define this macro if debugging can be performed even without a
-     frame pointer.  If this macro is defined, GNU CC will turn on the
-     `-fomit-frame-pointer' option whenever `-O' is specified.
-
-\1f
-File: gcc.info,  Node: Storage Layout,  Next: Type Layout,  Prev: Run-time Target,  Up: Target Macros
-
-Storage Layout
-==============
-
-   Note that the definitions of the macros in this table which are
-sizes or alignments measured in bits do not need to be constant.  They
-can be C expressions that refer to static variables, such as the
-`target_flags'.  *Note Run-time Target::.
-
-`BITS_BIG_ENDIAN'
-     Define this macro to have the value 1 if the most significant bit
-     in a byte has the lowest number; otherwise define it to have the
-     value zero.  This means that bit-field instructions count from the
-     most significant bit.  If the machine has no bit-field
-     instructions, then this must still be defined, but it doesn't
-     matter which value it is defined to.  This macro need not be a
-     constant.
-
-     This macro does not affect the way structure fields are packed into
-     bytes or words; that is controlled by `BYTES_BIG_ENDIAN'.
-
-`BYTES_BIG_ENDIAN'
-     Define this macro to have the value 1 if the most significant byte
-     in a word has the lowest number.  This macro need not be a
-     constant.
-
-`WORDS_BIG_ENDIAN'
-     Define this macro to have the value 1 if, in a multiword object,
-     the most significant word has the lowest number.  This applies to
-     both memory locations and registers; GNU CC fundamentally assumes
-     that the order of words in memory is the same as the order in
-     registers.  This macro need not be a constant.
-
-`LIBGCC2_WORDS_BIG_ENDIAN'
-     Define this macro if WORDS_BIG_ENDIAN is not constant.  This must
-     be a constant value with the same meaning as WORDS_BIG_ENDIAN,
-     which will be used only when compiling libgcc2.c.  Typically the
-     value will be set based on preprocessor defines.
-
-`FLOAT_WORDS_BIG_ENDIAN'
-     Define this macro to have the value 1 if `DFmode', `XFmode' or
-     `TFmode' floating point numbers are stored in memory with the word
-     containing the sign bit at the lowest address; otherwise define it
-     to have the value 0.  This macro need not be a constant.
-
-     You need not define this macro if the ordering is the same as for
-     multi-word integers.
-
-`BITS_PER_UNIT'
-     Define this macro to be the number of bits in an addressable
-     storage unit (byte); normally 8.
-
-`BITS_PER_WORD'
-     Number of bits in a word; normally 32.
-
-`MAX_BITS_PER_WORD'
-     Maximum number of bits in a word.  If this is undefined, the
-     default is `BITS_PER_WORD'.  Otherwise, it is the constant value
-     that is the largest value that `BITS_PER_WORD' can have at
-     run-time.
-
-`UNITS_PER_WORD'
-     Number of storage units in a word; normally 4.
-
-`MIN_UNITS_PER_WORD'
-     Minimum number of units in a word.  If this is undefined, the
-     default is `UNITS_PER_WORD'.  Otherwise, it is the constant value
-     that is the smallest value that `UNITS_PER_WORD' can have at
-     run-time.
-
-`POINTER_SIZE'
-     Width of a pointer, in bits.  You must specify a value no wider
-     than the width of `Pmode'.  If it is not equal to the width of
-     `Pmode', you must define `POINTERS_EXTEND_UNSIGNED'.
-
-`POINTERS_EXTEND_UNSIGNED'
-     A C expression whose value is nonzero if pointers that need to be
-     extended from being `POINTER_SIZE' bits wide to `Pmode' are
-     sign-extended and zero if they are zero-extended.
-
-     You need not define this macro if the `POINTER_SIZE' is equal to
-     the width of `Pmode'.
-
-`PROMOTE_MODE (M, UNSIGNEDP, TYPE)'
-     A macro to update M and UNSIGNEDP when an object whose type is
-     TYPE and which has the specified mode and signedness is to be
-     stored in a register.  This macro is only called when TYPE is a
-     scalar type.
-
-     On most RISC machines, which only have operations that operate on
-     a full register, define this macro to set M to `word_mode' if M is
-     an integer mode narrower than `BITS_PER_WORD'.  In most cases,
-     only integer modes should be widened because wider-precision
-     floating-point operations are usually more expensive than their
-     narrower counterparts.
-
-     For most machines, the macro definition does not change UNSIGNEDP.
-     However, some machines, have instructions that preferentially
-     handle either signed or unsigned quantities of certain modes.  For
-     example, on the DEC Alpha, 32-bit loads from memory and 32-bit add
-     instructions sign-extend the result to 64 bits.  On such machines,
-     set UNSIGNEDP according to which kind of extension is more
-     efficient.
-
-     Do not define this macro if it would never modify M.
-
-`PROMOTE_FUNCTION_ARGS'
-     Define this macro if the promotion described by `PROMOTE_MODE'
-     should also be done for outgoing function arguments.
-
-`PROMOTE_FUNCTION_RETURN'
-     Define this macro if the promotion described by `PROMOTE_MODE'
-     should also be done for the return value of functions.
-
-     If this macro is defined, `FUNCTION_VALUE' must perform the same
-     promotions done by `PROMOTE_MODE'.
-
-`PROMOTE_FOR_CALL_ONLY'
-     Define this macro if the promotion described by `PROMOTE_MODE'
-     should *only* be performed for outgoing function arguments or
-     function return values, as specified by `PROMOTE_FUNCTION_ARGS'
-     and `PROMOTE_FUNCTION_RETURN', respectively.
-
-`PARM_BOUNDARY'
-     Normal alignment required for function parameters on the stack, in
-     bits.  All stack parameters receive at least this much alignment
-     regardless of data type.  On most machines, this is the same as the
-     size of an integer.
-
-`STACK_BOUNDARY'
-     Define this macro if you wish to preserve a certain alignment for
-     the stack pointer.  The definition is a C expression for the
-     desired alignment (measured in bits).
-
-     If `PUSH_ROUNDING' is not defined, the stack will always be aligned
-     to the specified boundary.  If `PUSH_ROUNDING' is defined and
-     specifies a less strict alignment than `STACK_BOUNDARY', the stack
-     may be momentarily unaligned while pushing arguments.
-
-`FUNCTION_BOUNDARY'
-     Alignment required for a function entry point, in bits.
-
-`BIGGEST_ALIGNMENT'
-     Biggest alignment that any data type can require on this machine,
-     in bits.
-
-`MINIMUM_ATOMIC_ALIGNMENT'
-     If defined, the smallest alignment, in bits, that can be given to
-     an object that can be referenced in one operation, without
-     disturbing any nearby object.  Normally, this is `BITS_PER_UNIT',
-     but may be larger on machines that don't have byte or half-word
-     store operations.
-
-`BIGGEST_FIELD_ALIGNMENT'
-     Biggest alignment that any structure field can require on this
-     machine, in bits.  If defined, this overrides `BIGGEST_ALIGNMENT'
-     for structure fields only.
-
-`ADJUST_FIELD_ALIGN (FIELD, COMPUTED)'
-     An expression for the alignment of a structure field FIELD if the
-     alignment computed in the usual way is COMPUTED.  GNU CC uses this
-     value instead of the value in `BIGGEST_ALIGNMENT' or
-     `BIGGEST_FIELD_ALIGNMENT', if defined, for structure fields only.
-
-`MAX_OFILE_ALIGNMENT'
-     Biggest alignment supported by the object file format of this
-     machine.  Use this macro to limit the alignment which can be
-     specified using the `__attribute__ ((aligned (N)))' construct.  If
-     not defined, the default value is `BIGGEST_ALIGNMENT'.
-
-`DATA_ALIGNMENT (TYPE, BASIC-ALIGN)'
-     If defined, a C expression to compute the alignment for a static
-     variable.  TYPE is the data type, and BASIC-ALIGN is the alignment
-     that the object would ordinarily have.  The value of this macro is
-     used instead of that alignment to align the object.
-
-     If this macro is not defined, then BASIC-ALIGN is used.
-
-     One use of this macro is to increase alignment of medium-size data
-     to make it all fit in fewer cache lines.  Another is to cause
-     character arrays to be word-aligned so that `strcpy' calls that
-     copy constants to character arrays can be done inline.
-
-`CONSTANT_ALIGNMENT (CONSTANT, BASIC-ALIGN)'
-     If defined, a C expression to compute the alignment given to a
-     constant that is being placed in memory.  CONSTANT is the constant
-     and BASIC-ALIGN is the alignment that the object would ordinarily
-     have.  The value of this macro is used instead of that alignment to
-     align the object.
-
-     If this macro is not defined, then BASIC-ALIGN is used.
-
-     The typical use of this macro is to increase alignment for string
-     constants to be word aligned so that `strcpy' calls that copy
-     constants can be done inline.
-
-`EMPTY_FIELD_BOUNDARY'
-     Alignment in bits to be given to a structure bit field that
-     follows an empty field such as `int : 0;'.
-
-     Note that `PCC_BITFIELD_TYPE_MATTERS' also affects the alignment
-     that results from an empty field.
-
-`STRUCTURE_SIZE_BOUNDARY'
-     Number of bits which any structure or union's size must be a
-     multiple of.  Each structure or union's size is rounded up to a
-     multiple of this.
-
-     If you do not define this macro, the default is the same as
-     `BITS_PER_UNIT'.
-
-`STRICT_ALIGNMENT'
-     Define this macro to be the value 1 if instructions will fail to
-     work if given data not on the nominal alignment.  If instructions
-     will merely go slower in that case, define this macro as 0.
-
-`PCC_BITFIELD_TYPE_MATTERS'
-     Define this if you wish to imitate the way many other C compilers
-     handle alignment of bitfields and the structures that contain them.
-
-     The behavior is that the type written for a bitfield (`int',
-     `short', or other integer type) imposes an alignment for the
-     entire structure, as if the structure really did contain an
-     ordinary field of that type.  In addition, the bitfield is placed
-     within the structure so that it would fit within such a field, not
-     crossing a boundary for it.
-
-     Thus, on most machines, a bitfield whose type is written as `int'
-     would not cross a four-byte boundary, and would force four-byte
-     alignment for the whole structure.  (The alignment used may not be
-     four bytes; it is controlled by the other alignment parameters.)
-
-     If the macro is defined, its definition should be a C expression;
-     a nonzero value for the expression enables this behavior.
-
-     Note that if this macro is not defined, or its value is zero, some
-     bitfields may cross more than one alignment boundary.  The
-     compiler can support such references if there are `insv', `extv',
-     and `extzv' insns that can directly reference memory.
-
-     The other known way of making bitfields work is to define
-     `STRUCTURE_SIZE_BOUNDARY' as large as `BIGGEST_ALIGNMENT'.  Then
-     every structure can be accessed with fullwords.
-
-     Unless the machine has bitfield instructions or you define
-     `STRUCTURE_SIZE_BOUNDARY' that way, you must define
-     `PCC_BITFIELD_TYPE_MATTERS' to have a nonzero value.
-
-     If your aim is to make GNU CC use the same conventions for laying
-     out bitfields as are used by another compiler, here is how to
-     investigate what the other compiler does.  Compile and run this
-     program:
-
-          struct foo1
-          {
-            char x;
-            char :0;
-            char y;
-          };
-          
-          struct foo2
-          {
-            char x;
-            int :0;
-            char y;
-          };
-          
-          main ()
-          {
-            printf ("Size of foo1 is %d\n",
-                    sizeof (struct foo1));
-            printf ("Size of foo2 is %d\n",
-                    sizeof (struct foo2));
-            exit (0);
-          }
-
-     If this prints 2 and 5, then the compiler's behavior is what you
-     would get from `PCC_BITFIELD_TYPE_MATTERS'.
-
-`BITFIELD_NBYTES_LIMITED'
-     Like PCC_BITFIELD_TYPE_MATTERS except that its effect is limited to
-     aligning a bitfield within the structure.
-
-`ROUND_TYPE_SIZE (STRUCT, SIZE, ALIGN)'
-     Define this macro as an expression for the overall size of a
-     structure (given by STRUCT as a tree node) when the size computed
-     from the fields is SIZE and the alignment is ALIGN.
-
-     The default is to round SIZE up to a multiple of ALIGN.
-
-`ROUND_TYPE_ALIGN (STRUCT, COMPUTED, SPECIFIED)'
-     Define this macro as an expression for the alignment of a structure
-     (given by STRUCT as a tree node) if the alignment computed in the
-     usual way is COMPUTED and the alignment explicitly specified was
-     SPECIFIED.
-
-     The default is to use SPECIFIED if it is larger; otherwise, use
-     the smaller of COMPUTED and `BIGGEST_ALIGNMENT'
-
-`MAX_FIXED_MODE_SIZE'
-     An integer expression for the size in bits of the largest integer
-     machine mode that should actually be used.  All integer machine
-     modes of this size or smaller can be used for structures and
-     unions with the appropriate sizes.  If this macro is undefined,
-     `GET_MODE_BITSIZE (DImode)' is assumed.
-
-`CHECK_FLOAT_VALUE (MODE, VALUE, OVERFLOW)'
-     A C statement to validate the value VALUE (of type `double') for
-     mode MODE.  This means that you check whether VALUE fits within
-     the possible range of values for mode MODE on this target machine.
-     The mode MODE is always a mode of class `MODE_FLOAT'.  OVERFLOW
-     is nonzero if the value is already known to be out of range.
-
-     If VALUE is not valid or if OVERFLOW is nonzero, you should set
-     OVERFLOW to 1 and then assign some valid value to VALUE.  Allowing
-     an invalid value to go through the compiler can produce incorrect
-     assembler code which may even cause Unix assemblers to crash.
-
-     This macro need not be defined if there is no work for it to do.
-
-`TARGET_FLOAT_FORMAT'
-     A code distinguishing the floating point format of the target
-     machine.  There are three defined values:
-
-    `IEEE_FLOAT_FORMAT'
-          This code indicates IEEE floating point.  It is the default;
-          there is no need to define this macro when the format is IEEE.
-
-    `VAX_FLOAT_FORMAT'
-          This code indicates the peculiar format used on the Vax.
-
-    `UNKNOWN_FLOAT_FORMAT'
-          This code indicates any other format.
-
-     The value of this macro is compared with `HOST_FLOAT_FORMAT'
-     (*note Config::.) to determine whether the target machine has the
-     same format as the host machine.  If any other formats are
-     actually in use on supported machines, new codes should be defined
-     for them.
-
-     The ordering of the component words of floating point values
-     stored in memory is controlled by `FLOAT_WORDS_BIG_ENDIAN' for the
-     target machine and `HOST_FLOAT_WORDS_BIG_ENDIAN' for the host.
-
-`DEFAULT_VTABLE_THUNKS'
-     GNU CC supports two ways of implementing C++ vtables:  traditional
-     or with so-called "thunks".  The flag `-fvtable-thunk' chooses
-     between them.  Define this macro to be a C expression for the
-     default value of that flag.  If `DEFAULT_VTABLE_THUNKS' is 0, GNU
-     CC uses the traditional implementation by default.  The "thunk"
-     implementation is more efficient (especially if you have provided
-     an implementation of `ASM_OUTPUT_MI_THUNK', see *Note Function
-     Entry::), but is not binary compatible with code compiled using
-     the traditional implementation.  If you are writing a new ports,
-     define `DEFAULT_VTABLE_THUNKS' to 1.
-
-     If you do not define this macro, the default for `-fvtable-thunk'
-     is 0.
-
-\1f
-File: gcc.info,  Node: Type Layout,  Next: Registers,  Prev: Storage Layout,  Up: Target Macros
-
-Layout of Source Language Data Types
-====================================
-
-   These macros define the sizes and other characteristics of the
-standard basic data types used in programs being compiled.  Unlike the
-macros in the previous section, these apply to specific features of C
-and related languages, rather than to fundamental aspects of storage
-layout.
-
-`INT_TYPE_SIZE'
-     A C expression for the size in bits of the type `int' on the
-     target machine.  If you don't define this, the default is one word.
-
-`MAX_INT_TYPE_SIZE'
-     Maximum number for the size in bits of the type `int' on the target
-     machine.  If this is undefined, the default is `INT_TYPE_SIZE'.
-     Otherwise, it is the constant value that is the largest value that
-     `INT_TYPE_SIZE' can have at run-time.  This is used in `cpp'.
-
-`SHORT_TYPE_SIZE'
-     A C expression for the size in bits of the type `short' on the
-     target machine.  If you don't define this, the default is half a
-     word.  (If this would be less than one storage unit, it is rounded
-     up to one unit.)
-
-`LONG_TYPE_SIZE'
-     A C expression for the size in bits of the type `long' on the
-     target machine.  If you don't define this, the default is one word.
-
-`MAX_LONG_TYPE_SIZE'
-     Maximum number for the size in bits of the type `long' on the
-     target machine.  If this is undefined, the default is
-     `LONG_TYPE_SIZE'.  Otherwise, it is the constant value that is the
-     largest value that `LONG_TYPE_SIZE' can have at run-time.  This is
-     used in `cpp'.
-
-`LONG_LONG_TYPE_SIZE'
-     A C expression for the size in bits of the type `long long' on the
-     target machine.  If you don't define this, the default is two
-     words.  If you want to support GNU Ada on your machine, the value
-     of macro must be at least 64.
-
-`CHAR_TYPE_SIZE'
-     A C expression for the size in bits of the type `char' on the
-     target machine.  If you don't define this, the default is one
-     quarter of a word.  (If this would be less than one storage unit,
-     it is rounded up to one unit.)
-
-`MAX_CHAR_TYPE_SIZE'
-     Maximum number for the size in bits of the type `char' on the
-     target machine.  If this is undefined, the default is
-     `CHAR_TYPE_SIZE'.  Otherwise, it is the constant value that is the
-     largest value that `CHAR_TYPE_SIZE' can have at run-time.  This is
-     used in `cpp'.
-
-`FLOAT_TYPE_SIZE'
-     A C expression for the size in bits of the type `float' on the
-     target machine.  If you don't define this, the default is one word.
-
-`DOUBLE_TYPE_SIZE'
-     A C expression for the size in bits of the type `double' on the
-     target machine.  If you don't define this, the default is two
-     words.
-
-`LONG_DOUBLE_TYPE_SIZE'
-     A C expression for the size in bits of the type `long double' on
-     the target machine.  If you don't define this, the default is two
-     words.
-
-`WIDEST_HARDWARE_FP_SIZE'
-     A C expression for the size in bits of the widest floating-point
-     format supported by the hardware.  If you define this macro, you
-     must specify a value less than or equal to the value of
-     `LONG_DOUBLE_TYPE_SIZE'.  If you do not define this macro, the
-     value of `LONG_DOUBLE_TYPE_SIZE' is the default.
-
-`DEFAULT_SIGNED_CHAR'
-     An expression whose value is 1 or 0, according to whether the type
-     `char' should be signed or unsigned by default.  The user can
-     always override this default with the options `-fsigned-char' and
-     `-funsigned-char'.
-
-`DEFAULT_SHORT_ENUMS'
-     A C expression to determine whether to give an `enum' type only as
-     many bytes as it takes to represent the range of possible values
-     of that type.  A nonzero value means to do that; a zero value
-     means all `enum' types should be allocated like `int'.
-
-     If you don't define the macro, the default is 0.
-
-`SIZE_TYPE'
-     A C expression for a string describing the name of the data type
-     to use for size values.  The typedef name `size_t' is defined
-     using the contents of the string.
-
-     The string can contain more than one keyword.  If so, separate
-     them with spaces, and write first any length keyword, then
-     `unsigned' if appropriate, and finally `int'.  The string must
-     exactly match one of the data type names defined in the function
-     `init_decl_processing' in the file `c-decl.c'.  You may not omit
-     `int' or change the order--that would cause the compiler to crash
-     on startup.
-
-     If you don't define this macro, the default is `"long unsigned
-     int"'.
-
-`PTRDIFF_TYPE'
-     A C expression for a string describing the name of the data type
-     to use for the result of subtracting two pointers.  The typedef
-     name `ptrdiff_t' is defined using the contents of the string.  See
-     `SIZE_TYPE' above for more information.
-
-     If you don't define this macro, the default is `"long int"'.
-
-`WCHAR_TYPE'
-     A C expression for a string describing the name of the data type
-     to use for wide characters.  The typedef name `wchar_t' is defined
-     using the contents of the string.  See `SIZE_TYPE' above for more
-     information.
-
-     If you don't define this macro, the default is `"int"'.
-
-`WCHAR_TYPE_SIZE'
-     A C expression for the size in bits of the data type for wide
-     characters.  This is used in `cpp', which cannot make use of
-     `WCHAR_TYPE'.
-
-`MAX_WCHAR_TYPE_SIZE'
-     Maximum number for the size in bits of the data type for wide
-     characters.  If this is undefined, the default is
-     `WCHAR_TYPE_SIZE'.  Otherwise, it is the constant value that is the
-     largest value that `WCHAR_TYPE_SIZE' can have at run-time.  This is
-     used in `cpp'.
-
-`OBJC_INT_SELECTORS'
-     Define this macro if the type of Objective C selectors should be
-     `int'.
-
-     If this macro is not defined, then selectors should have the type
-     `struct objc_selector *'.
-
-`OBJC_SELECTORS_WITHOUT_LABELS'
-     Define this macro if the compiler can group all the selectors
-     together into a vector and use just one label at the beginning of
-     the vector.  Otherwise, the compiler must give each selector its
-     own assembler label.
-
-     On certain machines, it is important to have a separate label for
-     each selector because this enables the linker to eliminate
-     duplicate selectors.
-
-`TARGET_BELL'
-     A C constant expression for the integer value for escape sequence
-     `\a'.
-
-`TARGET_BS'
-`TARGET_TAB'
-`TARGET_NEWLINE'
-     C constant expressions for the integer values for escape sequences
-     `\b', `\t' and `\n'.
-
-`TARGET_VT'
-`TARGET_FF'
-`TARGET_CR'
-     C constant expressions for the integer values for escape sequences
-     `\v', `\f' and `\r'.
-
diff --git a/gcc/gcc.info-21 b/gcc/gcc.info-21
deleted file mode 100644 (file)
index 72ee0b7..0000000
+++ /dev/null
@@ -1,1028 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Registers,  Next: Register Classes,  Prev: Type Layout,  Up: Target Macros
-
-Register Usage
-==============
-
-   This section explains how to describe what registers the target
-machine has, and how (in general) they can be used.
-
-   The description of which registers a specific instruction can use is
-done with register classes; see *Note Register Classes::.  For
-information on using registers to access a stack frame, see *Note Frame
-Registers::.  For passing values in registers, see *Note Register
-Arguments::.  For returning values in registers, see *Note Scalar
-Return::.
-
-* Menu:
-
-* Register Basics::            Number and kinds of registers.
-* Allocation Order::           Order in which registers are allocated.
-* Values in Registers::                What kinds of values each reg can hold.
-* Leaf Functions::             Renumbering registers for leaf functions.
-* Stack Registers::            Handling a register stack such as 80387.
-* Obsolete Register Macros::   Macros formerly used for the 80387.
-
-\1f
-File: gcc.info,  Node: Register Basics,  Next: Allocation Order,  Up: Registers
-
-Basic Characteristics of Registers
-----------------------------------
-
-   Registers have various characteristics.
-
-`FIRST_PSEUDO_REGISTER'
-     Number of hardware registers known to the compiler.  They receive
-     numbers 0 through `FIRST_PSEUDO_REGISTER-1'; thus, the first
-     pseudo register's number really is assigned the number
-     `FIRST_PSEUDO_REGISTER'.
-
-`FIXED_REGISTERS'
-     An initializer that says which registers are used for fixed
-     purposes all throughout the compiled code and are therefore not
-     available for general allocation.  These would include the stack
-     pointer, the frame pointer (except on machines where that can be
-     used as a general register when no frame pointer is needed), the
-     program counter on machines where that is considered one of the
-     addressable registers, and any other numbered register with a
-     standard use.
-
-     This information is expressed as a sequence of numbers, separated
-     by commas and surrounded by braces.  The Nth number is 1 if
-     register N is fixed, 0 otherwise.
-
-     The table initialized from this macro, and the table initialized by
-     the following one, may be overridden at run time either
-     automatically, by the actions of the macro
-     `CONDITIONAL_REGISTER_USAGE', or by the user with the command
-     options `-ffixed-REG', `-fcall-used-REG' and `-fcall-saved-REG'.
-
-`CALL_USED_REGISTERS'
-     Like `FIXED_REGISTERS' but has 1 for each register that is
-     clobbered (in general) by function calls as well as for fixed
-     registers.  This macro therefore identifies the registers that are
-     not available for general allocation of values that must live
-     across function calls.
-
-     If a register has 0 in `CALL_USED_REGISTERS', the compiler
-     automatically saves it on function entry and restores it on
-     function exit, if the register is used within the function.
-
-`CONDITIONAL_REGISTER_USAGE'
-     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.
-
-     This is necessary in case the fixed or call-clobbered registers
-     depend on target flags.
-
-     You need not define this macro if it has no work to do.
-
-     If the usage of an entire class of registers depends on the target
-     flags, you may indicate this to GCC by using this macro to modify
-     `fixed_regs' and `call_used_regs' to 1 for each of the registers
-     in the classes which should not be used by GCC.  Also define the
-     macro `REG_CLASS_FROM_LETTER' to return `NO_REGS' if it is called
-     with a letter for a class that shouldn't be used.
-
-     (However, if this class is not included in `GENERAL_REGS' and all
-     of the insn patterns whose constraints permit this class are
-     controlled by target switches, then GCC will automatically avoid
-     using these registers when the target switches are opposed to
-     them.)
-
-`NON_SAVING_SETJMP'
-     If this macro is defined and has a nonzero value, it means that
-     `setjmp' and related functions fail to save the registers, or that
-     `longjmp' fails to restore them.  To compensate, the compiler
-     avoids putting variables in registers in functions that use
-     `setjmp'.
-
-`INCOMING_REGNO (OUT)'
-     Define this macro if the target machine has register windows.
-     This C expression returns the register number as seen by the
-     called function corresponding to the register number OUT as seen
-     by the calling function.  Return OUT if register number OUT is not
-     an outbound register.
-
-`OUTGOING_REGNO (IN)'
-     Define this macro if the target machine has register windows.
-     This C expression returns the register number as seen by the
-     calling function corresponding to the register number IN as seen
-     by the called function.  Return IN if register number IN is not an
-     inbound register.
-
-\1f
-File: gcc.info,  Node: Allocation Order,  Next: Values in Registers,  Prev: Register Basics,  Up: Registers
-
-Order of Allocation of Registers
---------------------------------
-
-   Registers are allocated in order.
-
-`REG_ALLOC_ORDER'
-     If defined, an initializer for a vector of integers, containing the
-     numbers of hard registers in the order in which GNU CC should
-     prefer to use them (from most preferred to least).
-
-     If this macro is not defined, registers are used lowest numbered
-     first (all else being equal).
-
-     One use of this macro is on machines where the highest numbered
-     registers must always be saved and the save-multiple-registers
-     instruction supports only sequences of consecutive registers.  On
-     such machines, define `REG_ALLOC_ORDER' to be an initializer that
-     lists the highest numbered allocatable register first.
-
-`ORDER_REGS_FOR_LOCAL_ALLOC'
-     A C statement (sans semicolon) to choose the order in which to
-     allocate hard registers for pseudo-registers local to a basic
-     block.
-
-     Store the desired register order in the array `reg_alloc_order'.
-     Element 0 should be the register to allocate first; element 1, the
-     next register; and so on.
-
-     The macro body should not assume anything about the contents of
-     `reg_alloc_order' before execution of the macro.
-
-     On most machines, it is not necessary to define this macro.
-
-\1f
-File: gcc.info,  Node: Values in Registers,  Next: Leaf Functions,  Prev: Allocation Order,  Up: Registers
-
-How Values Fit in Registers
----------------------------
-
-   This section discusses the macros that describe which kinds of values
-(specifically, which machine modes) each register can hold, and how many
-consecutive registers are needed for a given mode.
-
-`HARD_REGNO_NREGS (REGNO, MODE)'
-     A C expression for the number of consecutive hard registers,
-     starting at register number REGNO, required to hold a value of mode
-     MODE.
-
-     On a machine where all registers are exactly one word, a suitable
-     definition of this macro is
-
-          #define HARD_REGNO_NREGS(REGNO, MODE)            \
-             ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1)  \
-              / UNITS_PER_WORD))
-
-`HARD_REGNO_MODE_OK (REGNO, MODE)'
-     A C expression that is nonzero if it is permissible to store a
-     value of mode MODE in hard register number REGNO (or in several
-     registers starting with that one).  For a machine where all
-     registers are equivalent, a suitable definition is
-
-          #define HARD_REGNO_MODE_OK(REGNO, MODE) 1
-
-     You need not include code to check for the numbers of fixed
-     registers, because the allocation mechanism considers them to be
-     always occupied.
-
-     On some machines, double-precision values must be kept in even/odd
-     register pairs.  You can implement that by defining this macro to
-     reject odd register numbers for such modes.
-
-     The minimum requirement for a mode to be OK in a register is that
-     the `movMODE' instruction pattern support moves between the
-     register and other hard register in the same class and that moving
-     a value into the register and back out not alter it.
-
-     Since the same instruction used to move `word_mode' will work for
-     all narrower integer modes, it is not necessary on any machine for
-     `HARD_REGNO_MODE_OK' to distinguish between these modes, provided
-     you define patterns `movhi', etc., to take advantage of this.  This
-     is useful because of the interaction between `HARD_REGNO_MODE_OK'
-     and `MODES_TIEABLE_P'; it is very desirable for all integer modes
-     to be tieable.
-
-     Many machines have special registers for floating point arithmetic.
-     Often people assume that floating point machine modes are allowed
-     only in floating point registers.  This is not true.  Any
-     registers that can hold integers can safely *hold* a floating
-     point machine mode, whether or not floating arithmetic can be done
-     on it in those registers.  Integer move instructions can be used
-     to move the values.
-
-     On some machines, though, the converse is true: fixed-point machine
-     modes may not go in floating registers.  This is true if the
-     floating registers normalize any value stored in them, because
-     storing a non-floating value there would garble it.  In this case,
-     `HARD_REGNO_MODE_OK' should reject fixed-point machine modes in
-     floating registers.  But if the floating registers do not
-     automatically normalize, if you can store any bit pattern in one
-     and retrieve it unchanged without a trap, then any machine mode
-     may go in a floating register, so you can define this macro to say
-     so.
-
-     The primary significance of special floating registers is rather
-     that they are the registers acceptable in floating point arithmetic
-     instructions.  However, this is of no concern to
-     `HARD_REGNO_MODE_OK'.  You handle it by writing the proper
-     constraints for those instructions.
-
-     On some machines, the floating registers are especially slow to
-     access, so that it is better to store a value in a stack frame
-     than in such a register if floating point arithmetic is not being
-     done.  As long as the floating registers are not in class
-     `GENERAL_REGS', they will not be used unless some pattern's
-     constraint asks for one.
-
-`MODES_TIEABLE_P (MODE1, MODE2)'
-     A C expression that is nonzero if a value of mode MODE1 is
-     accessable in mode MODE2 without copying.
-
-     If `HARD_REGNO_MODE_OK (R, MODE1)' and `HARD_REGNO_MODE_OK (R,
-     MODE2)' are always the same for any R, then `MODES_TIEABLE_P
-     (MODE1, MODE2)' should be nonzero.  If they differ for any R, you
-     should define this macro to return zero unless some other
-     mechanism ensures the accessability of the value in a narrower
-     mode.
-
-     You should define this macro to return nonzero in as many cases as
-     possible since doing so will allow GNU CC to perform better
-     register allocation.
-
-\1f
-File: gcc.info,  Node: Leaf Functions,  Next: Stack Registers,  Prev: Values in Registers,  Up: Registers
-
-Handling Leaf Functions
------------------------
-
-   On some machines, a leaf function (i.e., one which makes no calls)
-can run more efficiently if it does not make its own register window.
-Often this means it is required to receive its arguments in the
-registers where they are passed by the caller, instead of the registers
-where they would normally arrive.
-
-   The special treatment for leaf functions generally applies only when
-other conditions are met; for example, often they may use only those
-registers for its own variables and temporaries.  We use the term "leaf
-function" to mean a function that is suitable for this special
-handling, so that functions with no calls are not necessarily "leaf
-functions".
-
-   GNU CC assigns register numbers before it knows whether the function
-is suitable for leaf function treatment.  So it needs to renumber the
-registers in order to output a leaf function.  The following macros
-accomplish this.
-
-`LEAF_REGISTERS'
-     A C initializer for a vector, indexed by hard register number,
-     which contains 1 for a register that is allowable in a candidate
-     for leaf function treatment.
-
-     If leaf function treatment involves renumbering the registers,
-     then the registers marked here should be the ones before
-     renumbering--those that GNU CC would ordinarily allocate.  The
-     registers which will actually be used in the assembler code, after
-     renumbering, should not be marked with 1 in this vector.
-
-     Define this macro only if the target machine offers a way to
-     optimize the treatment of leaf functions.
-
-`LEAF_REG_REMAP (REGNO)'
-     A C expression whose value is the register number to which REGNO
-     should be renumbered, when a function is treated as a leaf
-     function.
-
-     If REGNO is a register number which should not appear in a leaf
-     function before renumbering, then the expression should yield -1,
-     which will cause the compiler to abort.
-
-     Define this macro only if the target machine offers a way to
-     optimize the treatment of leaf functions, and registers need to be
-     renumbered to do this.
-
-   Normally, `FUNCTION_PROLOGUE' and `FUNCTION_EPILOGUE' must treat
-leaf functions specially.  It can test the C variable `leaf_function'
-which is nonzero for leaf functions.  (The variable `leaf_function' is
-defined only if `LEAF_REGISTERS' is defined.)
-
-\1f
-File: gcc.info,  Node: Stack Registers,  Next: Obsolete Register Macros,  Prev: Leaf Functions,  Up: Registers
-
-Registers That Form a Stack
----------------------------
-
-   There are special features to handle computers where some of the
-"registers" form a stack, as in the 80387 coprocessor for the 80386.
-Stack registers are normally written by pushing onto the stack, and are
-numbered relative to the top of the stack.
-
-   Currently, GNU CC can only handle one group of stack-like registers,
-and they must be consecutively numbered.
-
-`STACK_REGS'
-     Define this if the machine has any stack-like registers.
-
-`FIRST_STACK_REG'
-     The number of the first stack-like register.  This one is the top
-     of the stack.
-
-`LAST_STACK_REG'
-     The number of the last stack-like register.  This one is the
-     bottom of the stack.
-
-\1f
-File: gcc.info,  Node: Obsolete Register Macros,  Prev: Stack Registers,  Up: Registers
-
-Obsolete Macros for Controlling Register Usage
-----------------------------------------------
-
-   These features do not work very well.  They exist because they used
-to be required to generate correct code for the 80387 coprocessor of the
-80386.  They are no longer used by that machine description and may be
-removed in a later version of the compiler.  Don't use them!
-
-`OVERLAPPING_REGNO_P (REGNO)'
-     If defined, this is a C expression whose value is nonzero if hard
-     register number REGNO is an overlapping register.  This means a
-     hard register which overlaps a hard register with a different
-     number.  (Such overlap is undesirable, but occasionally it allows
-     a machine to be supported which otherwise could not be.)  This
-     macro must return nonzero for *all* the registers which overlap
-     each other.  GNU CC can use an overlapping register only in
-     certain limited ways.  It can be used for allocation within a
-     basic block, and may be spilled for reloading; that is all.
-
-     If this macro is not defined, it means that none of the hard
-     registers overlap each other.  This is the usual situation.
-
-`INSN_CLOBBERS_REGNO_P (INSN, REGNO)'
-     If defined, this is a C expression whose value should be nonzero if
-     the insn INSN has the effect of mysteriously clobbering the
-     contents of hard register number REGNO.  By "mysterious" we mean
-     that the insn's RTL expression doesn't describe such an effect.
-
-     If this macro is not defined, it means that no insn clobbers
-     registers mysteriously.  This is the usual situation; all else
-     being equal, it is best for the RTL expression to show all the
-     activity.
-
-`PRESERVE_DEATH_INFO_REGNO_P (REGNO)'
-     If defined, this is a C expression whose value is nonzero if
-     correct `REG_DEAD' notes are needed for hard register number REGNO
-     after reload.
-
-     You would arrange to preserve death info for a register when some
-     of the code in the machine description which is executed to write
-     the assembler code looks at the death notes.  This is necessary
-     only when the actual hardware feature which GNU CC thinks of as a
-     register is not actually a register of the usual sort.  (It might,
-     for example, be a hardware stack.)
-
-     It is also useful for peepholes and linker relaxation.
-
-     If this macro is not defined, it means that no death notes need to
-     be preserved, and some may even be incorrect.  This is the usual
-     situation.
-
-\1f
-File: gcc.info,  Node: Register Classes,  Next: Stack and Calling,  Prev: Registers,  Up: Target Macros
-
-Register Classes
-================
-
-   On many machines, the numbered registers are not all equivalent.
-For example, certain registers may not be allowed for indexed
-addressing; certain registers may not be allowed in some instructions.
-These machine restrictions are described to the compiler using
-"register classes".
-
-   You define a number of register classes, giving each one a name and
-saying which of the registers belong to it.  Then you can specify
-register classes that are allowed as operands to particular instruction
-patterns.
-
-   In general, each register will belong to several classes.  In fact,
-one class must be named `ALL_REGS' and contain all the registers.
-Another class must be named `NO_REGS' and contain no registers.  Often
-the union of two classes will be another class; however, this is not
-required.
-
-   One of the classes must be named `GENERAL_REGS'.  There is nothing
-terribly special about the name, but the operand constraint letters `r'
-and `g' specify this class.  If `GENERAL_REGS' is the same as
-`ALL_REGS', just define it as a macro which expands to `ALL_REGS'.
-
-   Order the classes so that if class X is contained in class Y then X
-has a lower class number than Y.
-
-   The way classes other than `GENERAL_REGS' are specified in operand
-constraints is through machine-dependent operand constraint letters.
-You can define such letters to correspond to various classes, then use
-them in operand constraints.
-
-   You should define a class for the union of two classes whenever some
-instruction allows both classes.  For example, if an instruction allows
-either a floating point (coprocessor) register or a general register
-for a certain operand, you should define a class `FLOAT_OR_GENERAL_REGS'
-which includes both of them.  Otherwise you will get suboptimal code.
-
-   You must also specify certain redundant information about the
-register classes: for each class, which classes contain it and which
-ones are contained in it; for each pair of classes, the largest class
-contained in their union.
-
-   When a value occupying several consecutive registers is expected in a
-certain class, all the registers used must belong to that class.
-Therefore, register classes cannot be used to enforce a requirement for
-a register pair to start with an even-numbered register.  The way to
-specify this requirement is with `HARD_REGNO_MODE_OK'.
-
-   Register classes used for input-operands of bitwise-and or shift
-instructions have a special requirement: each such class must have, for
-each fixed-point machine mode, a subclass whose registers can transfer
-that mode to or from memory.  For example, on some machines, the
-operations for single-byte values (`QImode') are limited to certain
-registers.  When this is so, each register class that is used in a
-bitwise-and or shift instruction must have a subclass consisting of
-registers from which single-byte values can be loaded or stored.  This
-is so that `PREFERRED_RELOAD_CLASS' can always have a possible value to
-return.
-
-`enum reg_class'
-     An enumeral type that must be defined with all the register class
-     names as enumeral values.  `NO_REGS' must be first.  `ALL_REGS'
-     must be the last register class, followed by one more enumeral
-     value, `LIM_REG_CLASSES', which is not a register class but rather
-     tells how many classes there are.
-
-     Each register class has a number, which is the value of casting
-     the class name to type `int'.  The number serves as an index in
-     many of the tables described below.
-
-`N_REG_CLASSES'
-     The number of distinct register classes, defined as follows:
-
-          #define N_REG_CLASSES (int) LIM_REG_CLASSES
-
-`REG_CLASS_NAMES'
-     An initializer containing the names of the register classes as C
-     string constants.  These names are used in writing some of the
-     debugging dumps.
-
-`REG_CLASS_CONTENTS'
-     An initializer containing the contents of the register classes, as
-     integers which are bit masks.  The Nth integer specifies the
-     contents of class N.  The way the integer MASK is interpreted is
-     that register R is in the class if `MASK & (1 << R)' is 1.
-
-     When the machine has more than 32 registers, an integer does not
-     suffice.  Then the integers are replaced by sub-initializers,
-     braced groupings containing several integers.  Each
-     sub-initializer must be suitable as an initializer for the type
-     `HARD_REG_SET' which is defined in `hard-reg-set.h'.
-
-`REGNO_REG_CLASS (REGNO)'
-     A C expression whose value is a register class containing hard
-     register REGNO.  In general there is more than one such class;
-     choose a class which is "minimal", meaning that no smaller class
-     also contains the register.
-
-`BASE_REG_CLASS'
-     A macro whose definition is the name of the class to which a valid
-     base register must belong.  A base register is one used in an
-     address which is the register value plus a displacement.
-
-`INDEX_REG_CLASS'
-     A macro whose definition is the name of the class to which a valid
-     index register must belong.  An index register is one used in an
-     address where its value is either multiplied by a scale factor or
-     added to another register (as well as added to a displacement).
-
-`REG_CLASS_FROM_LETTER (CHAR)'
-     A C expression which defines the machine-dependent operand
-     constraint letters for register classes.  If CHAR is such a
-     letter, the value should be the register class corresponding to
-     it.  Otherwise, the value should be `NO_REGS'.  The register
-     letter `r', corresponding to class `GENERAL_REGS', will not be
-     passed to this macro; you do not need to handle it.
-
-`REGNO_OK_FOR_BASE_P (NUM)'
-     A C expression which is nonzero if register number NUM is suitable
-     for use as a base register in operand addresses.  It may be either
-     a suitable hard register or a pseudo register that has been
-     allocated such a hard register.
-
-`REGNO_MODE_OK_FOR_BASE_P (NUM, MODE)'
-     A C expression that is just like `REGNO_OK_FOR_BASE_P', except that
-     that expression may examine the mode of the memory reference in
-     MODE.  You should define this macro if the mode of the memory
-     reference affects whether a register may be used as a base
-     register.  If you define this macro, the compiler will use it
-     instead of `REGNO_OK_FOR_BASE_P'.
-
-`REGNO_OK_FOR_INDEX_P (NUM)'
-     A C expression which is nonzero if register number NUM is suitable
-     for use as an index register in operand addresses.  It may be
-     either a suitable hard register or a pseudo register that has been
-     allocated such a hard register.
-
-     The difference between an index register and a base register is
-     that the index register may be scaled.  If an address involves the
-     sum of two registers, neither one of them scaled, then either one
-     may be labeled the "base" and the other the "index"; but whichever
-     labeling is used must fit the machine's constraints of which
-     registers may serve in each capacity.  The compiler will try both
-     labelings, looking for one that is valid, and will reload one or
-     both registers only if neither labeling works.
-
-`PREFERRED_RELOAD_CLASS (X, CLASS)'
-     A C expression that places additional restrictions on the register
-     class to use when it is necessary to copy value X into a register
-     in class CLASS.  The value is a register class; perhaps CLASS, or
-     perhaps another, smaller class.  On many machines, the following
-     definition is safe:
-
-          #define PREFERRED_RELOAD_CLASS(X,CLASS) CLASS
-
-     Sometimes returning a more restrictive class makes better code.
-     For example, on the 68000, when X is an integer constant that is
-     in range for a `moveq' instruction, the value of this macro is
-     always `DATA_REGS' as long as CLASS includes the data registers.
-     Requiring a data register guarantees that a `moveq' will be used.
-
-     If X is a `const_double', by returning `NO_REGS' you can force X
-     into a memory constant.  This is useful on certain machines where
-     immediate floating values cannot be loaded into certain kinds of
-     registers.
-
-`PREFERRED_OUTPUT_RELOAD_CLASS (X, CLASS)'
-     Like `PREFERRED_RELOAD_CLASS', but for output reloads instead of
-     input reloads.  If you don't define this macro, the default is to
-     use CLASS, unchanged.
-
-`LIMIT_RELOAD_CLASS (MODE, CLASS)'
-     A C expression that places additional restrictions on the register
-     class to use when it is necessary to be able to hold a value of
-     mode MODE in a reload register for which class CLASS would
-     ordinarily be used.
-
-     Unlike `PREFERRED_RELOAD_CLASS', this macro should be used when
-     there are certain modes that simply can't go in certain reload
-     classes.
-
-     The value is a register class; perhaps CLASS, or perhaps another,
-     smaller class.
-
-     Don't define this macro unless the target machine has limitations
-     which require the macro to do something nontrivial.
-
-`SECONDARY_RELOAD_CLASS (CLASS, MODE, X)'
-`SECONDARY_INPUT_RELOAD_CLASS (CLASS, MODE, X)'
-`SECONDARY_OUTPUT_RELOAD_CLASS (CLASS, MODE, X)'
-     Many machines have some registers that cannot be copied directly
-     to or from memory or even from other types of registers.  An
-     example is the `MQ' register, which on most machines, can only be
-     copied to or from general registers, but not memory.  Some
-     machines allow copying all registers to and from memory, but
-     require a scratch register for stores to some memory locations
-     (e.g., those with symbolic address on the RT, and those with
-     certain symbolic address on the Sparc when compiling PIC).  In
-     some cases, both an intermediate and a scratch register are
-     required.
-
-     You should define these macros to indicate to the reload phase
-     that it may need to allocate at least one register for a reload in
-     addition to the register to contain the data.  Specifically, if
-     copying X to a register CLASS in MODE requires an intermediate
-     register, you should define `SECONDARY_INPUT_RELOAD_CLASS' to
-     return the largest register class all of whose registers can be
-     used as intermediate registers or scratch registers.
-
-     If copying a register CLASS in MODE to X requires an intermediate
-     or scratch register, `SECONDARY_OUTPUT_RELOAD_CLASS' should be
-     defined to return the largest register class required.  If the
-     requirements for input and output reloads are the same, the macro
-     `SECONDARY_RELOAD_CLASS' should be used instead of defining both
-     macros identically.
-
-     The values returned by these macros are often `GENERAL_REGS'.
-     Return `NO_REGS' if no spare register is needed; i.e., if X can be
-     directly copied to or from a register of CLASS in MODE without
-     requiring a scratch register.  Do not define this macro if it
-     would always return `NO_REGS'.
-
-     If a scratch register is required (either with or without an
-     intermediate register), you should define patterns for
-     `reload_inM' or `reload_outM', as required (*note Standard
-     Names::..  These patterns, which will normally be implemented with
-     a `define_expand', should be similar to the `movM' patterns,
-     except that operand 2 is the scratch register.
-
-     Define constraints for the reload register and scratch register
-     that contain a single register class.  If the original reload
-     register (whose class is CLASS) can meet the constraint given in
-     the pattern, the value returned by these macros is used for the
-     class of the scratch register.  Otherwise, two additional reload
-     registers are required.  Their classes are obtained from the
-     constraints in the insn pattern.
-
-     X might be a pseudo-register or a `subreg' of a pseudo-register,
-     which could either be in a hard register or in memory.  Use
-     `true_regnum' to find out; it will return -1 if the pseudo is in
-     memory and the hard register number if it is in a register.
-
-     These macros should not be used in the case where a particular
-     class of registers can only be copied to memory and not to another
-     class of registers.  In that case, secondary reload registers are
-     not needed and would not be helpful.  Instead, a stack location
-     must be used to perform the copy and the `movM' pattern should use
-     memory as a intermediate storage.  This case often occurs between
-     floating-point and general registers.
-
-`SECONDARY_MEMORY_NEEDED (CLASS1, CLASS2, M)'
-     Certain machines have the property that some registers cannot be
-     copied to some other registers without using memory.  Define this
-     macro on those machines to be a C expression that is non-zero if
-     objects of mode M in registers of CLASS1 can only be copied to
-     registers of class CLASS2 by storing a register of CLASS1 into
-     memory and loading that memory location into a register of CLASS2.
-
-     Do not define this macro if its value would always be zero.
-
-`SECONDARY_MEMORY_NEEDED_RTX (MODE)'
-     Normally when `SECONDARY_MEMORY_NEEDED' is defined, the compiler
-     allocates a stack slot for a memory location needed for register
-     copies.  If this macro is defined, the compiler instead uses the
-     memory location defined by this macro.
-
-     Do not define this macro if you do not define
-     `SECONDARY_MEMORY_NEEDED'.
-
-`SECONDARY_MEMORY_NEEDED_MODE (MODE)'
-     When the compiler needs a secondary memory location to copy
-     between two registers of mode MODE, it normally allocates
-     sufficient memory to hold a quantity of `BITS_PER_WORD' bits and
-     performs the store and load operations in a mode that many bits
-     wide and whose class is the same as that of MODE.
-
-     This is right thing to do on most machines because it ensures that
-     all bits of the register are copied and prevents accesses to the
-     registers in a narrower mode, which some machines prohibit for
-     floating-point registers.
-
-     However, this default behavior is not correct on some machines,
-     such as the DEC Alpha, that store short integers in floating-point
-     registers differently than in integer registers.  On those
-     machines, the default widening will not work correctly and you
-     must define this macro to suppress that widening in some cases.
-     See the file `alpha.h' for details.
-
-     Do not define this macro if you do not define
-     `SECONDARY_MEMORY_NEEDED' or if widening MODE to a mode that is
-     `BITS_PER_WORD' bits wide is correct for your machine.
-
-`SMALL_REGISTER_CLASSES'
-     Normally the compiler avoids choosing registers that have been
-     explicitly mentioned in the rtl as spill registers (these
-     registers are normally those used to pass parameters and return
-     values).  However, some machines have so few registers of certain
-     classes that there would not be enough registers to use as spill
-     registers if this were done.
-
-     Define `SMALL_REGISTER_CLASSES' to be an expression with a non-zero
-     value on these machines.  When this macro has a non-zero value, the
-     compiler allows registers explicitly used in the rtl to be used as
-     spill registers but avoids extending the lifetime of these
-     registers.
-
-     It is always safe to define this macro with a non-zero value, but
-     if you unnecessarily define it, you will reduce the amount of
-     optimizations that can be performed in some cases.  If you do not
-     define this macro with a non-zero value when it is required, the
-     compiler will run out of spill registers and print a fatal error
-     message.  For most machines, you should not define this macro at
-     all.
-
-`CLASS_LIKELY_SPILLED_P (CLASS)'
-     A C expression whose value is nonzero if pseudos that have been
-     assigned to registers of class CLASS would likely be spilled
-     because registers of CLASS are needed for spill registers.
-
-     The default value of this macro returns 1 if CLASS has exactly one
-     register and zero otherwise.  On most machines, this default
-     should be used.  Only define this macro to some other expression
-     if pseudo allocated by `local-alloc.c' end up in memory because
-     their hard registers were needed for spill registers.  If this
-     macro returns nonzero for those classes, those pseudos will only
-     be allocated by `global.c', which knows how to reallocate the
-     pseudo to another register.  If there would not be another
-     register available for reallocation, you should not change the
-     definition of this macro since the only effect of such a
-     definition would be to slow down register allocation.
-
-`CLASS_MAX_NREGS (CLASS, MODE)'
-     A C expression for the maximum number of consecutive registers of
-     class CLASS needed to hold a value of mode MODE.
-
-     This is closely related to the macro `HARD_REGNO_NREGS'.  In fact,
-     the value of the macro `CLASS_MAX_NREGS (CLASS, MODE)' should be
-     the maximum value of `HARD_REGNO_NREGS (REGNO, MODE)' for all
-     REGNO values in the class CLASS.
-
-     This macro helps control the handling of multiple-word values in
-     the reload pass.
-
-`CLASS_CANNOT_CHANGE_SIZE'
-     If defined, a C expression for a class that contains registers
-     which the compiler must always access in a mode that is the same
-     size as the mode in which it loaded the register.
-
-     For the example, loading 32-bit integer or floating-point objects
-     into floating-point registers on the Alpha extends them to 64-bits.
-     Therefore loading a 64-bit object and then storing it as a 32-bit
-     object does not store the low-order 32-bits, as would be the case
-     for a normal register.  Therefore, `alpha.h' defines this macro as
-     `FLOAT_REGS'.
-
-   Three other special macros describe which operands fit which
-constraint letters.
-
-`CONST_OK_FOR_LETTER_P (VALUE, C)'
-     A C expression that defines the machine-dependent operand
-     constraint letters that specify particular ranges of integer
-     values.  If C is one of those letters, the expression should check
-     that VALUE, an integer, is in the appropriate range and return 1
-     if so, 0 otherwise.  If C is not one of those letters, the value
-     should be 0 regardless of VALUE.
-
-`CONST_DOUBLE_OK_FOR_LETTER_P (VALUE, C)'
-     A C expression that defines the machine-dependent operand
-     constraint letters that specify particular ranges of
-     `const_double' values.
-
-     If C is one of those letters, the expression should check that
-     VALUE, an RTX of code `const_double', is in the appropriate range
-     and return 1 if so, 0 otherwise.  If C is not one of those
-     letters, the value should be 0 regardless of VALUE.
-
-     `const_double' is used for all floating-point constants and for
-     `DImode' fixed-point constants.  A given letter can accept either
-     or both kinds of values.  It can use `GET_MODE' to distinguish
-     between these kinds.
-
-`EXTRA_CONSTRAINT (VALUE, C)'
-     A C expression that defines the optional machine-dependent
-     constraint letters that can be used to segregate specific types of
-     operands, usually memory references, for the target machine.
-     Normally this macro will not be defined.  If it is required for a
-     particular target machine, it should return 1 if VALUE corresponds
-     to the operand type represented by the constraint letter C.  If C
-     is not defined as an extra constraint, the value returned should
-     be 0 regardless of VALUE.
-
-     For example, on the ROMP, load instructions cannot have their
-     output in r0 if the memory reference contains a symbolic address.
-     Constraint letter `Q' is defined as representing a memory address
-     that does *not* contain a symbolic address.  An alternative is
-     specified with a `Q' constraint on the input and `r' on the
-     output.  The next alternative specifies `m' on the input and a
-     register class that does not include r0 on the output.
-
-\1f
-File: gcc.info,  Node: Stack and Calling,  Next: Varargs,  Prev: Register Classes,  Up: Target Macros
-
-Stack Layout and Calling Conventions
-====================================
-
-   This describes the stack layout and calling conventions.
-
-* Menu:
-
-* Frame Layout::
-* Stack Checking::
-* Frame Registers::
-* Elimination::
-* Stack Arguments::
-* Register Arguments::
-* Scalar Return::
-* Aggregate Return::
-* Caller Saves::
-* Function Entry::
-* Profiling::
-
-\1f
-File: gcc.info,  Node: Frame Layout,  Next: Stack Checking,  Up: Stack and Calling
-
-Basic Stack Layout
-------------------
-
-   Here is the basic stack layout.
-
-`STACK_GROWS_DOWNWARD'
-     Define this macro if pushing a word onto the stack moves the stack
-     pointer to a smaller address.
-
-     When we say, "define this macro if ...," it means that the
-     compiler checks this macro only with `#ifdef' so the precise
-     definition used does not matter.
-
-`FRAME_GROWS_DOWNWARD'
-     Define this macro if the addresses of local variable slots are at
-     negative offsets from the frame pointer.
-
-`ARGS_GROW_DOWNWARD'
-     Define this macro if successive arguments to a function occupy
-     decreasing addresses on the stack.
-
-`STARTING_FRAME_OFFSET'
-     Offset from the frame pointer to the first local variable slot to
-     be allocated.
-
-     If `FRAME_GROWS_DOWNWARD', find the next slot's offset by
-     subtracting the first slot's length from `STARTING_FRAME_OFFSET'.
-     Otherwise, it is found by adding the length of the first slot to
-     the value `STARTING_FRAME_OFFSET'.
-
-`STACK_POINTER_OFFSET'
-     Offset from the stack pointer register to the first location at
-     which outgoing arguments are placed.  If not specified, the
-     default value of zero is used.  This is the proper value for most
-     machines.
-
-     If `ARGS_GROW_DOWNWARD', this is the offset to the location above
-     the first location at which outgoing arguments are placed.
-
-`FIRST_PARM_OFFSET (FUNDECL)'
-     Offset from the argument pointer register to the first argument's
-     address.  On some machines it may depend on the data type of the
-     function.
-
-     If `ARGS_GROW_DOWNWARD', this is the offset to the location above
-     the first argument's address.
-
-`STACK_DYNAMIC_OFFSET (FUNDECL)'
-     Offset from the stack pointer register to an item dynamically
-     allocated on the stack, e.g., by `alloca'.
-
-     The default value for this macro is `STACK_POINTER_OFFSET' plus the
-     length of the outgoing arguments.  The default is correct for most
-     machines.  See `function.c' for details.
-
-`DYNAMIC_CHAIN_ADDRESS (FRAMEADDR)'
-     A C expression whose value is RTL representing the address in a
-     stack frame where the pointer to the caller's frame is stored.
-     Assume that FRAMEADDR is an RTL expression for the address of the
-     stack frame itself.
-
-     If you don't define this macro, the default is to return the value
-     of FRAMEADDR--that is, the stack frame address is also the address
-     of the stack word that points to the previous frame.
-
-`SETUP_FRAME_ADDRESSES ()'
-     If defined, a C expression that produces the machine-specific code
-     to setup the stack so that arbitrary frames can be accessed.  For
-     example, on the Sparc, we must flush all of the register windows
-     to the stack before we can access arbitrary stack frames.  This
-     macro will seldom need to be defined.
-
-`RETURN_ADDR_RTX (COUNT, FRAMEADDR)'
-     A C expression whose value is RTL representing the value of the
-     return address for the frame COUNT steps up from the current
-     frame, after the prologue.  FRAMEADDR is the frame pointer of the
-     COUNT frame, or the frame pointer of the COUNT - 1 frame if
-     `RETURN_ADDR_IN_PREVIOUS_FRAME' is defined.
-
-     The value of the expression must always be the correct address when
-     COUNT is zero, but may be `NULL_RTX' if there is not way to
-     determine the return address of other frames.
-
-`RETURN_ADDR_IN_PREVIOUS_FRAME'
-     Define this if the return address of a particular stack frame is
-     accessed from the frame pointer of the previous stack frame.
-
-`INCOMING_RETURN_ADDR_RTX'
-     A C expression whose value is RTL representing the location of the
-     incoming return address at the beginning of any function, before
-     the prologue.  This RTL is either a `REG', indicating that the
-     return value is saved in `REG', or a `MEM' representing a location
-     in the stack.
-
-     You only need to define this macro if you want to support call
-     frame debugging information like that provided by DWARF 2.
-
-`INCOMING_FRAME_SP_OFFSET'
-     A C expression whose value is an integer giving the offset, in
-     bytes, from the value of the stack pointer register to the top of
-     the stack frame at the beginning of any function, before the
-     prologue.  The top of the frame is defined to be the value of the
-     stack pointer in the previous frame, just before the call
-     instruction.
-
-     You only need to define this macro if you want to support call
-     frame debugging information like that provided by DWARF 2.
-
-\1f
-File: gcc.info,  Node: Stack Checking,  Next: Frame Registers,  Prev: Frame Layout,  Up: Stack and Calling
-
-Specifying How Stack Checking is Done
--------------------------------------
-
-   GNU CC will check that stack references are within the boundaries of
-the stack, if the `-fstack-check' is specified, in one of three ways:
-
-  1. If the value of the `STACK_CHECK_BUILTIN' macro is nonzero, GNU CC
-     will assume that you have arranged for stack checking to be done at
-     appropriate places in the configuration files, e.g., in
-     `FUNCTION_PROLOGUE'.  GNU CC will do not other special processing.
-
-  2. If `STACK_CHECK_BUILTIN' is zero and you defined a named pattern
-     called `check_stack' in your `md' file, GNU CC will call that
-     pattern with one argument which is the address to compare the stack
-     value against.  You must arrange for this pattern to report an
-     error if the stack pointer is out of range.
-
-  3. If neither of the above are true, GNU CC will generate code to
-     periodically "probe" the stack pointer using the values of the
-     macros defined below.
-
-   Normally, you will use the default values of these macros, so GNU CC
-will use the third approach.
-
-`STACK_CHECK_BUILTIN'
-     A nonzero value if stack checking is done by the configuration
-     files in a machine-dependent manner.  You should define this macro
-     if stack checking is require by the ABI of your machine or if you
-     would like to have to stack checking in some more efficient way
-     than GNU CC's portable approach.  The default value of this macro
-     is zero.
-
-`STACK_CHECK_PROBE_INTERVAL'
-     An integer representing the interval at which GNU CC must generate
-     stack probe instructions.  You will normally define this macro to
-     be no larger than the size of the "guard pages" at the end of a
-     stack area.  The default value of 4096 is suitable for most
-     systems.
-
-`STACK_CHECK_PROBE_LOAD'
-     A integer which is nonzero if GNU CC should perform the stack probe
-     as a load instruction and zero if GNU CC should use a store
-     instruction.  The default is zero, which is the most efficient
-     choice on most systems.
-
-`STACK_CHECK_PROTECT'
-     The number of bytes of stack needed to recover from a stack
-     overflow, for languages where such a recovery is supported.  The
-     default value of 75 words should be adequate for most machines.
-
-`STACK_CHECK_MAX_FRAME_SIZE'
-     The maximum size of a stack frame, in bytes.  GNU CC will generate
-     probe instructions in non-leaf functions to ensure at least this
-     many bytes of stack are available.  If a stack frame is larger
-     than this size, stack checking will not be reliable and GNU CC
-     will issue a warning.  The default is chosen so that GNU CC only
-     generates one instruction on most systems.  You should normally
-     not change the default value of this macro.
-
-`STACK_CHECK_FIXED_FRAME_SIZE'
-     GNU CC uses this value to generate the above warning message.  It
-     represents the amount of fixed frame used by a function, not
-     including space for any callee-saved registers, temporaries and
-     user variables.  You need only specify an upper bound for this
-     amount and will normally use the default of four words.
-
-`STACK_CHECK_MAX_VAR_SIZE'
-     The maximum size, in bytes, of an object that GNU CC will place in
-     the fixed area of the stack frame when the user specifies
-     `-fstack-check'.  GNU CC computed the default from the values of
-     the above macros and you will normally not need to override that
-     default.
-
diff --git a/gcc/gcc.info-22 b/gcc/gcc.info-22
deleted file mode 100644 (file)
index 6863339..0000000
+++ /dev/null
@@ -1,961 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Frame Registers,  Next: Elimination,  Prev: Stack Checking,  Up: Stack and Calling
-
-Registers That Address the Stack Frame
---------------------------------------
-
-   This discusses registers that address the stack frame.
-
-`STACK_POINTER_REGNUM'
-     The register number of the stack pointer register, which must also
-     be a fixed register according to `FIXED_REGISTERS'.  On most
-     machines, the hardware determines which register this is.
-
-`FRAME_POINTER_REGNUM'
-     The register number of the frame pointer register, which is used to
-     access automatic variables in the stack frame.  On some machines,
-     the hardware determines which register this is.  On other
-     machines, you can choose any register you wish for this purpose.
-
-`HARD_FRAME_POINTER_REGNUM'
-     On some machines the offset between the frame pointer and starting
-     offset of the automatic variables is not known until after register
-     allocation has been done (for example, because the saved registers
-     are between these two locations).  On those machines, define
-     `FRAME_POINTER_REGNUM' the number of a special, fixed register to
-     be used internally until the offset is known, and define
-     `HARD_FRAME_POINTER_REGNUM' to be actual the hard register number
-     used for the frame pointer.
-
-     You should define this macro only in the very rare circumstances
-     when it is not possible to calculate the offset between the frame
-     pointer and the automatic variables until after register
-     allocation has been completed.  When this macro is defined, you
-     must also indicate in your definition of `ELIMINABLE_REGS' how to
-     eliminate `FRAME_POINTER_REGNUM' into either
-     `HARD_FRAME_POINTER_REGNUM' or `STACK_POINTER_REGNUM'.
-
-     Do not define this macro if it would be the same as
-     `FRAME_POINTER_REGNUM'.
-
-`ARG_POINTER_REGNUM'
-     The register number of the arg pointer register, which is used to
-     access the function's argument list.  On some machines, this is
-     the same as the frame pointer register.  On some machines, the
-     hardware determines which register this is.  On other machines,
-     you can choose any register you wish for this purpose.  If this is
-     not the same register as the frame pointer register, then you must
-     mark it as a fixed register according to `FIXED_REGISTERS', or
-     arrange to be able to eliminate it (*note Elimination::.).
-
-`RETURN_ADDRESS_POINTER_REGNUM'
-     The register number of the return address pointer register, which
-     is used to access the current function's return address from the
-     stack.  On some machines, the return address is not at a fixed
-     offset from the frame pointer or stack pointer or argument
-     pointer.  This register can be defined to point to the return
-     address on the stack, and then be converted by `ELIMINABLE_REGS'
-     into either the frame pointer or stack pointer.
-
-     Do not define this macro unless there is no other way to get the
-     return address from the stack.
-
-`STATIC_CHAIN_REGNUM'
-`STATIC_CHAIN_INCOMING_REGNUM'
-     Register numbers used for passing a function's static chain
-     pointer.  If register windows are used, the register number as
-     seen by the called function is `STATIC_CHAIN_INCOMING_REGNUM',
-     while the register number as seen by the calling function is
-     `STATIC_CHAIN_REGNUM'.  If these registers are the same,
-     `STATIC_CHAIN_INCOMING_REGNUM' need not be defined.
-
-     The static chain register need not be a fixed register.
-
-     If the static chain is passed in memory, these macros should not be
-     defined; instead, the next two macros should be defined.
-
-`STATIC_CHAIN'
-`STATIC_CHAIN_INCOMING'
-     If the static chain is passed in memory, these macros provide rtx
-     giving `mem' expressions that denote where they are stored.
-     `STATIC_CHAIN' and `STATIC_CHAIN_INCOMING' give the locations as
-     seen by the calling and called functions, respectively.  Often the
-     former will be at an offset from the stack pointer and the latter
-     at an offset from the frame pointer.
-
-     The variables `stack_pointer_rtx', `frame_pointer_rtx', and
-     `arg_pointer_rtx' will have been initialized prior to the use of
-     these macros and should be used to refer to those items.
-
-     If the static chain is passed in a register, the two previous
-     macros should be defined instead.
-
-\1f
-File: gcc.info,  Node: Elimination,  Next: Stack Arguments,  Prev: Frame Registers,  Up: Stack and Calling
-
-Eliminating Frame Pointer and Arg Pointer
------------------------------------------
-
-   This is about eliminating the frame pointer and arg pointer.
-
-`FRAME_POINTER_REQUIRED'
-     A C expression which is nonzero if a function must have and use a
-     frame pointer.  This expression is evaluated  in the reload pass.
-     If its value is nonzero the function will have a frame pointer.
-
-     The expression can in principle examine the current function and
-     decide according to the facts, but on most machines the constant 0
-     or the constant 1 suffices.  Use 0 when the machine allows code to
-     be generated with no frame pointer, and doing so saves some time
-     or space.  Use 1 when there is no possible advantage to avoiding a
-     frame pointer.
-
-     In certain cases, the compiler does not know how to produce valid
-     code without a frame pointer.  The compiler recognizes those cases
-     and automatically gives the function a frame pointer regardless of
-     what `FRAME_POINTER_REQUIRED' says.  You don't need to worry about
-     them.
-
-     In a function that does not require a frame pointer, the frame
-     pointer register can be allocated for ordinary usage, unless you
-     mark it as a fixed register.  See `FIXED_REGISTERS' for more
-     information.
-
-`INITIAL_FRAME_POINTER_OFFSET (DEPTH-VAR)'
-     A C statement to store in the variable DEPTH-VAR the difference
-     between the frame pointer and the stack pointer values immediately
-     after the function prologue.  The value would be computed from
-     information such as the result of `get_frame_size ()' and the
-     tables of registers `regs_ever_live' and `call_used_regs'.
-
-     If `ELIMINABLE_REGS' is defined, this macro will be not be used and
-     need not be defined.  Otherwise, it must be defined even if
-     `FRAME_POINTER_REQUIRED' is defined to always be true; in that
-     case, you may set DEPTH-VAR to anything.
-
-`ELIMINABLE_REGS'
-     If defined, this macro specifies a table of register pairs used to
-     eliminate unneeded registers that point into the stack frame.  If
-     it is not defined, the only elimination attempted by the compiler
-     is to replace references to the frame pointer with references to
-     the stack pointer.
-
-     The definition of this macro is a list of structure
-     initializations, each of which specifies an original and
-     replacement register.
-
-     On some machines, the position of the argument pointer is not
-     known until the compilation is completed.  In such a case, a
-     separate hard register must be used for the argument pointer.
-     This register can be eliminated by replacing it with either the
-     frame pointer or the argument pointer, depending on whether or not
-     the frame pointer has been eliminated.
-
-     In this case, you might specify:
-          #define ELIMINABLE_REGS  \
-          {{ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \
-           {ARG_POINTER_REGNUM, FRAME_POINTER_REGNUM}, \
-           {FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}}
-
-     Note that the elimination of the argument pointer with the stack
-     pointer is specified first since that is the preferred elimination.
-
-`CAN_ELIMINATE (FROM-REG, TO-REG)'
-     A C expression that returns non-zero if the compiler is allowed to
-     try to replace register number FROM-REG with register number
-     TO-REG.  This macro need only be defined if `ELIMINABLE_REGS' is
-     defined, and will usually be the constant 1, since most of the
-     cases preventing register elimination are things that the compiler
-     already knows about.
-
-`INITIAL_ELIMINATION_OFFSET (FROM-REG, TO-REG, OFFSET-VAR)'
-     This macro is similar to `INITIAL_FRAME_POINTER_OFFSET'.  It
-     specifies the initial difference between the specified pair of
-     registers.  This macro must be defined if `ELIMINABLE_REGS' is
-     defined.
-
-`LONGJMP_RESTORE_FROM_STACK'
-     Define this macro if the `longjmp' function restores registers from
-     the stack frames, rather than from those saved specifically by
-     `setjmp'.  Certain quantities must not be kept in registers across
-     a call to `setjmp' on such machines.
-
-\1f
-File: gcc.info,  Node: Stack Arguments,  Next: Register Arguments,  Prev: Elimination,  Up: Stack and Calling
-
-Passing Function Arguments on the Stack
----------------------------------------
-
-   The macros in this section control how arguments are passed on the
-stack.  See the following section for other macros that control passing
-certain arguments in registers.
-
-`PROMOTE_PROTOTYPES'
-     Define this macro if an argument declared in a prototype as an
-     integral type smaller than `int' should actually be passed as an
-     `int'.  In addition to avoiding errors in certain cases of
-     mismatch, it also makes for better code on certain machines.
-
-`PUSH_ROUNDING (NPUSHED)'
-     A C expression that is the number of bytes actually pushed onto the
-     stack when an instruction attempts to push NPUSHED bytes.
-
-     If the target machine does not have a push instruction, do not
-     define this macro.  That directs GNU CC to use an alternate
-     strategy: to allocate the entire argument block and then store the
-     arguments into it.
-
-     On some machines, the definition
-
-          #define PUSH_ROUNDING(BYTES) (BYTES)
-
-     will suffice.  But on other machines, instructions that appear to
-     push one byte actually push two bytes in an attempt to maintain
-     alignment.  Then the definition should be
-
-          #define PUSH_ROUNDING(BYTES) (((BYTES) + 1) & ~1)
-
-`ACCUMULATE_OUTGOING_ARGS'
-     If defined, the maximum amount of space required for outgoing
-     arguments will be computed and placed into the variable
-     `current_function_outgoing_args_size'.  No space will be pushed
-     onto the stack for each call; instead, the function prologue should
-     increase the stack frame size by this amount.
-
-     Defining both `PUSH_ROUNDING' and `ACCUMULATE_OUTGOING_ARGS' is
-     not proper.
-
-`REG_PARM_STACK_SPACE (FNDECL)'
-     Define this macro if functions should assume that stack space has
-     been allocated for arguments even when their values are passed in
-     registers.
-
-     The value of this macro is the size, in bytes, of the area
-     reserved for arguments passed in registers for the function
-     represented by FNDECL.
-
-     This space can be allocated by the caller, or be a part of the
-     machine-dependent stack frame: `OUTGOING_REG_PARM_STACK_SPACE' says
-     which.
-
-`MAYBE_REG_PARM_STACK_SPACE'
-`FINAL_REG_PARM_STACK_SPACE (CONST_SIZE, VAR_SIZE)'
-     Define these macros in addition to the one above if functions might
-     allocate stack space for arguments even when their values are
-     passed in registers.  These should be used when the stack space
-     allocated for arguments in registers is not a simple constant
-     independent of the function declaration.
-
-     The value of the first macro is the size, in bytes, of the area
-     that we should initially assume would be reserved for arguments
-     passed in registers.
-
-     The value of the second macro is the actual size, in bytes, of the
-     area that will be reserved for arguments passed in registers.
-     This takes two arguments: an integer representing the number of
-     bytes of fixed sized arguments on the stack, and a tree
-     representing the number of bytes of variable sized arguments on
-     the stack.
-
-     When these macros are defined, `REG_PARM_STACK_SPACE' will only be
-     called for libcall functions, the current function, or for a
-     function being called when it is known that such stack space must
-     be allocated.  In each case this value can be easily computed.
-
-     When deciding whether a called function needs such stack space,
-     and how much space to reserve, GNU CC uses these two macros
-     instead of `REG_PARM_STACK_SPACE'.
-
-`OUTGOING_REG_PARM_STACK_SPACE'
-     Define this if it is the responsibility of the caller to allocate
-     the area reserved for arguments passed in registers.
-
-     If `ACCUMULATE_OUTGOING_ARGS' is defined, this macro controls
-     whether the space for these arguments counts in the value of
-     `current_function_outgoing_args_size'.
-
-`STACK_PARMS_IN_REG_PARM_AREA'
-     Define this macro if `REG_PARM_STACK_SPACE' is defined, but the
-     stack parameters don't skip the area specified by it.
-
-     Normally, when a parameter is not passed in registers, it is
-     placed on the stack beyond the `REG_PARM_STACK_SPACE' area.
-     Defining this macro suppresses this behavior and causes the
-     parameter to be passed on the stack in its natural location.
-
-`RETURN_POPS_ARGS (FUNDECL, FUNTYPE, STACK-SIZE)'
-     A C expression that should indicate the number of bytes of its own
-     arguments that a function pops on returning, or 0 if the function
-     pops no arguments and the caller must therefore pop them all after
-     the function returns.
-
-     FUNDECL is a C variable whose value is a tree node that describes
-     the function in question.  Normally it is a node of type
-     `FUNCTION_DECL' that describes the declaration of the function.
-     From this you can obtain the DECL_MACHINE_ATTRIBUTES of the
-     function.
-
-     FUNTYPE is a C variable whose value is a tree node that describes
-     the function in question.  Normally it is a node of type
-     `FUNCTION_TYPE' that describes the data type of the function.
-     From this it is possible to obtain the data types of the value and
-     arguments (if known).
-
-     When a call to a library function is being considered, FUNDECL
-     will contain an identifier node for the library function.  Thus, if
-     you need to distinguish among various library functions, you can
-     do so by their names.  Note that "library function" in this
-     context means a function used to perform arithmetic, whose name is
-     known specially in the compiler and was not mentioned in the C
-     code being compiled.
-
-     STACK-SIZE is the number of bytes of arguments passed on the
-     stack.  If a variable number of bytes is passed, it is zero, and
-     argument popping will always be the responsibility of the calling
-     function.
-
-     On the Vax, all functions always pop their arguments, so the
-     definition of this macro is STACK-SIZE.  On the 68000, using the
-     standard calling convention, no functions pop their arguments, so
-     the value of the macro is always 0 in this case.  But an
-     alternative calling convention is available in which functions
-     that take a fixed number of arguments pop them but other functions
-     (such as `printf') pop nothing (the caller pops all).  When this
-     convention is in use, FUNTYPE is examined to determine whether a
-     function takes a fixed number of arguments.
-
-\1f
-File: gcc.info,  Node: Register Arguments,  Next: Scalar Return,  Prev: Stack Arguments,  Up: Stack and Calling
-
-Passing Arguments in Registers
-------------------------------
-
-   This section describes the macros which let you control how various
-types of arguments are passed in registers or how they are arranged in
-the stack.
-
-`FUNCTION_ARG (CUM, MODE, TYPE, NAMED)'
-     A C expression that controls whether a function argument is passed
-     in a register, and which register.
-
-     The arguments are CUM, which summarizes all the previous
-     arguments; MODE, the machine mode of the argument; TYPE, the data
-     type of the argument as a tree node or 0 if that is not known
-     (which happens for C support library functions); and NAMED, which
-     is 1 for an ordinary argument and 0 for nameless arguments that
-     correspond to `...' in the called function's prototype.
-
-     The value of the expression is usually either a `reg' RTX for the
-     hard register in which to pass the argument, or zero to pass the
-     argument on the stack.
-
-     For machines like the Vax and 68000, where normally all arguments
-     are pushed, zero suffices as a definition.
-
-     The value of the expression can also be a `parallel' RTX.  This is
-     used when an argument is passed in multiple locations.  The mode
-     of the of the `parallel' should be the mode of the entire
-     argument.  The `parallel' holds any number of `expr_list' pairs;
-     each one describes where part of the argument is passed.  In each
-     `expr_list', the first operand can be either a `reg' RTX for the
-     hard register in which to pass this part of the argument, or zero
-     to pass the argument on the stack.  If this operand is a `reg',
-     then the mode indicates how large this part of the argument is.
-     The second operand of the `expr_list' is a `const_int' which gives
-     the offset in bytes into the entire argument where this part
-     starts.
-
-     The usual way to make the ANSI library `stdarg.h' work on a machine
-     where some arguments are usually passed in registers, is to cause
-     nameless arguments to be passed on the stack instead.  This is done
-     by making `FUNCTION_ARG' return 0 whenever NAMED is 0.
-
-     You may use the macro `MUST_PASS_IN_STACK (MODE, TYPE)' in the
-     definition of this macro to determine if this argument is of a
-     type that must be passed in the stack.  If `REG_PARM_STACK_SPACE'
-     is not defined and `FUNCTION_ARG' returns non-zero for such an
-     argument, the compiler will abort.  If `REG_PARM_STACK_SPACE' is
-     defined, the argument will be computed in the stack and then
-     loaded into a register.
-
-`FUNCTION_INCOMING_ARG (CUM, MODE, TYPE, NAMED)'
-     Define this macro if the target machine has "register windows", so
-     that the register in which a function sees an arguments is not
-     necessarily the same as the one in which the caller passed the
-     argument.
-
-     For such machines, `FUNCTION_ARG' computes the register in which
-     the caller passes the value, and `FUNCTION_INCOMING_ARG' should be
-     defined in a similar fashion to tell the function being called
-     where the arguments will arrive.
-
-     If `FUNCTION_INCOMING_ARG' is not defined, `FUNCTION_ARG' serves
-     both purposes.
-
-`FUNCTION_ARG_PARTIAL_NREGS (CUM, MODE, TYPE, NAMED)'
-     A C expression for the number of words, at the beginning of an
-     argument, must be put in registers.  The value must be zero for
-     arguments that are passed entirely in registers or that are
-     entirely pushed on the stack.
-
-     On some machines, certain arguments must be passed partially in
-     registers and partially in memory.  On these machines, typically
-     the first N words of arguments are passed in registers, and the
-     rest on the stack.  If a multi-word argument (a `double' or a
-     structure) crosses that boundary, its first few words must be
-     passed in registers and the rest must be pushed.  This macro tells
-     the compiler when this occurs, and how many of the words should go
-     in registers.
-
-     `FUNCTION_ARG' for these arguments should return the first
-     register to be used by the caller for this argument; likewise
-     `FUNCTION_INCOMING_ARG', for the called function.
-
-`FUNCTION_ARG_PASS_BY_REFERENCE (CUM, MODE, TYPE, NAMED)'
-     A C expression that indicates when an argument must be passed by
-     reference.  If nonzero for an argument, a copy of that argument is
-     made in memory and a pointer to the argument is passed instead of
-     the argument itself.  The pointer is passed in whatever way is
-     appropriate for passing a pointer to that type.
-
-     On machines where `REG_PARM_STACK_SPACE' is not defined, a suitable
-     definition of this macro might be
-          #define FUNCTION_ARG_PASS_BY_REFERENCE\
-          (CUM, MODE, TYPE, NAMED)  \
-            MUST_PASS_IN_STACK (MODE, TYPE)
-
-`FUNCTION_ARG_CALLEE_COPIES (CUM, MODE, TYPE, NAMED)'
-     If defined, a C expression that indicates when it is the called
-     function's responsibility to make a copy of arguments passed by
-     invisible reference.  Normally, the caller makes a copy and passes
-     the address of the copy to the routine being called.  When
-     FUNCTION_ARG_CALLEE_COPIES is defined and is nonzero, the caller
-     does not make a copy.  Instead, it passes a pointer to the "live"
-     value.  The called function must not modify this value.  If it can
-     be determined that the value won't be modified, it need not make a
-     copy; otherwise a copy must be made.
-
-`CUMULATIVE_ARGS'
-     A C type for declaring a variable that is used as the first
-     argument of `FUNCTION_ARG' and other related values.  For some
-     target machines, the type `int' suffices and can hold the number
-     of bytes of argument so far.
-
-     There is no need to record in `CUMULATIVE_ARGS' anything about the
-     arguments that have been passed on the stack.  The compiler has
-     other variables to keep track of that.  For target machines on
-     which all arguments are passed on the stack, there is no need to
-     store anything in `CUMULATIVE_ARGS'; however, the data structure
-     must exist and should not be empty, so use `int'.
-
-`INIT_CUMULATIVE_ARGS (CUM, FNTYPE, LIBNAME, INDIRECT)'
-     A C statement (sans semicolon) for initializing the variable CUM
-     for the state at the beginning of the argument list.  The variable
-     has type `CUMULATIVE_ARGS'.  The value of FNTYPE is the tree node
-     for the data type of the function which will receive the args, or 0
-     if the args are to a compiler support library function.  The value
-     of INDIRECT is nonzero when processing an indirect call, for
-     example a call through a function pointer.  The value of INDIRECT
-     is zero for a call to an explicitly named function, a library
-     function call, or when `INIT_CUMULATIVE_ARGS' is used to find
-     arguments for the function being compiled.
-
-     When processing a call to a compiler support library function,
-     LIBNAME identifies which one.  It is a `symbol_ref' rtx which
-     contains the name of the function, as a string.  LIBNAME is 0 when
-     an ordinary C function call is being processed.  Thus, each time
-     this macro is called, either LIBNAME or FNTYPE is nonzero, but
-     never both of them at once.
-
-`INIT_CUMULATIVE_INCOMING_ARGS (CUM, FNTYPE, LIBNAME)'
-     Like `INIT_CUMULATIVE_ARGS' but overrides it for the purposes of
-     finding the arguments for the function being compiled.  If this
-     macro is undefined, `INIT_CUMULATIVE_ARGS' is used instead.
-
-     The value passed for LIBNAME is always 0, since library routines
-     with special calling conventions are never compiled with GNU CC.
-     The argument LIBNAME exists for symmetry with
-     `INIT_CUMULATIVE_ARGS'.
-
-`FUNCTION_ARG_ADVANCE (CUM, MODE, TYPE, NAMED)'
-     A C statement (sans semicolon) to update the summarizer variable
-     CUM to advance past an argument in the argument list.  The values
-     MODE, TYPE and NAMED describe that argument.  Once this is done,
-     the variable CUM is suitable for analyzing the *following*
-     argument with `FUNCTION_ARG', etc.
-
-     This macro need not do anything if the argument in question was
-     passed on the stack.  The compiler knows how to track the amount
-     of stack space used for arguments without any special help.
-
-`FUNCTION_ARG_PADDING (MODE, TYPE)'
-     If defined, a C expression which determines whether, and in which
-     direction, to pad out an argument with extra space.  The value
-     should be of type `enum direction': either `upward' to pad above
-     the argument, `downward' to pad below, or `none' to inhibit
-     padding.
-
-     The *amount* of padding is always just enough to reach the next
-     multiple of `FUNCTION_ARG_BOUNDARY'; this macro does not control
-     it.
-
-     This macro has a default definition which is right for most
-     systems.  For little-endian machines, the default is to pad
-     upward.  For big-endian machines, the default is to pad downward
-     for an argument of constant size shorter than an `int', and upward
-     otherwise.
-
-`FUNCTION_ARG_BOUNDARY (MODE, TYPE)'
-     If defined, a C expression that gives the alignment boundary, in
-     bits, of an argument with the specified mode and type.  If it is
-     not defined, `PARM_BOUNDARY' is used for all arguments.
-
-`FUNCTION_ARG_REGNO_P (REGNO)'
-     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 implicit arguments such as the static chain and
-     the structure-value address.  On many machines, no registers can be
-     used for this purpose since all function arguments are pushed on
-     the stack.
-
-\1f
-File: gcc.info,  Node: Scalar Return,  Next: Aggregate Return,  Prev: Register Arguments,  Up: Stack and Calling
-
-How Scalar Function Values Are Returned
----------------------------------------
-
-   This section discusses the macros that control returning scalars as
-values--values that can fit in registers.
-
-`TRADITIONAL_RETURN_FLOAT'
-     Define this macro if `-traditional' should not cause functions
-     declared to return `float' to convert the value to `double'.
-
-`FUNCTION_VALUE (VALTYPE, FUNC)'
-     A C expression to create an RTX representing the place where a
-     function returns a value of data type VALTYPE.  VALTYPE is a tree
-     node representing a data type.  Write `TYPE_MODE (VALTYPE)' to get
-     the machine mode used to represent that type.  On many machines,
-     only the mode is relevant.  (Actually, on most machines, scalar
-     values are returned in the same place regardless of mode).
-
-     The value of the expression is usually a `reg' RTX for the hard
-     register where the return value is stored.  The value can also be a
-     `parallel' RTX, if the return value is in multiple places.  See
-     `FUNCTION_ARG' for an explanation of the `parallel' form.
-
-     If `PROMOTE_FUNCTION_RETURN' is defined, you must apply the same
-     promotion rules specified in `PROMOTE_MODE' if VALTYPE is a scalar
-     type.
-
-     If the precise function being called is known, FUNC is a tree node
-     (`FUNCTION_DECL') for it; otherwise, FUNC is a null pointer.  This
-     makes it possible to use a different value-returning convention
-     for specific functions when all their calls are known.
-
-     `FUNCTION_VALUE' is not used for return vales with aggregate data
-     types, because these are returned in another way.  See
-     `STRUCT_VALUE_REGNUM' and related macros, below.
-
-`FUNCTION_OUTGOING_VALUE (VALTYPE, FUNC)'
-     Define this macro if the target machine has "register windows" so
-     that the register in which a function returns its value is not the
-     same as the one in which the caller sees the value.
-
-     For such machines, `FUNCTION_VALUE' computes the register in which
-     the caller will see the value.  `FUNCTION_OUTGOING_VALUE' should be
-     defined in a similar fashion to tell the function where to put the
-     value.
-
-     If `FUNCTION_OUTGOING_VALUE' is not defined, `FUNCTION_VALUE'
-     serves both purposes.
-
-     `FUNCTION_OUTGOING_VALUE' is not used for return vales with
-     aggregate data types, because these are returned in another way.
-     See `STRUCT_VALUE_REGNUM' and related macros, below.
-
-`LIBCALL_VALUE (MODE)'
-     A C expression to create an RTX representing the place where a
-     library function returns a value of mode MODE.  If the precise
-     function being called is known, FUNC is a tree node
-     (`FUNCTION_DECL') for it; otherwise, FUNC is a null pointer.  This
-     makes it possible to use a different value-returning convention
-     for specific functions when all their calls are known.
-
-     Note that "library function" in this context means a compiler
-     support routine, used to perform arithmetic, whose name is known
-     specially by the compiler and was not mentioned in the C code being
-     compiled.
-
-     The definition of `LIBRARY_VALUE' need not be concerned aggregate
-     data types, because none of the library functions returns such
-     types.
-
-`FUNCTION_VALUE_REGNO_P (REGNO)'
-     A C expression that is nonzero if REGNO is the number of a hard
-     register in which the values of called function may come back.
-
-     A register whose use for returning values is limited to serving as
-     the second of a pair (for a value of type `double', say) need not
-     be recognized by this macro.  So for most machines, this definition
-     suffices:
-
-          #define FUNCTION_VALUE_REGNO_P(N) ((N) == 0)
-
-     If the machine has register windows, so that the caller and the
-     called function use different registers for the return value, this
-     macro should recognize only the caller's register numbers.
-
-`APPLY_RESULT_SIZE'
-     Define this macro if `untyped_call' and `untyped_return' need more
-     space than is implied by `FUNCTION_VALUE_REGNO_P' for saving and
-     restoring an arbitrary return value.
-
-\1f
-File: gcc.info,  Node: Aggregate Return,  Next: Caller Saves,  Prev: Scalar Return,  Up: Stack and Calling
-
-How Large Values Are Returned
------------------------------
-
-   When a function value's mode is `BLKmode' (and in some other cases),
-the value is not returned according to `FUNCTION_VALUE' (*note Scalar
-Return::.).  Instead, the caller passes the address of a block of
-memory in which the value should be stored.  This address is called the
-"structure value address".
-
-   This section describes how to control returning structure values in
-memory.
-
-`RETURN_IN_MEMORY (TYPE)'
-     A C expression which can inhibit the returning of certain function
-     values in registers, based on the type of value.  A nonzero value
-     says to return the function value in memory, just as large
-     structures are always returned.  Here TYPE will be a C expression
-     of type `tree', representing the data type of the value.
-
-     Note that values of mode `BLKmode' must be explicitly handled by
-     this macro.  Also, the option `-fpcc-struct-return' takes effect
-     regardless of this macro.  On most systems, it is possible to
-     leave the macro undefined; this causes a default definition to be
-     used, whose value is the constant 1 for `BLKmode' values, and 0
-     otherwise.
-
-     Do not use this macro to indicate that structures and unions
-     should always be returned in memory.  You should instead use
-     `DEFAULT_PCC_STRUCT_RETURN' to indicate this.
-
-`DEFAULT_PCC_STRUCT_RETURN'
-     Define this macro to be 1 if all structure and union return values
-     must be in memory.  Since this results in slower code, this should
-     be defined only if needed for compatibility with other compilers
-     or with an ABI.  If you define this macro to be 0, then the
-     conventions used for structure and union return values are decided
-     by the `RETURN_IN_MEMORY' macro.
-
-     If not defined, this defaults to the value 1.
-
-`STRUCT_VALUE_REGNUM'
-     If the structure value address is passed in a register, then
-     `STRUCT_VALUE_REGNUM' should be the number of that register.
-
-`STRUCT_VALUE'
-     If the structure value address is not passed in a register, define
-     `STRUCT_VALUE' as an expression returning an RTX for the place
-     where the address is passed.  If it returns 0, the address is
-     passed as an "invisible" first argument.
-
-`STRUCT_VALUE_INCOMING_REGNUM'
-     On some architectures the place where the structure value address
-     is found by the called function is not the same place that the
-     caller put it.  This can be due to register windows, or it could
-     be because the function prologue moves it to a different place.
-
-     If the incoming location of the structure value address is in a
-     register, define this macro as the register number.
-
-`STRUCT_VALUE_INCOMING'
-     If the incoming location is not a register, then you should define
-     `STRUCT_VALUE_INCOMING' as an expression for an RTX for where the
-     called function should find the value.  If it should find the
-     value on the stack, define this to create a `mem' which refers to
-     the frame pointer.  A definition of 0 means that the address is
-     passed as an "invisible" first argument.
-
-`PCC_STATIC_STRUCT_RETURN'
-     Define this macro if the usual system convention on the target
-     machine for returning structures and unions is for the called
-     function to return the address of a static variable containing the
-     value.
-
-     Do not define this if the usual system convention is for the
-     caller to pass an address to the subroutine.
-
-     This macro has effect in `-fpcc-struct-return' mode, but it does
-     nothing when you use `-freg-struct-return' mode.
-
-\1f
-File: gcc.info,  Node: Caller Saves,  Next: Function Entry,  Prev: Aggregate Return,  Up: Stack and Calling
-
-Caller-Saves Register Allocation
---------------------------------
-
-   If you enable it, GNU CC can save registers around function calls.
-This makes it possible to use call-clobbered registers to hold
-variables that must live across calls.
-
-`DEFAULT_CALLER_SAVES'
-     Define this macro if function calls on the target machine do not
-     preserve any registers; in other words, if `CALL_USED_REGISTERS'
-     has 1 for all registers.  This macro enables `-fcaller-saves' by
-     default.  Eventually that option will be enabled by default on all
-     machines and both the option and this macro will be eliminated.
-
-`CALLER_SAVE_PROFITABLE (REFS, CALLS)'
-     A C expression to determine whether it is worthwhile to consider
-     placing a pseudo-register in a call-clobbered hard register and
-     saving and restoring it around each function call.  The expression
-     should be 1 when this is worth doing, and 0 otherwise.
-
-     If you don't define this macro, a default is used which is good on
-     most machines: `4 * CALLS < REFS'.
-
-\1f
-File: gcc.info,  Node: Function Entry,  Next: Profiling,  Prev: Caller Saves,  Up: Stack and Calling
-
-Function Entry and Exit
------------------------
-
-   This section describes the macros that output function entry
-("prologue") and exit ("epilogue") code.
-
-`FUNCTION_PROLOGUE (FILE, SIZE)'
-     A C compound statement that outputs the assembler code for entry
-     to a function.  The prologue is responsible for setting up the
-     stack frame, initializing the frame pointer register, saving
-     registers that must be saved, and allocating SIZE additional bytes
-     of storage for the local variables.  SIZE is an integer.  FILE is
-     a stdio stream to which the assembler code should be output.
-
-     The label for the beginning of the function need not be output by
-     this macro.  That has already been done when the macro is run.
-
-     To determine which registers to save, the macro can refer to the
-     array `regs_ever_live': element R is nonzero if hard register R is
-     used anywhere within the function.  This implies the function
-     prologue should save register R, provided it is not one of the
-     call-used registers.  (`FUNCTION_EPILOGUE' must likewise use
-     `regs_ever_live'.)
-
-     On machines that have "register windows", the function entry code
-     does not save on the stack the registers that are in the windows,
-     even if they are supposed to be preserved by function calls;
-     instead it takes appropriate steps to "push" the register stack,
-     if any non-call-used registers are used in the function.
-
-     On machines where functions may or may not have frame-pointers, the
-     function entry code must vary accordingly; it must set up the frame
-     pointer if one is wanted, and not otherwise.  To determine whether
-     a frame pointer is in wanted, the macro can refer to the variable
-     `frame_pointer_needed'.  The variable's value will be 1 at run
-     time in a function that needs a frame pointer.  *Note
-     Elimination::.
-
-     The function entry code is responsible for allocating any stack
-     space required for the function.  This stack space consists of the
-     regions listed below.  In most cases, these regions are allocated
-     in the order listed, with the last listed region closest to the
-     top of the stack (the lowest address if `STACK_GROWS_DOWNWARD' is
-     defined, and the highest address if it is not defined).  You can
-     use a different order for a machine if doing so is more convenient
-     or required for compatibility reasons.  Except in cases where
-     required by standard or by a debugger, there is no reason why the
-     stack layout used by GCC need agree with that used by other
-     compilers for a machine.
-
-        * A region of `current_function_pretend_args_size' bytes of
-          uninitialized space just underneath the first argument
-          arriving on the stack.  (This may not be at the very start of
-          the allocated stack region if the calling sequence has pushed
-          anything else since pushing the stack arguments.  But
-          usually, on such machines, nothing else has been pushed yet,
-          because the function prologue itself does all the pushing.)
-          This region is used on machines where an argument may be
-          passed partly in registers and partly in memory, and, in some
-          cases to support the features in `varargs.h' and `stdargs.h'.
-
-        * An area of memory used to save certain registers used by the
-          function.  The size of this area, which may also include
-          space for such things as the return address and pointers to
-          previous stack frames, is machine-specific and usually
-          depends on which registers have been used in the function.
-          Machines with register windows often do not require a save
-          area.
-
-        * A region of at least SIZE bytes, possibly rounded up to an
-          allocation boundary, to contain the local variables of the
-          function.  On some machines, this region and the save area
-          may occur in the opposite order, with the save area closer to
-          the top of the stack.
-
-        * Optionally, when `ACCUMULATE_OUTGOING_ARGS' is defined, a
-          region of `current_function_outgoing_args_size' bytes to be
-          used for outgoing argument lists of the function.  *Note
-          Stack Arguments::.
-
-     Normally, it is necessary for the macros `FUNCTION_PROLOGUE' and
-     `FUNCTION_EPILOGUE' to treat leaf functions specially.  The C
-     variable `leaf_function' is nonzero for such a function.
-
-`EXIT_IGNORE_STACK'
-     Define this macro as a C expression that is nonzero if the return
-     instruction or the function epilogue ignores the value of the stack
-     pointer; in other words, if it is safe to delete an instruction to
-     adjust the stack pointer before a return from the function.
-
-     Note that this macro's value is relevant only for functions for
-     which frame pointers are maintained.  It is never safe to delete a
-     final stack adjustment in a function that has no frame pointer,
-     and the compiler knows this regardless of `EXIT_IGNORE_STACK'.
-
-`EPILOGUE_USES (REGNO)'
-     Define this macro as a C expression that is nonzero for registers
-     are used by the epilogue or the `return' pattern.  The stack and
-     frame pointer registers are already be assumed to be used as
-     needed.
-
-`FUNCTION_EPILOGUE (FILE, SIZE)'
-     A C compound statement that outputs the assembler code for exit
-     from a function.  The epilogue is responsible for restoring the
-     saved registers and stack pointer to their values when the
-     function was called, and returning control to the caller.  This
-     macro takes the same arguments as the macro `FUNCTION_PROLOGUE',
-     and the registers to restore are determined from `regs_ever_live'
-     and `CALL_USED_REGISTERS' in the same way.
-
-     On some machines, there is a single instruction that does all the
-     work of returning from the function.  On these machines, give that
-     instruction the name `return' and do not define the macro
-     `FUNCTION_EPILOGUE' at all.
-
-     Do not define a pattern named `return' if you want the
-     `FUNCTION_EPILOGUE' to be used.  If you want the target switches
-     to control whether return instructions or epilogues are used,
-     define a `return' pattern with a validity condition that tests the
-     target switches appropriately.  If the `return' pattern's validity
-     condition is false, epilogues will be used.
-
-     On machines where functions may or may not have frame-pointers, the
-     function exit code must vary accordingly.  Sometimes the code for
-     these two cases is completely different.  To determine whether a
-     frame pointer is wanted, the macro can refer to the variable
-     `frame_pointer_needed'.  The variable's value will be 1 when
-     compiling a function that needs a frame pointer.
-
-     Normally, `FUNCTION_PROLOGUE' and `FUNCTION_EPILOGUE' must treat
-     leaf functions specially.  The C variable `leaf_function' is
-     nonzero for such a function.  *Note Leaf Functions::.
-
-     On some machines, some functions pop their arguments on exit while
-     others leave that for the caller to do.  For example, the 68020
-     when given `-mrtd' pops arguments in functions that take a fixed
-     number of arguments.
-
-     Your definition of the macro `RETURN_POPS_ARGS' decides which
-     functions pop their own arguments.  `FUNCTION_EPILOGUE' needs to
-     know what was decided.  The variable that is called
-     `current_function_pops_args' is the number of bytes of its
-     arguments that a function should pop.  *Note Scalar Return::.
-
-`DELAY_SLOTS_FOR_EPILOGUE'
-     Define this macro if the function epilogue contains delay slots to
-     which instructions from the rest of the function can be "moved".
-     The definition should be a C expression whose value is an integer
-     representing the number of delay slots there.
-
-`ELIGIBLE_FOR_EPILOGUE_DELAY (INSN, N)'
-     A C expression that returns 1 if INSN can be placed in delay slot
-     number N of the epilogue.
-
-     The argument N is an integer which identifies the delay slot now
-     being considered (since different slots may have different rules of
-     eligibility).  It is never negative and is always less than the
-     number of epilogue delay slots (what `DELAY_SLOTS_FOR_EPILOGUE'
-     returns).  If you reject a particular insn for a given delay slot,
-     in principle, it may be reconsidered for a subsequent delay slot.
-     Also, other insns may (at least in principle) be considered for
-     the so far unfilled delay slot.
-
-     The insns accepted to fill the epilogue delay slots are put in an
-     RTL list made with `insn_list' objects, stored in the variable
-     `current_function_epilogue_delay_list'.  The insn for the first
-     delay slot comes first in the list.  Your definition of the macro
-     `FUNCTION_EPILOGUE' should fill the delay slots by outputting the
-     insns in this list, usually by calling `final_scan_insn'.
-
-     You need not define this macro if you did not define
-     `DELAY_SLOTS_FOR_EPILOGUE'.
-
-`ASM_OUTPUT_MI_THUNK (FILE, THUNK_FNDECL, DELTA, FUNCTION)'
-     A C compound statement that outputs the assembler code for a thunk
-     function, used to implement C++ virtual function calls with
-     multiple inheritance.  The thunk acts as a wrapper around a
-     virtual function, adjusting the implicit object parameter before
-     handing control off to the real function.
-
-     First, emit code to add the integer DELTA to the location that
-     contains the incoming first argument.  Assume that this argument
-     contains a pointer, and is the one used to pass the `this' pointer
-     in C++.  This is the incoming argument *before* the function
-     prologue, e.g. `%o0' on a sparc.  The addition must preserve the
-     values of all other incoming arguments.
-
-     After the addition, emit code to jump to FUNCTION, which is a
-     `FUNCTION_DECL'.  This is a direct pure jump, not a call, and does
-     not touch the return address.  Hence returning from FUNCTION will
-     return to whoever called the current `thunk'.
-
-     The effect must be as if FUNCTION had been called directly with
-     the adjusted first argument.  This macro is responsible for
-     emitting all of the code for a thunk function; `FUNCTION_PROLOGUE'
-     and `FUNCTION_EPILOGUE' are not invoked.
-
-     The THUNK_FNDECL is redundant.  (DELTA and FUNCTION have already
-     been extracted from it.)  It might possibly be useful on some
-     targets, but probably not.
-
-     If you do not define this macro, the target-independent code in
-     the C++ frontend will generate a less efficient heavyweight thunk
-     that calls FUNCTION instead of jumping to it.  The generic
-     approach does not support varargs.
-
diff --git a/gcc/gcc.info-23 b/gcc/gcc.info-23
deleted file mode 100644 (file)
index 79c4ab9..0000000
+++ /dev/null
@@ -1,972 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Profiling,  Prev: Function Entry,  Up: Stack and Calling
-
-Generating Code for Profiling
------------------------------
-
-   These macros will help you generate code for profiling.
-
-`FUNCTION_PROFILER (FILE, LABELNO)'
-     A C statement or compound statement to output to FILE some
-     assembler code to call the profiling subroutine `mcount'.  Before
-     calling, the assembler code must load the address of a counter
-     variable into a register where `mcount' expects to find the
-     address.  The name of this variable is `LP' followed by the number
-     LABELNO, so you would generate the name using `LP%d' in a
-     `fprintf'.
-
-     The details of how the address should be passed to `mcount' are
-     determined by your operating system environment, not by GNU CC.  To
-     figure them out, compile a small program for profiling using the
-     system's installed C compiler and look at the assembler code that
-     results.
-
-`PROFILE_BEFORE_PROLOGUE'
-     Define this macro if the code for function profiling should come
-     before the function prologue.  Normally, the profiling code comes
-     after.
-
-`FUNCTION_BLOCK_PROFILER (FILE, LABELNO)'
-     A C statement or compound statement to output to FILE some
-     assembler code to initialize basic-block profiling for the current
-     object module.  The global compile flag `profile_block_flag'
-     distingishes two profile modes.
-
-    `profile_block_flag != 2'
-          Output code to call the subroutine `__bb_init_func' once per
-          object module, passing it as its sole argument the address of
-          a block allocated in the object module.
-
-          The name of the block is a local symbol made with this
-          statement:
-
-               ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 0);
-
-          Of course, since you are writing the definition of
-          `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro,
-          you can take a short cut in the definition of this macro and
-          use the name that you know will result.
-
-          The first word of this block is a flag which will be nonzero
-          if the object module has already been initialized.  So test
-          this word first, and do not call `__bb_init_func' if the flag
-          is nonzero.  BLOCK_OR_LABEL contains a unique number which
-          may be used to generate a label as a branch destination when
-          `__bb_init_func' will not be called.
-
-          Described in assembler language, the code to be output looks
-          like:
-
-                 cmp (LPBX0),0
-                 bne local_label
-                 parameter1 <- LPBX0
-                 call __bb_init_func
-               local_label:
-
-    `profile_block_flag == 2'
-          Output code to call the subroutine `__bb_init_trace_func' and
-          pass two parameters to it.  The first parameter is the same as
-          for `__bb_init_func'.  The second parameter is the number of
-          the first basic block of the function as given by
-          BLOCK_OR_LABEL.  Note that `__bb_init_trace_func' has to be
-          called, even if the object module has been initialized
-          already.
-
-          Described in assembler language, the code to be output looks
-          like:
-               parameter1 <- LPBX0
-               parameter2 <- BLOCK_OR_LABEL
-               call __bb_init_trace_func
-
-`BLOCK_PROFILER (FILE, BLOCKNO)'
-     A C statement or compound statement to output to FILE some
-     assembler code to increment the count associated with the basic
-     block number BLOCKNO.  The global compile flag
-     `profile_block_flag' distingishes two profile modes.
-
-    `profile_block_flag != 2'
-          Output code to increment the counter directly.  Basic blocks
-          are numbered separately from zero within each compilation.
-          The count associated with block number BLOCKNO is at index
-          BLOCKNO in a vector of words; the name of this array is a
-          local symbol made with this statement:
-
-               ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 2);
-
-          Of course, since you are writing the definition of
-          `ASM_GENERATE_INTERNAL_LABEL' as well as that of this macro,
-          you can take a short cut in the definition of this macro and
-          use the name that you know will result.
-
-          Described in assembler language, the code to be output looks
-          like:
-
-               inc (LPBX2+4*BLOCKNO)
-
-    `profile_block_flag == 2'
-          Output code to initialize the global structure `__bb' and
-          call the function `__bb_trace_func', which will increment the
-          counter.
-
-          `__bb' consists of two words.  In the first word, the current
-          basic block number, as given by BLOCKNO, has to be stored.  In
-          the second word, the address of a block allocated in the
-          object module has to be stored.  The address is given by the
-          label created with this statement:
-
-               ASM_GENERATE_INTERNAL_LABEL (BUFFER, "LPBX", 0);
-
-          Described in assembler language, the code to be output looks
-          like:
-               move BLOCKNO -> (__bb)
-               move LPBX0 -> (__bb+4)
-               call __bb_trace_func
-
-`FUNCTION_BLOCK_PROFILER_EXIT (FILE)'
-     A C statement or compound statement to output to FILE assembler
-     code to call function `__bb_trace_ret'.  The assembler code should
-     only be output if the global compile flag `profile_block_flag' ==
-     2.  This macro has to be used at every place where code for
-     returning from a function is generated (e.g. `FUNCTION_EPILOGUE').
-     Although you have to write the definition of `FUNCTION_EPILOGUE'
-     as well, you have to define this macro to tell the compiler, that
-     the proper call to `__bb_trace_ret' is produced.
-
-`MACHINE_STATE_SAVE (ID)'
-     A C statement or compound statement to save all registers, which
-     may be clobbered by a function call, including condition codes.
-     The `asm' statement will be mostly likely needed to handle this
-     task.  Local labels in the assembler code can be concatenated with
-     the string ID, to obtain a unique lable name.
-
-     Registers or condition codes clobbered by `FUNCTION_PROLOGUE' or
-     `FUNCTION_EPILOGUE' must be saved in the macros
-     `FUNCTION_BLOCK_PROFILER', `FUNCTION_BLOCK_PROFILER_EXIT' and
-     `BLOCK_PROFILER' prior calling `__bb_init_trace_func',
-     `__bb_trace_ret' and `__bb_trace_func' respectively.
-
-`MACHINE_STATE_RESTORE (ID)'
-     A C statement or compound statement to restore all registers,
-     including condition codes, saved by `MACHINE_STATE_SAVE'.
-
-     Registers or condition codes clobbered by `FUNCTION_PROLOGUE' or
-     `FUNCTION_EPILOGUE' must be restored in the macros
-     `FUNCTION_BLOCK_PROFILER', `FUNCTION_BLOCK_PROFILER_EXIT' and
-     `BLOCK_PROFILER' after calling `__bb_init_trace_func',
-     `__bb_trace_ret' and `__bb_trace_func' respectively.
-
-`BLOCK_PROFILER_CODE'
-     A C function or functions which are needed in the library to
-     support block profiling.
-
-\1f
-File: gcc.info,  Node: Varargs,  Next: Trampolines,  Prev: Stack and Calling,  Up: Target Macros
-
-Implementing the Varargs Macros
-===============================
-
-   GNU CC comes with an implementation of `varargs.h' and `stdarg.h'
-that work without change on machines that pass arguments on the stack.
-Other machines require their own implementations of varargs, and the
-two machine independent header files must have conditionals to include
-it.
-
-   ANSI `stdarg.h' differs from traditional `varargs.h' mainly in the
-calling convention for `va_start'.  The traditional implementation
-takes just one argument, which is the variable in which to store the
-argument pointer.  The ANSI implementation of `va_start' takes an
-additional second argument.  The user is supposed to write the last
-named argument of the function here.
-
-   However, `va_start' should not use this argument.  The way to find
-the end of the named arguments is with the built-in functions described
-below.
-
-`__builtin_saveregs ()'
-     Use this built-in function to save the argument registers in
-     memory so that the varargs mechanism can access them.  Both ANSI
-     and traditional versions of `va_start' must use
-     `__builtin_saveregs', unless you use `SETUP_INCOMING_VARARGS' (see
-     below) instead.
-
-     On some machines, `__builtin_saveregs' is open-coded under the
-     control of the macro `EXPAND_BUILTIN_SAVEREGS'.  On other machines,
-     it calls a routine written in assembler language, found in
-     `libgcc2.c'.
-
-     Code generated for the call to `__builtin_saveregs' appears at the
-     beginning of the function, as opposed to where the call to
-     `__builtin_saveregs' is written, regardless of what the code is.
-     This is because the registers must be saved before the function
-     starts to use them for its own purposes.
-
-`__builtin_args_info (CATEGORY)'
-     Use this built-in function to find the first anonymous arguments in
-     registers.
-
-     In general, a machine may have several categories of registers
-     used for arguments, each for a particular category of data types.
-     (For example, on some machines, floating-point registers are used
-     for floating-point arguments while other arguments are passed in
-     the general registers.)  To make non-varargs functions use the
-     proper calling convention, you have defined the `CUMULATIVE_ARGS'
-     data type to record how many registers in each category have been
-     used so far
-
-     `__builtin_args_info' accesses the same data structure of type
-     `CUMULATIVE_ARGS' after the ordinary argument layout is finished
-     with it, with CATEGORY specifying which word to access.  Thus, the
-     value indicates the first unused register in a given category.
-
-     Normally, you would use `__builtin_args_info' in the implementation
-     of `va_start', accessing each category just once and storing the
-     value in the `va_list' object.  This is because `va_list' will
-     have to update the values, and there is no way to alter the values
-     accessed by `__builtin_args_info'.
-
-`__builtin_next_arg (LASTARG)'
-     This is the equivalent of `__builtin_args_info', for stack
-     arguments.  It returns the address of the first anonymous stack
-     argument, as type `void *'. If `ARGS_GROW_DOWNWARD', it returns
-     the address of the location above the first anonymous stack
-     argument.  Use it in `va_start' to initialize the pointer for
-     fetching arguments from the stack.  Also use it in `va_start' to
-     verify that the second parameter LASTARG is the last named argument
-     of the current function.
-
-`__builtin_classify_type (OBJECT)'
-     Since each machine has its own conventions for which data types are
-     passed in which kind of register, your implementation of `va_arg'
-     has to embody these conventions.  The easiest way to categorize the
-     specified data type is to use `__builtin_classify_type' together
-     with `sizeof' and `__alignof__'.
-
-     `__builtin_classify_type' ignores the value of OBJECT, considering
-     only its data type.  It returns an integer describing what kind of
-     type that is--integer, floating, pointer, structure, and so on.
-
-     The file `typeclass.h' defines an enumeration that you can use to
-     interpret the values of `__builtin_classify_type'.
-
-   These machine description macros help implement varargs:
-
-`EXPAND_BUILTIN_SAVEREGS (ARGS)'
-     If defined, is a C expression that produces the machine-specific
-     code for a call to `__builtin_saveregs'.  This code will be moved
-     to the very beginning of the function, before any parameter access
-     are made.  The return value of this function should be an RTX that
-     contains the value to use as the return of `__builtin_saveregs'.
-
-     The argument ARGS is a `tree_list' containing the arguments that
-     were passed to `__builtin_saveregs'.
-
-     If this macro is not defined, the compiler will output an ordinary
-     call to the library function `__builtin_saveregs'.
-
-`SETUP_INCOMING_VARARGS (ARGS_SO_FAR, MODE, TYPE,'
-     PRETEND_ARGS_SIZE, SECOND_TIME) This macro offers an alternative
-     to using `__builtin_saveregs' and defining the macro
-     `EXPAND_BUILTIN_SAVEREGS'.  Use it to store the anonymous register
-     arguments into the stack so that all the arguments appear to have
-     been passed consecutively on the stack.  Once this is done, you
-     can use the standard implementation of varargs that works for
-     machines that pass all their arguments on the stack.
-
-     The argument ARGS_SO_FAR is the `CUMULATIVE_ARGS' data structure,
-     containing the values that obtain after processing of the named
-     arguments.  The arguments MODE and TYPE describe the last named
-     argument--its machine mode and its data type as a tree node.
-
-     The macro implementation should do two things: first, push onto the
-     stack all the argument registers *not* used for the named
-     arguments, and second, store the size of the data thus pushed into
-     the `int'-valued variable whose name is supplied as the argument
-     PRETEND_ARGS_SIZE.  The value that you store here will serve as
-     additional offset for setting up the stack frame.
-
-     Because you must generate code to push the anonymous arguments at
-     compile time without knowing their data types,
-     `SETUP_INCOMING_VARARGS' is only useful on machines that have just
-     a single category of argument register and use it uniformly for
-     all data types.
-
-     If the argument SECOND_TIME is nonzero, it means that the
-     arguments of the function are being analyzed for the second time.
-     This happens for an inline function, which is not actually
-     compiled until the end of the source file.  The macro
-     `SETUP_INCOMING_VARARGS' should not generate any instructions in
-     this case.
-
-`STRICT_ARGUMENT_NAMING'
-     Define this macro if the location where a function argument is
-     passed depends on whether or not it is a named argument.
-
-     This macro controls how the NAMED argument to `FUNCTION_ARG' is
-     set for varargs and stdarg functions.  With this macro defined,
-     the NAMED argument is always true for named arguments, and false
-     for unnamed arguments.  If this is not defined, but
-     `SETUP_INCOMING_VARARGS' is defined, then all arguments are
-     treated as named.  Otherwise, all named arguments except the last
-     are treated as named.
-
-\1f
-File: gcc.info,  Node: Trampolines,  Next: Library Calls,  Prev: Varargs,  Up: Target Macros
-
-Trampolines for Nested Functions
-================================
-
-   A "trampoline" is a small piece of code that is created at run time
-when the address of a nested function is taken.  It normally resides on
-the stack, in the stack frame of the containing function.  These macros
-tell GNU CC how to generate code to allocate and initialize a
-trampoline.
-
-   The instructions in the trampoline must do two things: load a
-constant address into the static chain register, and jump to the real
-address of the nested function.  On CISC machines such as the m68k,
-this requires two instructions, a move immediate and a jump.  Then the
-two addresses exist in the trampoline as word-long immediate operands.
-On RISC machines, it is often necessary to load each address into a
-register in two parts.  Then pieces of each address form separate
-immediate operands.
-
-   The code generated to initialize the trampoline must store the
-variable parts--the static chain value and the function address--into
-the immediate operands of the instructions.  On a CISC machine, this is
-simply a matter of copying each address to a memory reference at the
-proper offset from the start of the trampoline.  On a RISC machine, it
-may be necessary to take out pieces of the address and store them
-separately.
-
-`TRAMPOLINE_TEMPLATE (FILE)'
-     A C statement to output, on the stream FILE, assembler code for a
-     block of data that contains the constant parts of a trampoline.
-     This code should not include a label--the label is taken care of
-     automatically.
-
-     If you do not define this macro, it means no template is needed
-     for the target.  Do not define this macro on systems where the
-     block move code to copy the trampoline into place would be larger
-     than the code to generate it on the spot.
-
-`TRAMPOLINE_SECTION'
-     The name of a subroutine to switch to the section in which the
-     trampoline template is to be placed (*note Sections::.).  The
-     default is a value of `readonly_data_section', which places the
-     trampoline in the section containing read-only data.
-
-`TRAMPOLINE_SIZE'
-     A C expression for the size in bytes of the trampoline, as an
-     integer.
-
-`TRAMPOLINE_ALIGNMENT'
-     Alignment required for trampolines, in bits.
-
-     If you don't define this macro, the value of `BIGGEST_ALIGNMENT'
-     is used for aligning trampolines.
-
-`INITIALIZE_TRAMPOLINE (ADDR, FNADDR, STATIC_CHAIN)'
-     A C statement to initialize the variable parts of a trampoline.
-     ADDR is an RTX for the address of the trampoline; FNADDR is an RTX
-     for the address of the nested function; STATIC_CHAIN is an RTX for
-     the static chain value that should be passed to the function when
-     it is called.
-
-`ALLOCATE_TRAMPOLINE (FP)'
-     A C expression to allocate run-time space for a trampoline.  The
-     expression value should be an RTX representing a memory reference
-     to the space for the trampoline.
-
-     If this macro is not defined, by default the trampoline is
-     allocated as a stack slot.  This default is right for most
-     machines.  The exceptions are machines where it is impossible to
-     execute instructions in the stack area.  On such machines, you may
-     have to implement a separate stack, using this macro in
-     conjunction with `FUNCTION_PROLOGUE' and `FUNCTION_EPILOGUE'.
-
-     FP points to a data structure, a `struct function', which
-     describes the compilation status of the immediate containing
-     function of the function which the trampoline is for.  Normally
-     (when `ALLOCATE_TRAMPOLINE' is not defined), the stack slot for the
-     trampoline is in the stack frame of this containing function.
-     Other allocation strategies probably must do something analogous
-     with this information.
-
-   Implementing trampolines is difficult on many machines because they
-have separate instruction and data caches.  Writing into a stack
-location fails to clear the memory in the instruction cache, so when
-the program jumps to that location, it executes the old contents.
-
-   Here are two possible solutions.  One is to clear the relevant parts
-of the instruction cache whenever a trampoline is set up.  The other is
-to make all trampolines identical, by having them jump to a standard
-subroutine.  The former technique makes trampoline execution faster; the
-latter makes initialization faster.
-
-   To clear the instruction cache when a trampoline is initialized,
-define the following macros which describe the shape of the cache.
-
-`INSN_CACHE_SIZE'
-     The total size in bytes of the cache.
-
-`INSN_CACHE_LINE_WIDTH'
-     The length in bytes of each cache line.  The cache is divided into
-     cache lines which are disjoint slots, each holding a contiguous
-     chunk of data fetched from memory.  Each time data is brought into
-     the cache, an entire line is read at once.  The data loaded into a
-     cache line is always aligned on a boundary equal to the line size.
-
-`INSN_CACHE_DEPTH'
-     The number of alternative cache lines that can hold any particular
-     memory location.
-
-   Alternatively, if the machine has system calls or instructions to
-clear the instruction cache directly, you can define the following
-macro.
-
-`CLEAR_INSN_CACHE (BEG, END)'
-     If defined, expands to a C expression clearing the *instruction
-     cache* in the specified interval.  If it is not defined, and the
-     macro INSN_CACHE_SIZE is defined, some generic code is generated
-     to clear the cache.  The definition of this macro would typically
-     be a series of `asm' statements.  Both BEG and END are both pointer
-     expressions.
-
-   To use a standard subroutine, define the following macro.  In
-addition, you must make sure that the instructions in a trampoline fill
-an entire cache line with identical instructions, or else ensure that
-the beginning of the trampoline code is always aligned at the same
-point in its cache line.  Look in `m68k.h' as a guide.
-
-`TRANSFER_FROM_TRAMPOLINE'
-     Define this macro if trampolines need a special subroutine to do
-     their work.  The macro should expand to a series of `asm'
-     statements which will be compiled with GNU CC.  They go in a
-     library function named `__transfer_from_trampoline'.
-
-     If you need to avoid executing the ordinary prologue code of a
-     compiled C function when you jump to the subroutine, you can do so
-     by placing a special label of your own in the assembler code.  Use
-     one `asm' statement to generate an assembler label, and another to
-     make the label global.  Then trampolines can use that label to
-     jump directly to your special assembler code.
-
-\1f
-File: gcc.info,  Node: Library Calls,  Next: Addressing Modes,  Prev: Trampolines,  Up: Target Macros
-
-Implicit Calls to Library Routines
-==================================
-
-   Here is an explanation of implicit calls to library routines.
-
-`MULSI3_LIBCALL'
-     A C string constant giving the name of the function to call for
-     multiplication of one signed full-word by another.  If you do not
-     define this macro, the default name is used, which is `__mulsi3',
-     a function defined in `libgcc.a'.
-
-`DIVSI3_LIBCALL'
-     A C string constant giving the name of the function to call for
-     division of one signed full-word by another.  If you do not define
-     this macro, the default name is used, which is `__divsi3', a
-     function defined in `libgcc.a'.
-
-`UDIVSI3_LIBCALL'
-     A C string constant giving the name of the function to call for
-     division of one unsigned full-word by another.  If you do not
-     define this macro, the default name is used, which is `__udivsi3',
-     a function defined in `libgcc.a'.
-
-`MODSI3_LIBCALL'
-     A C string constant giving the name of the function to call for the
-     remainder in division of one signed full-word by another.  If you
-     do not define this macro, the default name is used, which is
-     `__modsi3', a function defined in `libgcc.a'.
-
-`UMODSI3_LIBCALL'
-     A C string constant giving the name of the function to call for the
-     remainder in division of one unsigned full-word by another.  If
-     you do not define this macro, the default name is used, which is
-     `__umodsi3', a function defined in `libgcc.a'.
-
-`MULDI3_LIBCALL'
-     A C string constant giving the name of the function to call for
-     multiplication of one signed double-word by another.  If you do not
-     define this macro, the default name is used, which is `__muldi3',
-     a function defined in `libgcc.a'.
-
-`DIVDI3_LIBCALL'
-     A C string constant giving the name of the function to call for
-     division of one signed double-word by another.  If you do not
-     define this macro, the default name is used, which is `__divdi3', a
-     function defined in `libgcc.a'.
-
-`UDIVDI3_LIBCALL'
-     A C string constant giving the name of the function to call for
-     division of one unsigned full-word by another.  If you do not
-     define this macro, the default name is used, which is `__udivdi3',
-     a function defined in `libgcc.a'.
-
-`MODDI3_LIBCALL'
-     A C string constant giving the name of the function to call for the
-     remainder in division of one signed double-word by another.  If
-     you do not define this macro, the default name is used, which is
-     `__moddi3', a function defined in `libgcc.a'.
-
-`UMODDI3_LIBCALL'
-     A C string constant giving the name of the function to call for the
-     remainder in division of one unsigned full-word by another.  If
-     you do not define this macro, the default name is used, which is
-     `__umoddi3', a function defined in `libgcc.a'.
-
-`INIT_TARGET_OPTABS'
-     Define this macro as a C statement that declares additional library
-     routines renames existing ones. `init_optabs' calls this macro
-     after initializing all the normal library routines.
-
-`TARGET_EDOM'
-     The value of `EDOM' on the target machine, as a C integer constant
-     expression.  If you don't define this macro, GNU CC does not
-     attempt to deposit the value of `EDOM' into `errno' directly.
-     Look in `/usr/include/errno.h' to find the value of `EDOM' on your
-     system.
-
-     If you do not define `TARGET_EDOM', then compiled code reports
-     domain errors by calling the library function and letting it
-     report the error.  If mathematical functions on your system use
-     `matherr' when there is an error, then you should leave
-     `TARGET_EDOM' undefined so that `matherr' is used normally.
-
-`GEN_ERRNO_RTX'
-     Define this macro as a C expression to create an rtl expression
-     that refers to the global "variable" `errno'.  (On certain systems,
-     `errno' may not actually be a variable.)  If you don't define this
-     macro, a reasonable default is used.
-
-`TARGET_MEM_FUNCTIONS'
-     Define this macro if GNU CC should generate calls to the System V
-     (and ANSI C) library functions `memcpy' and `memset' rather than
-     the BSD functions `bcopy' and `bzero'.
-
-`LIBGCC_NEEDS_DOUBLE'
-     Define this macro if only `float' arguments cannot be passed to
-     library routines (so they must be converted to `double').  This
-     macro affects both how library calls are generated and how the
-     library routines in `libgcc1.c' accept their arguments.  It is
-     useful on machines where floating and fixed point arguments are
-     passed differently, such as the i860.
-
-`FLOAT_ARG_TYPE'
-     Define this macro to override the type used by the library
-     routines to pick up arguments of type `float'.  (By default, they
-     use a union of `float' and `int'.)
-
-     The obvious choice would be `float'--but that won't work with
-     traditional C compilers that expect all arguments declared as
-     `float' to arrive as `double'.  To avoid this conversion, the
-     library routines ask for the value as some other type and then
-     treat it as a `float'.
-
-     On some systems, no other type will work for this.  For these
-     systems, you must use `LIBGCC_NEEDS_DOUBLE' instead, to force
-     conversion of the values `double' before they are passed.
-
-`FLOATIFY (PASSED-VALUE)'
-     Define this macro to override the way library routines redesignate
-     a `float' argument as a `float' instead of the type it was passed
-     as.  The default is an expression which takes the `float' field of
-     the union.
-
-`FLOAT_VALUE_TYPE'
-     Define this macro to override the type used by the library
-     routines to return values that ought to have type `float'.  (By
-     default, they use `int'.)
-
-     The obvious choice would be `float'--but that won't work with
-     traditional C compilers gratuitously convert values declared as
-     `float' into `double'.
-
-`INTIFY (FLOAT-VALUE)'
-     Define this macro to override the way the value of a
-     `float'-returning library routine should be packaged in order to
-     return it.  These functions are actually declared to return type
-     `FLOAT_VALUE_TYPE' (normally `int').
-
-     These values can't be returned as type `float' because traditional
-     C compilers would gratuitously convert the value to a `double'.
-
-     A local variable named `intify' is always available when the macro
-     `INTIFY' is used.  It is a union of a `float' field named `f' and
-     a field named `i' whose type is `FLOAT_VALUE_TYPE' or `int'.
-
-     If you don't define this macro, the default definition works by
-     copying the value through that union.
-
-`nongcc_SI_type'
-     Define this macro as the name of the data type corresponding to
-     `SImode' in the system's own C compiler.
-
-     You need not define this macro if that type is `long int', as it
-     usually is.
-
-`nongcc_word_type'
-     Define this macro as the name of the data type corresponding to the
-     word_mode in the system's own C compiler.
-
-     You need not define this macro if that type is `long int', as it
-     usually is.
-
-`perform_...'
-     Define these macros to supply explicit C statements to carry out
-     various arithmetic operations on types `float' and `double' in the
-     library routines in `libgcc1.c'.  See that file for a full list of
-     these macros and their arguments.
-
-     On most machines, you don't need to define any of these macros,
-     because the C compiler that comes with the system takes care of
-     doing them.
-
-`NEXT_OBJC_RUNTIME'
-     Define this macro to generate code for Objective C message sending
-     using the calling convention of the NeXT system.  This calling
-     convention involves passing the object, the selector and the
-     method arguments all at once to the method-lookup library function.
-
-     The default calling convention passes just the object and the
-     selector to the lookup function, which returns a pointer to the
-     method.
-
-\1f
-File: gcc.info,  Node: Addressing Modes,  Next: Condition Code,  Prev: Library Calls,  Up: Target Macros
-
-Addressing Modes
-================
-
-   This is about addressing modes.
-
-`HAVE_POST_INCREMENT'
-     Define this macro if the machine supports post-increment
-     addressing.
-
-`HAVE_PRE_INCREMENT'
-`HAVE_POST_DECREMENT'
-`HAVE_PRE_DECREMENT'
-     Similar for other kinds of addressing.
-
-`CONSTANT_ADDRESS_P (X)'
-     A C expression that is 1 if the RTX X is a constant which is a
-     valid address.  On most machines, this can be defined as
-     `CONSTANT_P (X)', but a few machines are more restrictive in which
-     constant addresses are supported.
-
-     `CONSTANT_P' accepts integer-values expressions whose values are
-     not explicitly known, such as `symbol_ref', `label_ref', and
-     `high' expressions and `const' arithmetic expressions, in addition
-     to `const_int' and `const_double' expressions.
-
-`MAX_REGS_PER_ADDRESS'
-     A number, the maximum number of registers that can appear in a
-     valid memory address.  Note that it is up to you to specify a
-     value equal to the maximum number that `GO_IF_LEGITIMATE_ADDRESS'
-     would ever accept.
-
-`GO_IF_LEGITIMATE_ADDRESS (MODE, X, LABEL)'
-     A C compound statement with a conditional `goto LABEL;' executed
-     if X (an RTX) is a legitimate memory address on the target machine
-     for a memory operand of mode MODE.
-
-     It usually pays to define several simpler macros to serve as
-     subroutines for this one.  Otherwise it may be too complicated to
-     understand.
-
-     This macro must exist in two variants: a strict variant and a
-     non-strict one.  The strict variant is used in the reload pass.  It
-     must be defined so that any pseudo-register that has not been
-     allocated a hard register is considered a memory reference.  In
-     contexts where some kind of register is required, a pseudo-register
-     with no hard register must be rejected.
-
-     The non-strict variant is used in other passes.  It must be
-     defined to accept all pseudo-registers in every context where some
-     kind of register is required.
-
-     Compiler source files that want to use the strict variant of this
-     macro define the macro `REG_OK_STRICT'.  You should use an `#ifdef
-     REG_OK_STRICT' conditional to define the strict variant in that
-     case and the non-strict variant otherwise.
-
-     Subroutines to check for acceptable registers for various purposes
-     (one for base registers, one for index registers, and so on) are
-     typically among the subroutines used to define
-     `GO_IF_LEGITIMATE_ADDRESS'.  Then only these subroutine macros
-     need have two variants; the higher levels of macros may be the
-     same whether strict or not.
-
-     Normally, constant addresses which are the sum of a `symbol_ref'
-     and an integer are stored inside a `const' RTX to mark them as
-     constant.  Therefore, there is no need to recognize such sums
-     specifically as legitimate addresses.  Normally you would simply
-     recognize any `const' as legitimate.
-
-     Usually `PRINT_OPERAND_ADDRESS' is not prepared to handle constant
-     sums that are not marked with  `const'.  It assumes that a naked
-     `plus' indicates indexing.  If so, then you *must* reject such
-     naked constant sums as illegitimate addresses, so that none of
-     them will be given to `PRINT_OPERAND_ADDRESS'.
-
-     On some machines, whether a symbolic address is legitimate depends
-     on the section that the address refers to.  On these machines,
-     define the macro `ENCODE_SECTION_INFO' to store the information
-     into the `symbol_ref', and then check for it here.  When you see a
-     `const', you will have to look inside it to find the `symbol_ref'
-     in order to determine the section.  *Note Assembler Format::.
-
-     The best way to modify the name string is by adding text to the
-     beginning, with suitable punctuation to prevent any ambiguity.
-     Allocate the new name in `saveable_obstack'.  You will have to
-     modify `ASM_OUTPUT_LABELREF' to remove and decode the added text
-     and output the name accordingly, and define `STRIP_NAME_ENCODING'
-     to access the original name string.
-
-     You can check the information stored here into the `symbol_ref' in
-     the definitions of the macros `GO_IF_LEGITIMATE_ADDRESS' and
-     `PRINT_OPERAND_ADDRESS'.
-
-`REG_OK_FOR_BASE_P (X)'
-     A C expression that is nonzero if X (assumed to be a `reg' RTX) is
-     valid for use as a base register.  For hard registers, it should
-     always accept those which the hardware permits and reject the
-     others.  Whether the macro accepts or rejects pseudo registers
-     must be controlled by `REG_OK_STRICT' as described above.  This
-     usually requires two variant definitions, of which `REG_OK_STRICT'
-     controls the one actually used.
-
-`REG_MODE_OK_FOR_BASE_P (X, MODE)'
-     A C expression that is just like `REG_OK_FOR_BASE_P', except that
-     that expression may examine the mode of the memory reference in
-     MODE.  You should define this macro if the mode of the memory
-     reference affects whether a register may be used as a base
-     register.  If you define this macro, the compiler will use it
-     instead of `REG_OK_FOR_BASE_P'.
-
-`REG_OK_FOR_INDEX_P (X)'
-     A C expression that is nonzero if X (assumed to be a `reg' RTX) is
-     valid for use as an index register.
-
-     The difference between an index register and a base register is
-     that the index register may be scaled.  If an address involves the
-     sum of two registers, neither one of them scaled, then either one
-     may be labeled the "base" and the other the "index"; but whichever
-     labeling is used must fit the machine's constraints of which
-     registers may serve in each capacity.  The compiler will try both
-     labelings, looking for one that is valid, and will reload one or
-     both registers only if neither labeling works.
-
-`LEGITIMIZE_ADDRESS (X, OLDX, MODE, WIN)'
-     A C compound statement that attempts to replace X with a valid
-     memory address for an operand of mode MODE.  WIN will be a C
-     statement label elsewhere in the code; the macro definition may use
-
-          GO_IF_LEGITIMATE_ADDRESS (MODE, X, WIN);
-
-     to avoid further processing if the address has become legitimate.
-
-     X will always be the result of a call to `break_out_memory_refs',
-     and OLDX will be the operand that was given to that function to
-     produce X.
-
-     The code generated by this macro should not alter the substructure
-     of X.  If it transforms X into a more legitimate form, it should
-     assign X (which will always be a C variable) a new value.
-
-     It is not necessary for this macro to come up with a legitimate
-     address.  The compiler has standard ways of doing so in all cases.
-     In fact, it is safe for this macro to do nothing.  But often a
-     machine-dependent strategy can generate better code.
-
-`GO_IF_MODE_DEPENDENT_ADDRESS (ADDR, LABEL)'
-     A C statement or compound statement with a conditional `goto
-     LABEL;' executed if memory address X (an RTX) can have different
-     meanings depending on the machine mode of the memory reference it
-     is used for or if the address is valid for some modes but not
-     others.
-
-     Autoincrement and autodecrement addresses typically have
-     mode-dependent effects because the amount of the increment or
-     decrement is the size of the operand being addressed.  Some
-     machines have other mode-dependent addresses.  Many RISC machines
-     have no mode-dependent addresses.
-
-     You may assume that ADDR is a valid address for the machine.
-
-`LEGITIMATE_CONSTANT_P (X)'
-     A C expression that is nonzero if X is a legitimate constant for
-     an immediate operand on the target machine.  You can assume that X
-     satisfies `CONSTANT_P', so you need not check this.  In fact, `1'
-     is a suitable definition for this macro on machines where anything
-     `CONSTANT_P' is valid.
-
-\1f
-File: gcc.info,  Node: Condition Code,  Next: Costs,  Prev: Addressing Modes,  Up: Target Macros
-
-Condition Code Status
-=====================
-
-   This describes the condition code status.
-
-   The file `conditions.h' defines a variable `cc_status' to describe
-how the condition code was computed (in case the interpretation of the
-condition code depends on the instruction that it was set by).  This
-variable contains the RTL expressions on which the condition code is
-currently based, and several standard flags.
-
-   Sometimes additional machine-specific flags must be defined in the
-machine description header file.  It can also add additional
-machine-specific information by defining `CC_STATUS_MDEP'.
-
-`CC_STATUS_MDEP'
-     C code for a data type which is used for declaring the `mdep'
-     component of `cc_status'.  It defaults to `int'.
-
-     This macro is not used on machines that do not use `cc0'.
-
-`CC_STATUS_MDEP_INIT'
-     A C expression to initialize the `mdep' field to "empty".  The
-     default definition does nothing, since most machines don't use the
-     field anyway.  If you want to use the field, you should probably
-     define this macro to initialize it.
-
-     This macro is not used on machines that do not use `cc0'.
-
-`NOTICE_UPDATE_CC (EXP, INSN)'
-     A C compound statement to set the components of `cc_status'
-     appropriately for an insn INSN whose body is EXP.  It is this
-     macro's responsibility to recognize insns that set the condition
-     code as a byproduct of other activity as well as those that
-     explicitly set `(cc0)'.
-
-     This macro is not used on machines that do not use `cc0'.
-
-     If there are insns that do not set the condition code but do alter
-     other machine registers, this macro must check to see whether they
-     invalidate the expressions that the condition code is recorded as
-     reflecting.  For example, on the 68000, insns that store in address
-     registers do not set the condition code, which means that usually
-     `NOTICE_UPDATE_CC' can leave `cc_status' unaltered for such insns.
-     But suppose that the previous insn set the condition code based
-     on location `a4@(102)' and the current insn stores a new value in
-     `a4'.  Although the condition code is not changed by this, it will
-     no longer be true that it reflects the contents of `a4@(102)'.
-     Therefore, `NOTICE_UPDATE_CC' must alter `cc_status' in this case
-     to say that nothing is known about the condition code value.
-
-     The definition of `NOTICE_UPDATE_CC' must be prepared to deal with
-     the results of peephole optimization: insns whose patterns are
-     `parallel' RTXs containing various `reg', `mem' or constants which
-     are just the operands.  The RTL structure of these insns is not
-     sufficient to indicate what the insns actually do.  What
-     `NOTICE_UPDATE_CC' should do when it sees one is just to run
-     `CC_STATUS_INIT'.
-
-     A possible definition of `NOTICE_UPDATE_CC' is to call a function
-     that looks at an attribute (*note Insn Attributes::.) named, for
-     example, `cc'.  This avoids having detailed information about
-     patterns in two places, the `md' file and in `NOTICE_UPDATE_CC'.
-
-`EXTRA_CC_MODES'
-     A list of names to be used for additional modes for condition code
-     values in registers (*note Jump Patterns::.).  These names are
-     added to `enum machine_mode' and all have class `MODE_CC'.  By
-     convention, they should start with `CC' and end with `mode'.
-
-     You should only define this macro if your machine does not use
-     `cc0' and only if additional modes are required.
-
-`EXTRA_CC_NAMES'
-     A list of C strings giving the names for the modes listed in
-     `EXTRA_CC_MODES'.  For example, the Sparc defines this macro and
-     `EXTRA_CC_MODES' as
-
-          #define EXTRA_CC_MODES CC_NOOVmode, CCFPmode, CCFPEmode
-          #define EXTRA_CC_NAMES "CC_NOOV", "CCFP", "CCFPE"
-
-     This macro is not required if `EXTRA_CC_MODES' is not defined.
-
-`SELECT_CC_MODE (OP, X, Y)'
-     Returns a mode from class `MODE_CC' to be used when comparison
-     operation code OP is applied to rtx X and Y.  For example, on the
-     Sparc, `SELECT_CC_MODE' is defined as (see *note Jump Patterns::.
-     for a description of the reason for this definition)
-
-          #define SELECT_CC_MODE(OP,X,Y) \
-            (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT          \
-             ? ((OP == EQ || OP == NE) ? CCFPmode : CCFPEmode)    \
-             : ((GET_CODE (X) == PLUS || GET_CODE (X) == MINUS    \
-                 || GET_CODE (X) == NEG) \
-                ? CC_NOOVmode : CCmode))
-
-     You need not define this macro if `EXTRA_CC_MODES' is not defined.
-
-`CANONICALIZE_COMPARISON (CODE, OP0, OP1)'
-     One some machines not all possible comparisons are defined, but
-     you can convert an invalid comparison into a valid one.  For
-     example, the Alpha does not have a `GT' comparison, but you can
-     use an `LT' comparison instead and swap the order of the operands.
-
-     On such machines, define this macro to be a C statement to do any
-     required conversions.  CODE is the initial comparison code and OP0
-     and OP1 are the left and right operands of the comparison,
-     respectively.  You should modify CODE, OP0, and OP1 as required.
-
-     GNU CC will not assume that the comparison resulting from this
-     macro is valid but will see if the resulting insn matches a
-     pattern in the `md' file.
-
-     You need not define this macro if it would never change the
-     comparison code or operands.
-
-`REVERSIBLE_CC_MODE (MODE)'
-     A C expression whose value is one if it is always safe to reverse a
-     comparison whose mode is MODE.  If `SELECT_CC_MODE' can ever
-     return MODE for a floating-point inequality comparison, then
-     `REVERSIBLE_CC_MODE (MODE)' must be zero.
-
-     You need not define this macro if it would always returns zero or
-     if the floating-point format is anything other than
-     `IEEE_FLOAT_FORMAT'.  For example, here is the definition used on
-     the Sparc, where floating-point inequality comparisons are always
-     given `CCFPEmode':
-
-          #define REVERSIBLE_CC_MODE(MODE)  ((MODE) != CCFPEmode)
-
diff --git a/gcc/gcc.info-24 b/gcc/gcc.info-24
deleted file mode 100644 (file)
index f33b78f..0000000
+++ /dev/null
@@ -1,1043 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Costs,  Next: Sections,  Prev: Condition Code,  Up: Target Macros
-
-Describing Relative Costs of Operations
-=======================================
-
-   These macros let you describe the relative speed of various
-operations on the target machine.
-
-`CONST_COSTS (X, CODE, OUTER_CODE)'
-     A part of a C `switch' statement that describes the relative costs
-     of constant RTL expressions.  It must contain `case' labels for
-     expression codes `const_int', `const', `symbol_ref', `label_ref'
-     and `const_double'.  Each case must ultimately reach a `return'
-     statement to return the relative cost of the use of that kind of
-     constant value in an expression.  The cost may depend on the
-     precise value of the constant, which is available for examination
-     in X, and the rtx code of the expression in which it is contained,
-     found in OUTER_CODE.
-
-     CODE is the expression code--redundant, since it can be obtained
-     with `GET_CODE (X)'.
-
-`RTX_COSTS (X, CODE, OUTER_CODE)'
-     Like `CONST_COSTS' but applies to nonconstant RTL expressions.
-     This can be used, for example, to indicate how costly a multiply
-     instruction is.  In writing this macro, you can use the construct
-     `COSTS_N_INSNS (N)' to specify a cost equal to N fast
-     instructions.  OUTER_CODE is the code of the expression in which X
-     is contained.
-
-     This macro is optional; do not define it if the default cost
-     assumptions are adequate for the target machine.
-
-`ADDRESS_COST (ADDRESS)'
-     An expression giving the cost of an addressing mode that contains
-     ADDRESS.  If not defined, the cost is computed from the ADDRESS
-     expression and the `CONST_COSTS' values.
-
-     For most CISC machines, the default cost is a good approximation
-     of the true cost of the addressing mode.  However, on RISC
-     machines, all instructions normally have the same length and
-     execution time.  Hence all addresses will have equal costs.
-
-     In cases where more than one form of an address is known, the form
-     with the lowest cost will be used.  If multiple forms have the
-     same, lowest, cost, the one that is the most complex will be used.
-
-     For example, suppose an address that is equal to the sum of a
-     register and a constant is used twice in the same basic block.
-     When this macro is not defined, the address will be computed in a
-     register and memory references will be indirect through that
-     register.  On machines where the cost of the addressing mode
-     containing the sum is no higher than that of a simple indirect
-     reference, this will produce an additional instruction and
-     possibly require an additional register.  Proper specification of
-     this macro eliminates this overhead for such machines.
-
-     Similar use of this macro is made in strength reduction of loops.
-
-     ADDRESS need not be valid as an address.  In such a case, the cost
-     is not relevant and can be any value; invalid addresses need not be
-     assigned a different cost.
-
-     On machines where an address involving more than one register is as
-     cheap as an address computation involving only one register,
-     defining `ADDRESS_COST' to reflect this can cause two registers to
-     be live over a region of code where only one would have been if
-     `ADDRESS_COST' were not defined in that manner.  This effect should
-     be considered in the definition of this macro.  Equivalent costs
-     should probably only be given to addresses with different numbers
-     of registers on machines with lots of registers.
-
-     This macro will normally either not be defined or be defined as a
-     constant.
-
-`REGISTER_MOVE_COST (FROM, TO)'
-     A C expression for the cost of moving data from a register in class
-     FROM to one in class TO.  The classes are expressed using the
-     enumeration values such as `GENERAL_REGS'.  A value of 2 is the
-     default; other values are interpreted relative to that.
-
-     It is not required that the cost always equal 2 when FROM is the
-     same as TO; on some machines it is expensive to move between
-     registers if they are not general registers.
-
-     If reload sees an insn consisting of a single `set' between two
-     hard registers, and if `REGISTER_MOVE_COST' applied to their
-     classes returns a value of 2, reload does not check to ensure that
-     the constraints of the insn are met.  Setting a cost of other than
-     2 will allow reload to verify that the constraints are met.  You
-     should do this if the `movM' pattern's constraints do not allow
-     such copying.
-
-`MEMORY_MOVE_COST (M)'
-     A C expression for the cost of moving data of mode M between a
-     register and memory.  A value of 4 is the default; this cost is
-     relative to those in `REGISTER_MOVE_COST'.
-
-     If moving between registers and memory is more expensive than
-     between two registers, you should define this macro to express the
-     relative cost.
-
-`BRANCH_COST'
-     A C expression for the cost of a branch instruction.  A value of 1
-     is the default; other values are interpreted relative to that.
-
-   Here are additional macros which do not specify precise relative
-costs, but only that certain actions are more expensive than GNU CC
-would ordinarily expect.
-
-`SLOW_BYTE_ACCESS'
-     Define this macro as a C expression which is nonzero if accessing
-     less than a word of memory (i.e. a `char' or a `short') is no
-     faster than accessing a word of memory, i.e., if such access
-     require more than one instruction or if there is no difference in
-     cost between byte and (aligned) word loads.
-
-     When this macro is not defined, the compiler will access a field by
-     finding the smallest containing object; when it is defined, a
-     fullword load will be used if alignment permits.  Unless bytes
-     accesses are faster than word accesses, using word accesses is
-     preferable since it may eliminate subsequent memory access if
-     subsequent accesses occur to other fields in the same word of the
-     structure, but to different bytes.
-
-`SLOW_ZERO_EXTEND'
-     Define this macro if zero-extension (of a `char' or `short' to an
-     `int') can be done faster if the destination is a register that is
-     known to be zero.
-
-     If you define this macro, you must have instruction patterns that
-     recognize RTL structures like this:
-
-          (set (strict_low_part (subreg:QI (reg:SI ...) 0)) ...)
-
-     and likewise for `HImode'.
-
-`SLOW_UNALIGNED_ACCESS'
-     Define this macro to be the value 1 if unaligned accesses have a
-     cost many times greater than aligned accesses, for example if they
-     are emulated in a trap handler.
-
-     When this macro is non-zero, the compiler will act as if
-     `STRICT_ALIGNMENT' were non-zero when generating code for block
-     moves.  This can cause significantly more instructions to be
-     produced.  Therefore, do not set this macro non-zero if unaligned
-     accesses only add a cycle or two to the time for a memory access.
-
-     If the value of this macro is always zero, it need not be defined.
-
-`DONT_REDUCE_ADDR'
-     Define this macro to inhibit strength reduction of memory
-     addresses.  (On some machines, such strength reduction seems to do
-     harm rather than good.)
-
-`MOVE_RATIO'
-     The number of scalar move insns which should be generated instead
-     of a string move insn or a library call.  Increasing the value
-     will always make code faster, but eventually incurs high cost in
-     increased code size.
-
-     If you don't define this, a reasonable default is used.
-
-`NO_FUNCTION_CSE'
-     Define this macro if it is as good or better to call a constant
-     function address than to call an address kept in a register.
-
-`NO_RECURSIVE_FUNCTION_CSE'
-     Define this macro if it is as good or better for a function to call
-     itself with an explicit address than to call an address kept in a
-     register.
-
-`ADJUST_COST (INSN, LINK, DEP_INSN, COST)'
-     A C statement (sans semicolon) to update the integer variable COST
-     based on the relationship between INSN that is dependent on
-     DEP_INSN through the dependence LINK.  The default is to make no
-     adjustment to COST.  This can be used for example to specify to
-     the scheduler that an output- or anti-dependence does not incur
-     the same cost as a data-dependence.
-
-`ADJUST_PRIORITY (INSN)'
-     A C statement (sans semicolon) to update the integer scheduling
-     priority `INSN_PRIORITY(INSN)'.  Reduce the priority to execute
-     the INSN earlier, increase the priority to execute INSN later.
-     Do not define this macro if you do not need to adjust the
-     scheduling priorities of insns.
-
-\1f
-File: gcc.info,  Node: Sections,  Next: PIC,  Prev: Costs,  Up: Target Macros
-
-Dividing the Output into Sections (Texts, Data, ...)
-====================================================
-
-   An object file is divided into sections containing different types of
-data.  In the most common case, there are three sections: the "text
-section", which holds instructions and read-only data; the "data
-section", which holds initialized writable data; and the "bss section",
-which holds uninitialized data.  Some systems have other kinds of
-sections.
-
-   The compiler must tell the assembler when to switch sections.  These
-macros control what commands to output to tell the assembler this.  You
-can also define additional sections.
-
-`TEXT_SECTION_ASM_OP'
-     A C expression whose value is a string containing the assembler
-     operation that should precede instructions and read-only data.
-     Normally `".text"' is right.
-
-`DATA_SECTION_ASM_OP'
-     A C expression whose value is a string containing the assembler
-     operation to identify the following data as writable initialized
-     data.  Normally `".data"' is right.
-
-`SHARED_SECTION_ASM_OP'
-     If defined, a C expression whose value is a string containing the
-     assembler operation to identify the following data as shared data.
-     If not defined, `DATA_SECTION_ASM_OP' will be used.
-
-`BSS_SECTION_ASM_OP'
-     If defined, a C expression whose value is a string containing the
-     assembler operation to identify the following data as
-     uninitialized global data.  If not defined, and neither
-     `ASM_OUTPUT_BSS' nor `ASM_OUTPUT_ALIGNED_BSS' are defined,
-     uninitialized global data will be output in the data section if
-     `-fno-common' is passed, otherwise `ASM_OUTPUT_COMMON' will be
-     used.
-
-`SHARED_BSS_SECTION_ASM_OP'
-     If defined, a C expression whose value is a string containing the
-     assembler operation to identify the following data as
-     uninitialized global shared data.  If not defined, and
-     `BSS_SECTION_ASM_OP' is, the latter will be used.
-
-`INIT_SECTION_ASM_OP'
-     If defined, a C expression whose value is a string containing the
-     assembler operation to identify the following data as
-     initialization code.  If not defined, GNU CC will assume such a
-     section does not exist.
-
-`EXTRA_SECTIONS'
-     A list of names for sections other than the standard two, which are
-     `in_text' and `in_data'.  You need not define this macro on a
-     system with no other sections (that GCC needs to use).
-
-`EXTRA_SECTION_FUNCTIONS'
-     One or more functions to be defined in `varasm.c'.  These
-     functions should do jobs analogous to those of `text_section' and
-     `data_section', for your additional sections.  Do not define this
-     macro if you do not define `EXTRA_SECTIONS'.
-
-`READONLY_DATA_SECTION'
-     On most machines, read-only variables, constants, and jump tables
-     are placed in the text section.  If this is not the case on your
-     machine, this macro should be defined to be the name of a function
-     (either `data_section' or a function defined in `EXTRA_SECTIONS')
-     that switches to the section to be used for read-only items.
-
-     If these items should be placed in the text section, this macro
-     should not be defined.
-
-`SELECT_SECTION (EXP, RELOC)'
-     A C statement or statements to switch to the appropriate section
-     for output of EXP.  You can assume that EXP is either a `VAR_DECL'
-     node or a constant of some sort.  RELOC indicates whether the
-     initial value of EXP requires link-time relocations.  Select the
-     section by calling `text_section' or one of the alternatives for
-     other sections.
-
-     Do not define this macro if you put all read-only variables and
-     constants in the read-only data section (usually the text section).
-
-`SELECT_RTX_SECTION (MODE, RTX)'
-     A C statement or statements to switch to the appropriate section
-     for output of RTX in mode MODE.  You can assume that RTX is some
-     kind of constant in RTL.  The argument MODE is redundant except in
-     the case of a `const_int' rtx.  Select the section by calling
-     `text_section' or one of the alternatives for other sections.
-
-     Do not define this macro if you put all constants in the read-only
-     data section.
-
-`JUMP_TABLES_IN_TEXT_SECTION'
-     Define this macro if jump tables (for `tablejump' insns) should be
-     output in the text section, along with the assembler instructions.
-     Otherwise, the readonly data section is used.
-
-     This macro is irrelevant if there is no separate readonly data
-     section.
-
-`ENCODE_SECTION_INFO (DECL)'
-     Define this macro if references to a symbol must be treated
-     differently depending on something about the variable or function
-     named by the symbol (such as what section it is in).
-
-     The macro definition, if any, is executed immediately after the
-     rtl for DECL has been created and stored in `DECL_RTL (DECL)'.
-     The value of the rtl will be a `mem' whose address is a
-     `symbol_ref'.
-
-     The usual thing for this macro to do is to record a flag in the
-     `symbol_ref' (such as `SYMBOL_REF_FLAG') or to store a modified
-     name string in the `symbol_ref' (if one bit is not enough
-     information).
-
-`STRIP_NAME_ENCODING (VAR, SYM_NAME)'
-     Decode SYM_NAME and store the real name part in VAR, sans the
-     characters that encode section info.  Define this macro if
-     `ENCODE_SECTION_INFO' alters the symbol's name string.
-
-`UNIQUE_SECTION_P (DECL)'
-     A C expression which evaluates to true if DECL should be placed
-     into a unique section for some target-specific reason.  If you do
-     not define this macro, the default is `0'.  Note that the flag
-     `-ffunction-sections' will also cause functions to be placed into
-     unique sections.
-
-`UNIQUE_SECTION (DECL, RELOC)'
-     A C statement to build up a unique section name, expressed as a
-     STRING_CST node, and assign it to `DECL_SECTION_NAME (DECL)'.
-     RELOC indicates whether the initial value of EXP requires
-     link-time relocations.  If you do not define this macro, GNU CC
-     will use the symbol name prefixed by `.' as the section name.
-
-\1f
-File: gcc.info,  Node: PIC,  Next: Assembler Format,  Prev: Sections,  Up: Target Macros
-
-Position Independent Code
-=========================
-
-   This section describes macros that help implement generation of
-position independent code.  Simply defining these macros is not enough
-to generate valid PIC; you must also add support to the macros
-`GO_IF_LEGITIMATE_ADDRESS' and `PRINT_OPERAND_ADDRESS', as well as
-`LEGITIMIZE_ADDRESS'.  You must modify the definition of `movsi' to do
-something appropriate when the source operand contains a symbolic
-address.  You may also need to alter the handling of switch statements
-so that they use relative addresses.
-
-`PIC_OFFSET_TABLE_REGNUM'
-     The register number of the register used to address a table of
-     static data addresses in memory.  In some cases this register is
-     defined by a processor's "application binary interface" (ABI).
-     When this macro is defined, RTL is generated for this register
-     once, as with the stack pointer and frame pointer registers.  If
-     this macro is not defined, it is up to the machine-dependent files
-     to allocate such a register (if necessary).
-
-`PIC_OFFSET_TABLE_REG_CALL_CLOBBERED'
-     Define this macro if the register defined by
-     `PIC_OFFSET_TABLE_REGNUM' is clobbered by calls.  Do not define
-     this macro if `PPIC_OFFSET_TABLE_REGNUM' is not defined.
-
-`FINALIZE_PIC'
-     By generating position-independent code, when two different
-     programs (A and B) share a common library (libC.a), the text of
-     the library can be shared whether or not the library is linked at
-     the same address for both programs.  In some of these
-     environments, position-independent code requires not only the use
-     of different addressing modes, but also special code to enable the
-     use of these addressing modes.
-
-     The `FINALIZE_PIC' macro serves as a hook to emit these special
-     codes once the function is being compiled into assembly code, but
-     not before.  (It is not done before, because in the case of
-     compiling an inline function, it would lead to multiple PIC
-     prologues being included in functions which used inline functions
-     and were compiled to assembly language.)
-
-`LEGITIMATE_PIC_OPERAND_P (X)'
-     A C expression that is nonzero if X is a legitimate immediate
-     operand on the target machine when generating position independent
-     code.  You can assume that X satisfies `CONSTANT_P', so you need
-     not check this.  You can also assume FLAG_PIC is true, so you need
-     not check it either.  You need not define this macro if all
-     constants (including `SYMBOL_REF') can be immediate operands when
-     generating position independent code.
-
-\1f
-File: gcc.info,  Node: Assembler Format,  Next: Debugging Info,  Prev: PIC,  Up: Target Macros
-
-Defining the Output Assembler Language
-======================================
-
-   This section describes macros whose principal purpose is to describe
-how to write instructions in assembler language-rather than what the
-instructions do.
-
-* Menu:
-
-* File Framework::       Structural information for the assembler file.
-* Data Output::          Output of constants (numbers, strings, addresses).
-* Uninitialized Data::   Output of uninitialized variables.
-* Label Output::         Output and generation of labels.
-* Initialization::       General principles of initialization
-                          and termination routines.
-* Macros for Initialization::
-                        Specific macros that control the handling of
-                          initialization and termination routines.
-* Instruction Output::   Output of actual instructions.
-* Dispatch Tables::      Output of jump tables.
-* Exception Region Output:: Output of exception region code.
-* Alignment Output::     Pseudo ops for alignment and skipping data.
-
-\1f
-File: gcc.info,  Node: File Framework,  Next: Data Output,  Up: Assembler Format
-
-The Overall Framework of an Assembler File
-------------------------------------------
-
-   This describes the overall framework of an assembler file.
-
-`ASM_FILE_START (STREAM)'
-     A C expression which outputs to the stdio stream STREAM some
-     appropriate text to go at the start of an assembler file.
-
-     Normally this macro is defined to output a line containing
-     `#NO_APP', which is a comment that has no effect on most
-     assemblers but tells the GNU assembler that it can save time by not
-     checking for certain assembler constructs.
-
-     On systems that use SDB, it is necessary to output certain
-     commands; see `attasm.h'.
-
-`ASM_FILE_END (STREAM)'
-     A C expression which outputs to the stdio stream STREAM some
-     appropriate text to go at the end of an assembler file.
-
-     If this macro is not defined, the default is to output nothing
-     special at the end of the file.  Most systems don't require any
-     definition.
-
-     On systems that use SDB, it is necessary to output certain
-     commands; see `attasm.h'.
-
-`ASM_IDENTIFY_GCC (FILE)'
-     A C statement to output assembler commands which will identify the
-     object file as having been compiled with GNU CC (or another GNU
-     compiler).
-
-     If you don't define this macro, the string `gcc_compiled.:' is
-     output.  This string is calculated to define a symbol which, on
-     BSD systems, will never be defined for any other reason.  GDB
-     checks for the presence of this symbol when reading the symbol
-     table of an executable.
-
-     On non-BSD systems, you must arrange communication with GDB in
-     some other fashion.  If GDB is not used on your system, you can
-     define this macro with an empty body.
-
-`ASM_COMMENT_START'
-     A C string constant describing how to begin a comment in the target
-     assembler language.  The compiler assumes that the comment will
-     end at the end of the line.
-
-`ASM_APP_ON'
-     A C string constant for text to be output before each `asm'
-     statement or group of consecutive ones.  Normally this is
-     `"#APP"', which is a comment that has no effect on most assemblers
-     but tells the GNU assembler that it must check the lines that
-     follow for all valid assembler constructs.
-
-`ASM_APP_OFF'
-     A C string constant for text to be output after each `asm'
-     statement or group of consecutive ones.  Normally this is
-     `"#NO_APP"', which tells the GNU assembler to resume making the
-     time-saving assumptions that are valid for ordinary compiler
-     output.
-
-`ASM_OUTPUT_SOURCE_FILENAME (STREAM, NAME)'
-     A C statement to output COFF information or DWARF debugging
-     information which indicates that filename NAME is the current
-     source file to the stdio stream STREAM.
-
-     This macro need not be defined if the standard form of output for
-     the file format in use is appropriate.
-
-`OUTPUT_QUOTED_STRING (STREAM, NAME)'
-     A C statement to output the string STRING to the stdio stream
-     STREAM.  If you do not call the function `output_quoted_string' in
-     your config files, GNU CC will only call it to output filenames to
-     the assembler source.  So you can use it to canonicalize the format
-     of the filename using this macro.
-
-`ASM_OUTPUT_SOURCE_LINE (STREAM, LINE)'
-     A C statement to output DBX or SDB debugging information before
-     code for line number LINE of the current source file to the stdio
-     stream STREAM.
-
-     This macro need not be defined if the standard form of debugging
-     information for the debugger in use is appropriate.
-
-`ASM_OUTPUT_IDENT (STREAM, STRING)'
-     A C statement to output something to the assembler file to handle a
-     `#ident' directive containing the text STRING.  If this macro is
-     not defined, nothing is output for a `#ident' directive.
-
-`ASM_OUTPUT_SECTION_NAME (STREAM, DECL, NAME, RELOC)'
-     A C statement to output something to the assembler file to switch
-     to section NAME for object DECL which is either a `FUNCTION_DECL',
-     a `VAR_DECL' or `NULL_TREE'.  RELOC indicates whether the initial
-     value of EXP requires link-time relocations.  Some target formats
-     do not support arbitrary sections.  Do not define this macro in
-     such cases.
-
-     At present this macro is only used to support section attributes.
-     When this macro is undefined, section attributes are disabled.
-
-`OBJC_PROLOGUE'
-     A C statement to output any assembler statements which are
-     required to precede any Objective C object definitions or message
-     sending.  The statement is executed only when compiling an
-     Objective C program.
-
-\1f
-File: gcc.info,  Node: Data Output,  Next: Uninitialized Data,  Prev: File Framework,  Up: Assembler Format
-
-Output of Data
---------------
-
-   This describes data output.
-
-`ASM_OUTPUT_LONG_DOUBLE (STREAM, VALUE)'
-`ASM_OUTPUT_DOUBLE (STREAM, VALUE)'
-`ASM_OUTPUT_FLOAT (STREAM, VALUE)'
-`ASM_OUTPUT_THREE_QUARTER_FLOAT (STREAM, VALUE)'
-`ASM_OUTPUT_SHORT_FLOAT (STREAM, VALUE)'
-`ASM_OUTPUT_BYTE_FLOAT (STREAM, VALUE)'
-     A C statement to output to the stdio stream STREAM an assembler
-     instruction to assemble a floating-point constant of `TFmode',
-     `DFmode', `SFmode', `TQFmode', `HFmode', or `QFmode',
-     respectively, whose value is VALUE.  VALUE will be a C expression
-     of type `REAL_VALUE_TYPE'.  Macros such as
-     `REAL_VALUE_TO_TARGET_DOUBLE' are useful for writing these
-     definitions.
-
-`ASM_OUTPUT_QUADRUPLE_INT (STREAM, EXP)'
-`ASM_OUTPUT_DOUBLE_INT (STREAM, EXP)'
-`ASM_OUTPUT_INT (STREAM, EXP)'
-`ASM_OUTPUT_SHORT (STREAM, EXP)'
-`ASM_OUTPUT_CHAR (STREAM, EXP)'
-     A C statement to output to the stdio stream STREAM an assembler
-     instruction to assemble an integer of 16, 8, 4, 2 or 1 bytes,
-     respectively, whose value is VALUE.  The argument EXP will be an
-     RTL expression which represents a constant value.  Use
-     `output_addr_const (STREAM, EXP)' to output this value as an
-     assembler expression.
-
-     For sizes larger than `UNITS_PER_WORD', if the action of a macro
-     would be identical to repeatedly calling the macro corresponding to
-     a size of `UNITS_PER_WORD', once for each word, you need not define
-     the macro.
-
-`ASM_OUTPUT_BYTE (STREAM, VALUE)'
-     A C statement to output to the stdio stream STREAM an assembler
-     instruction to assemble a single byte containing the number VALUE.
-
-`ASM_BYTE_OP'
-     A C string constant giving the pseudo-op to use for a sequence of
-     single-byte constants.  If this macro is not defined, the default
-     is `"byte"'.
-
-`ASM_OUTPUT_ASCII (STREAM, PTR, LEN)'
-     A C statement to output to the stdio stream STREAM an assembler
-     instruction to assemble a string constant containing the LEN bytes
-     at PTR.  PTR will be a C expression of type `char *' and LEN a C
-     expression of type `int'.
-
-     If the assembler has a `.ascii' pseudo-op as found in the Berkeley
-     Unix assembler, do not define the macro `ASM_OUTPUT_ASCII'.
-
-`CONSTANT_POOL_BEFORE_FUNCTION'
-     You may define this macro as a C expression.  You should define the
-     expression to have a non-zero value if GNU CC should output the
-     constant pool for a function before the code for the function, or
-     a zero value if GNU CC should output the constant pool after the
-     function.  If you do not define this macro, the usual case, GNU CC
-     will output the constant pool before the function.
-
-`ASM_OUTPUT_POOL_PROLOGUE (FILE FUNNAME FUNDECL SIZE)'
-     A C statement to output assembler commands to define the start of
-     the constant pool for a function.  FUNNAME is a string giving the
-     name of the function.  Should the return type of the function be
-     required, it can be obtained via FUNDECL.  SIZE is the size, in
-     bytes, of the constant pool that will be written immediately after
-     this call.
-
-     If no constant-pool prefix is required, the usual case, this macro
-     need not be defined.
-
-`ASM_OUTPUT_SPECIAL_POOL_ENTRY (FILE, X, MODE, ALIGN, LABELNO, JUMPTO)'
-     A C statement (with or without semicolon) to output a constant in
-     the constant pool, if it needs special treatment.  (This macro
-     need not do anything for RTL expressions that can be output
-     normally.)
-
-     The argument FILE is the standard I/O stream to output the
-     assembler code on.  X is the RTL expression for the constant to
-     output, and MODE is the machine mode (in case X is a `const_int').
-     ALIGN is the required alignment for the value X; you should
-     output an assembler directive to force this much alignment.
-
-     The argument LABELNO is a number to use in an internal label for
-     the address of this pool entry.  The definition of this macro is
-     responsible for outputting the label definition at the proper
-     place.  Here is how to do this:
-
-          ASM_OUTPUT_INTERNAL_LABEL (FILE, "LC", LABELNO);
-
-     When you output a pool entry specially, you should end with a
-     `goto' to the label JUMPTO.  This will prevent the same pool entry
-     from being output a second time in the usual manner.
-
-     You need not define this macro if it would do nothing.
-
-`CONSTANT_AFTER_FUNCTION_P (EXP)'
-     Define this macro as a C expression which is nonzero if the
-     constant EXP, of type `tree', should be output after the code for a
-     function.  The compiler will normally output all constants before
-     the function; you need not define this macro if this is OK.
-
-`ASM_OUTPUT_POOL_EPILOGUE (FILE FUNNAME FUNDECL SIZE)'
-     A C statement to output assembler commands to at the end of the
-     constant pool for a function.  FUNNAME is a string giving the name
-     of the function.  Should the return type of the function be
-     required, you can obtain it via FUNDECL.  SIZE is the size, in
-     bytes, of the constant pool that GNU CC wrote immediately before
-     this call.
-
-     If no constant-pool epilogue is required, the usual case, you need
-     not define this macro.
-
-`IS_ASM_LOGICAL_LINE_SEPARATOR (C)'
-     Define this macro as a C expression which is nonzero if C is used
-     as a logical line separator by the assembler.
-
-     If you do not define this macro, the default is that only the
-     character `;' is treated as a logical line separator.
-
-`ASM_OPEN_PAREN'
-`ASM_CLOSE_PAREN'
-     These macros are defined as C string constant, describing the
-     syntax in the assembler for grouping arithmetic expressions.  The
-     following definitions are correct for most assemblers:
-
-          #define ASM_OPEN_PAREN "("
-          #define ASM_CLOSE_PAREN ")"
-
-   These macros are provided by `real.h' for writing the definitions of
-`ASM_OUTPUT_DOUBLE' and the like:
-
-`REAL_VALUE_TO_TARGET_SINGLE (X, L)'
-`REAL_VALUE_TO_TARGET_DOUBLE (X, L)'
-`REAL_VALUE_TO_TARGET_LONG_DOUBLE (X, L)'
-     These translate X, of type `REAL_VALUE_TYPE', to the target's
-     floating point representation, and store its bit pattern in the
-     array of `long int' whose address is L.  The number of elements in
-     the output array is determined by the size of the desired target
-     floating point data type: 32 bits of it go in each `long int' array
-     element.  Each array element holds 32 bits of the result, even if
-     `long int' is wider than 32 bits on the host machine.
-
-     The array element values are designed so that you can print them
-     out using `fprintf' in the order they should appear in the target
-     machine's memory.
-
-`REAL_VALUE_TO_DECIMAL (X, FORMAT, STRING)'
-     This macro converts X, of type `REAL_VALUE_TYPE', to a decimal
-     number and stores it as a string into STRING.  You must pass, as
-     STRING, the address of a long enough block of space to hold the
-     result.
-
-     The argument FORMAT is a `printf'-specification that serves as a
-     suggestion for how to format the output string.
-
-\1f
-File: gcc.info,  Node: Uninitialized Data,  Next: Label Output,  Prev: Data Output,  Up: Assembler Format
-
-Output of Uninitialized Variables
----------------------------------
-
-   Each of the macros in this section is used to do the whole job of
-outputting a single uninitialized variable.
-
-`ASM_OUTPUT_COMMON (STREAM, NAME, SIZE, ROUNDED)'
-     A C statement (sans semicolon) to output to the stdio stream
-     STREAM the assembler definition of a common-label named NAME whose
-     size is SIZE bytes.  The variable ROUNDED is the size rounded up
-     to whatever alignment the caller wants.
-
-     Use the expression `assemble_name (STREAM, NAME)' to output the
-     name itself; before and after that, output the additional
-     assembler syntax for defining the name, and a newline.
-
-     This macro controls how the assembler definitions of uninitialized
-     common global variables are output.
-
-`ASM_OUTPUT_ALIGNED_COMMON (STREAM, NAME, SIZE, ALIGNMENT)'
-     Like `ASM_OUTPUT_COMMON' except takes the required alignment as a
-     separate, explicit argument.  If you define this macro, it is used
-     in place of `ASM_OUTPUT_COMMON', and gives you more flexibility in
-     handling the required alignment of the variable.  The alignment is
-     specified as the number of bits.
-
-`ASM_OUTPUT_ALIGNED_DECL_COMMON (STREAM, DECL, NAME, SIZE, ALIGNMENT)'
-     Like `ASM_OUTPUT_ALIGNED_COMMON' except that DECL of the variable
-     to be output, if there is one, or `NULL_TREE' if there is not
-     corresponding variable.  If you define this macro, GNU CC wil use
-     it in place of both `ASM_OUTPUT_COMMON' and
-     `ASM_OUTPUT_ALIGNED_COMMON'.  Define this macro when you need to
-     see the variable's decl in order to chose what to output.
-
-`ASM_OUTPUT_SHARED_COMMON (STREAM, NAME, SIZE, ROUNDED)'
-     If defined, it is similar to `ASM_OUTPUT_COMMON', except that it
-     is used when NAME is shared.  If not defined, `ASM_OUTPUT_COMMON'
-     will be used.
-
-`ASM_OUTPUT_BSS (STREAM, DECL, NAME, SIZE, ROUNDED)'
-     A C statement (sans semicolon) to output to the stdio stream
-     STREAM the assembler definition of uninitialized global DECL named
-     NAME whose size is SIZE bytes.  The variable ROUNDED is the size
-     rounded up to whatever alignment the caller wants.
-
-     Try to use function `asm_output_bss' defined in `varasm.c' when
-     defining this macro.  If unable, use the expression `assemble_name
-     (STREAM, NAME)' to output the name itself; before and after that,
-     output the additional assembler syntax for defining the name, and
-     a newline.
-
-     This macro controls how the assembler definitions of uninitialized
-     global variables are output.  This macro exists to properly
-     support languages like `c++' which do not have `common' data.
-     However, this macro currently is not defined for all targets.  If
-     this macro and `ASM_OUTPUT_ALIGNED_BSS' are not defined then
-     `ASM_OUTPUT_COMMON' or `ASM_OUTPUT_ALIGNED_COMMON' or
-     `ASM_OUTPUT_ALIGNED_DECL_COMMON' is used.
-
-`ASM_OUTPUT_ALIGNED_BSS (STREAM, DECL, NAME, SIZE, ALIGNMENT)'
-     Like `ASM_OUTPUT_BSS' except takes the required alignment as a
-     separate, explicit argument.  If you define this macro, it is used
-     in place of `ASM_OUTPUT_BSS', and gives you more flexibility in
-     handling the required alignment of the variable.  The alignment is
-     specified as the number of bits.
-
-     Try to use function `asm_output_aligned_bss' defined in file
-     `varasm.c' when defining this macro.
-
-`ASM_OUTPUT_SHARED_BSS (STREAM, DECL, NAME, SIZE, ROUNDED)'
-     If defined, it is similar to `ASM_OUTPUT_BSS', except that it is
-     used when NAME is shared.  If not defined, `ASM_OUTPUT_BSS' will
-     be used.
-
-`ASM_OUTPUT_LOCAL (STREAM, NAME, SIZE, ROUNDED)'
-     A C statement (sans semicolon) to output to the stdio stream
-     STREAM the assembler definition of a local-common-label named NAME
-     whose size is SIZE bytes.  The variable ROUNDED is the size
-     rounded up to whatever alignment the caller wants.
-
-     Use the expression `assemble_name (STREAM, NAME)' to output the
-     name itself; before and after that, output the additional
-     assembler syntax for defining the name, and a newline.
-
-     This macro controls how the assembler definitions of uninitialized
-     static variables are output.
-
-`ASM_OUTPUT_ALIGNED_LOCAL (STREAM, NAME, SIZE, ALIGNMENT)'
-     Like `ASM_OUTPUT_LOCAL' except takes the required alignment as a
-     separate, explicit argument.  If you define this macro, it is used
-     in place of `ASM_OUTPUT_LOCAL', and gives you more flexibility in
-     handling the required alignment of the variable.  The alignment is
-     specified as the number of bits.
-
-`ASM_OUTPUT_ALIGNED_DECL_LOCAL (STREAM, DECL, NAME, SIZE, ALIGNMENT)'
-     Like `ASM_OUTPUT_ALIGNED_DECL' except that DECL of the variable to
-     be output, if there is one, or `NULL_TREE' if there is not
-     corresponding variable.  If you define this macro, GNU CC wil use
-     it in place of both `ASM_OUTPUT_DECL' and
-     `ASM_OUTPUT_ALIGNED_DECL'.  Define this macro when you need to see
-     the variable's decl in order to chose what to output.
-
-`ASM_OUTPUT_SHARED_LOCAL (STREAM, NAME, SIZE, ROUNDED)'
-     If defined, it is similar to `ASM_OUTPUT_LOCAL', except that it is
-     used when NAME is shared.  If not defined, `ASM_OUTPUT_LOCAL' will
-     be used.
-
-\1f
-File: gcc.info,  Node: Label Output,  Next: Initialization,  Prev: Uninitialized Data,  Up: Assembler Format
-
-Output and Generation of Labels
--------------------------------
-
-   This is about outputting labels.
-
-`ASM_OUTPUT_LABEL (STREAM, NAME)'
-     A C statement (sans semicolon) to output to the stdio stream
-     STREAM the assembler definition of a label named NAME.  Use the
-     expression `assemble_name (STREAM, NAME)' to output the name
-     itself; before and after that, output the additional assembler
-     syntax for defining the name, and a newline.
-
-`ASM_DECLARE_FUNCTION_NAME (STREAM, NAME, DECL)'
-     A C statement (sans semicolon) to output to the stdio stream
-     STREAM any text necessary for declaring the name NAME of a
-     function which is being defined.  This macro is responsible for
-     outputting the label definition (perhaps using
-     `ASM_OUTPUT_LABEL').  The argument DECL is the `FUNCTION_DECL'
-     tree node representing the function.
-
-     If this macro is not defined, then the function name is defined in
-     the usual manner as a label (by means of `ASM_OUTPUT_LABEL').
-
-`ASM_DECLARE_FUNCTION_SIZE (STREAM, NAME, DECL)'
-     A C statement (sans semicolon) to output to the stdio stream
-     STREAM any text necessary for declaring the size of a function
-     which is being defined.  The argument NAME is the name of the
-     function.  The argument DECL is the `FUNCTION_DECL' tree node
-     representing the function.
-
-     If this macro is not defined, then the function size is not
-     defined.
-
-`ASM_DECLARE_OBJECT_NAME (STREAM, NAME, DECL)'
-     A C statement (sans semicolon) to output to the stdio stream
-     STREAM any text necessary for declaring the name NAME of an
-     initialized variable which is being defined.  This macro must
-     output the label definition (perhaps using `ASM_OUTPUT_LABEL').
-     The argument DECL is the `VAR_DECL' tree node representing the
-     variable.
-
-     If this macro is not defined, then the variable name is defined in
-     the usual manner as a label (by means of `ASM_OUTPUT_LABEL').
-
-`ASM_FINISH_DECLARE_OBJECT (STREAM, DECL, TOPLEVEL, ATEND)'
-     A C statement (sans semicolon) to finish up declaring a variable
-     name once the compiler has processed its initializer fully and
-     thus has had a chance to determine the size of an array when
-     controlled by an initializer.  This is used on systems where it's
-     necessary to declare something about the size of the object.
-
-     If you don't define this macro, that is equivalent to defining it
-     to do nothing.
-
-`ASM_GLOBALIZE_LABEL (STREAM, NAME)'
-     A C statement (sans semicolon) to output to the stdio stream
-     STREAM some commands that will make the label NAME global; that
-     is, available for reference from other files.  Use the expression
-     `assemble_name (STREAM, NAME)' to output the name itself; before
-     and after that, output the additional assembler syntax for making
-     that name global, and a newline.
-
-`ASM_WEAKEN_LABEL'
-     A C statement (sans semicolon) to output to the stdio stream
-     STREAM some commands that will make the label NAME weak; that is,
-     available for reference from other files but only used if no other
-     definition is available.  Use the expression `assemble_name
-     (STREAM, NAME)' to output the name itself; before and after that,
-     output the additional assembler syntax for making that name weak,
-     and a newline.
-
-     If you don't define this macro, GNU CC will not support weak
-     symbols and you should not define the `SUPPORTS_WEAK' macro.
-
-`SUPPORTS_WEAK'
-     A C expression which evaluates to true if the target supports weak
-     symbols.
-
-     If you don't define this macro, `defaults.h' provides a default
-     definition.  If `ASM_WEAKEN_LABEL' is defined, the default
-     definition is `1'; otherwise, it is `0'.  Define this macro if you
-     want to control weak symbol support with a compiler flag such as
-     `-melf'.
-
-`MAKE_DECL_ONE_ONLY'
-     A C statement (sans semicolon) to mark DECL to be emitted as a
-     public symbol such that extra copies in multiple translation units
-     will be discarded by the linker.  Define this macro if your object
-     file format provides support for this concept, such as the `COMDAT'
-     section flags in the Microsoft Windows PE/COFF format, and this
-     support requires changes to DECL, such as putting it in a separate
-     section.
-
-`SUPPORTS_ONE_ONLY'
-     A C expression which evaluates to true if the target supports
-     one-only semantics.
-
-     If you don't define this macro, `varasm.c' provides a default
-     definition.  If `MAKE_DECL_ONE_ONLY' is defined, the default
-     definition is `1'; otherwise, it is `0'.  Define this macro if you
-     want to control one-only symbol support with a compiler flag, or if
-     setting the `DECL_ONE_ONLY' flag is enough to mark a declaration to
-     be emitted as one-only.
-
-`ASM_OUTPUT_EXTERNAL (STREAM, DECL, NAME)'
-     A C statement (sans semicolon) to output to the stdio stream
-     STREAM any text necessary for declaring the name of an external
-     symbol named NAME which is referenced in this compilation but not
-     defined.  The value of DECL is the tree node for the declaration.
-
-     This macro need not be defined if it does not need to output
-     anything.  The GNU assembler and most Unix assemblers don't
-     require anything.
-
-`ASM_OUTPUT_EXTERNAL_LIBCALL (STREAM, SYMREF)'
-     A C statement (sans semicolon) to output on STREAM an assembler
-     pseudo-op to declare a library function name external.  The name
-     of the library function is given by SYMREF, which has type `rtx'
-     and is a `symbol_ref'.
-
-     This macro need not be defined if it does not need to output
-     anything.  The GNU assembler and most Unix assemblers don't
-     require anything.
-
-`ASM_OUTPUT_LABELREF (STREAM, NAME)'
-     A C statement (sans semicolon) to output to the stdio stream
-     STREAM a reference in assembler syntax to a label named NAME.
-     This should add `_' to the front of the name, if that is customary
-     on your operating system, as it is in most Berkeley Unix systems.
-     This macro is used in `assemble_name'.
-
-`ASM_OUTPUT_INTERNAL_LABEL (STREAM, PREFIX, NUM)'
-     A C statement to output to the stdio stream STREAM a label whose
-     name is made from the string PREFIX and the number NUM.
-
-     It is absolutely essential that these labels be distinct from the
-     labels used for user-level functions and variables.  Otherwise,
-     certain programs will have name conflicts with internal labels.
-
-     It is desirable to exclude internal labels from the symbol table
-     of the object file.  Most assemblers have a naming convention for
-     labels that should be excluded; on many systems, the letter `L' at
-     the beginning of a label has this effect.  You should find out what
-     convention your system uses, and follow it.
-
-     The usual definition of this macro is as follows:
-
-          fprintf (STREAM, "L%s%d:\n", PREFIX, NUM)
-
-`ASM_GENERATE_INTERNAL_LABEL (STRING, PREFIX, NUM)'
-     A C statement to store into the string STRING a label whose name
-     is made from the string PREFIX and the number NUM.
-
-     This string, when output subsequently by `assemble_name', should
-     produce the output that `ASM_OUTPUT_INTERNAL_LABEL' would produce
-     with the same PREFIX and NUM.
-
-     If the string begins with `*', then `assemble_name' will output
-     the rest of the string unchanged.  It is often convenient for
-     `ASM_GENERATE_INTERNAL_LABEL' to use `*' in this way.  If the
-     string doesn't start with `*', then `ASM_OUTPUT_LABELREF' gets to
-     output the string, and may change it.  (Of course,
-     `ASM_OUTPUT_LABELREF' is also part of your machine description, so
-     you should know what it does on your machine.)
-
-`ASM_FORMAT_PRIVATE_NAME (OUTVAR, NAME, NUMBER)'
-     A C expression to assign to OUTVAR (which is a variable of type
-     `char *') a newly allocated string made from the string NAME and
-     the number NUMBER, with some suitable punctuation added.  Use
-     `alloca' to get space for the string.
-
-     The string will be used as an argument to `ASM_OUTPUT_LABELREF' to
-     produce an assembler label for an internal static variable whose
-     name is NAME.  Therefore, the string must be such as to result in
-     valid assembler code.  The argument NUMBER is different each time
-     this macro is executed; it prevents conflicts between
-     similarly-named internal static variables in different scopes.
-
-     Ideally this string should not be a valid C identifier, to prevent
-     any conflict with the user's own symbols.  Most assemblers allow
-     periods or percent signs in assembler symbols; putting at least
-     one of these between the name and the number will suffice.
-
-`ASM_OUTPUT_DEF (STREAM, NAME, VALUE)'
-     A C statement to output to the stdio stream STREAM assembler code
-     which defines (equates) the symbol NAME to have the value VALUE.
-
-     If SET_ASM_OP is defined, a default definition is provided which is
-     correct for most systems.
-
-`ASM_OUTPUT_WEAK_ALIAS (STREAM, NAME, VALUE)'
-     A C statement to output to the stdio stream STREAM assembler code
-     which defines (equates) the weak symbol NAME to have the value
-     VALUE.
-
-     Define this macro if the target only supports weak aliases; define
-     ASM_OUTPUT_DEF instead if possible.
-
-`OBJC_GEN_METHOD_LABEL (BUF, IS_INST, CLASS_NAME, CAT_NAME, SEL_NAME)'
-     Define this macro to override the default assembler names used for
-     Objective C methods.
-
-     The default name is a unique method number followed by the name of
-     the class (e.g. `_1_Foo').  For methods in categories, the name of
-     the category is also included in the assembler name (e.g.
-     `_1_Foo_Bar').
-
-     These names are safe on most systems, but make debugging difficult
-     since the method's selector is not present in the name.
-     Therefore, particular systems define other ways of computing names.
-
-     BUF is an expression of type `char *' which gives you a buffer in
-     which to store the name; its length is as long as CLASS_NAME,
-     CAT_NAME and SEL_NAME put together, plus 50 characters extra.
-
-     The argument IS_INST specifies whether the method is an instance
-     method or a class method; CLASS_NAME is the name of the class;
-     CAT_NAME is the name of the category (or NULL if the method is not
-     in a category); and SEL_NAME is the name of the selector.
-
-     On systems where the assembler can handle quoted names, you can
-     use this macro to provide more human-readable names.
-
diff --git a/gcc/gcc.info-25 b/gcc/gcc.info-25
deleted file mode 100644 (file)
index fc5e5a7..0000000
+++ /dev/null
@@ -1,1143 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Initialization,  Next: Macros for Initialization,  Prev: Label Output,  Up: Assembler Format
-
-How Initialization Functions Are Handled
-----------------------------------------
-
-   The compiled code for certain languages includes "constructors"
-(also called "initialization routines")--functions to initialize data
-in the program when the program is started.  These functions need to be
-called before the program is "started"--that is to say, before `main'
-is called.
-
-   Compiling some languages generates "destructors" (also called
-"termination routines") that should be called when the program
-terminates.
-
-   To make the initialization and termination functions work, the
-compiler must output something in the assembler code to cause those
-functions to be called at the appropriate time.  When you port the
-compiler to a new system, you need to specify how to do this.
-
-   There are two major ways that GCC currently supports the execution of
-initialization and termination functions.  Each way has two variants.
-Much of the structure is common to all four variations.
-
-   The linker must build two lists of these functions--a list of
-initialization functions, called `__CTOR_LIST__', and a list of
-termination functions, called `__DTOR_LIST__'.
-
-   Each list always begins with an ignored function pointer (which may
-hold 0, -1, or a count of the function pointers after it, depending on
-the environment).  This is followed by a series of zero or more function
-pointers to constructors (or destructors), followed by a function
-pointer containing zero.
-
-   Depending on the operating system and its executable file format,
-either `crtstuff.c' or `libgcc2.c' traverses these lists at startup
-time and exit time.  Constructors are called in reverse order of the
-list; destructors in forward order.
-
-   The best way to handle static constructors works only for object file
-formats which provide arbitrarily-named sections.  A section is set
-aside for a list of constructors, and another for a list of destructors.
-Traditionally these are called `.ctors' and `.dtors'.  Each object file
-that defines an initialization function also puts a word in the
-constructor section to point to that function.  The linker accumulates
-all these words into one contiguous `.ctors' section.  Termination
-functions are handled similarly.
-
-   To use this method, you need appropriate definitions of the macros
-`ASM_OUTPUT_CONSTRUCTOR' and `ASM_OUTPUT_DESTRUCTOR'.  Usually you can
-get them by including `svr4.h'.
-
-   When arbitrary sections are available, there are two variants,
-depending upon how the code in `crtstuff.c' is called.  On systems that
-support an "init" section which is executed at program startup, parts
-of `crtstuff.c' are compiled into that section.  The program is linked
-by the `gcc' driver like this:
-
-     ld -o OUTPUT_FILE crtbegin.o ... crtend.o -lgcc
-
-   The head of a function (`__do_global_ctors') appears in the init
-section of `crtbegin.o'; the remainder of the function appears in the
-init section of `crtend.o'.  The linker will pull these two parts of
-the section together, making a whole function.  If any of the user's
-object files linked into the middle of it contribute code, then that
-code will be executed as part of the body of `__do_global_ctors'.
-
-   To use this variant, you must define the `INIT_SECTION_ASM_OP' macro
-properly.
-
-   If no init section is available, do not define
-`INIT_SECTION_ASM_OP'.  Then `__do_global_ctors' is built into the text
-section like all other functions, and resides in `libgcc.a'.  When GCC
-compiles any function called `main', it inserts a procedure call to
-`__main' as the first executable code after the function prologue.  The
-`__main' function, also defined in `libgcc2.c', simply calls
-`__do_global_ctors'.
-
-   In file formats that don't support arbitrary sections, there are
-again two variants.  In the simplest variant, the GNU linker (GNU `ld')
-and an `a.out' format must be used.  In this case,
-`ASM_OUTPUT_CONSTRUCTOR' is defined to produce a `.stabs' entry of type
-`N_SETT', referencing the name `__CTOR_LIST__', and with the address of
-the void function containing the initialization code as its value.  The
-GNU linker recognizes this as a request to add the value to a "set";
-the values are accumulated, and are eventually placed in the executable
-as a vector in the format described above, with a leading (ignored)
-count and a trailing zero element.  `ASM_OUTPUT_DESTRUCTOR' is handled
-similarly.  Since no init section is available, the absence of
-`INIT_SECTION_ASM_OP' causes the compilation of `main' to call `__main'
-as above, starting the initialization process.
-
-   The last variant uses neither arbitrary sections nor the GNU linker.
-This is preferable when you want to do dynamic linking and when using
-file formats which the GNU linker does not support, such as `ECOFF'.  In
-this case, `ASM_OUTPUT_CONSTRUCTOR' does not produce an `N_SETT'
-symbol; initialization and termination functions are recognized simply
-by their names.  This requires an extra program in the linkage step,
-called `collect2'.  This program pretends to be the linker, for use
-with GNU CC; it does its job by running the ordinary linker, but also
-arranges to include the vectors of initialization and termination
-functions.  These functions are called via `__main' as described above.
-
-   Choosing among these configuration options has been simplified by a
-set of operating-system-dependent files in the `config' subdirectory.
-These files define all of the relevant parameters.  Usually it is
-sufficient to include one into your specific machine-dependent
-configuration file.  These files are:
-
-`aoutos.h'
-     For operating systems using the `a.out' format.
-
-`next.h'
-     For operating systems using the `MachO' format.
-
-`svr3.h'
-     For System V Release 3 and similar systems using `COFF' format.
-
-`svr4.h'
-     For System V Release 4 and similar systems using `ELF' format.
-
-`vms.h'
-     For the VMS operating system.
-
-   The following section describes the specific macros that control and
-customize the handling of initialization and termination functions.
-
-\1f
-File: gcc.info,  Node: Macros for Initialization,  Next: Instruction Output,  Prev: Initialization,  Up: Assembler Format
-
-Macros Controlling Initialization Routines
-------------------------------------------
-
-   Here are the macros that control how the compiler handles
-initialization and termination functions:
-
-`INIT_SECTION_ASM_OP'
-     If defined, a C string constant for the assembler operation to
-     identify the following data as initialization code.  If not
-     defined, GNU CC will assume such a section does not exist.  When
-     you are using special sections for initialization and termination
-     functions, this macro also controls how `crtstuff.c' and
-     `libgcc2.c' arrange to run the initialization functions.
-
-`HAS_INIT_SECTION'
-     If defined, `main' will not call `__main' as described above.
-     This macro should be defined for systems that control the contents
-     of the init section on a symbol-by-symbol basis, such as OSF/1,
-     and should not be defined explicitly for systems that support
-     `INIT_SECTION_ASM_OP'.
-
-`LD_INIT_SWITCH'
-     If defined, a C string constant for a switch that tells the linker
-     that the following symbol is an initialization routine.
-
-`LD_FINI_SWITCH'
-     If defined, a C string constant for a switch that tells the linker
-     that the following symbol is a finalization routine.
-
-`INVOKE__main'
-     If defined, `main' will call `__main' despite the presence of
-     `INIT_SECTION_ASM_OP'.  This macro should be defined for systems
-     where the init section is not actually run automatically, but is
-     still useful for collecting the lists of constructors and
-     destructors.
-
-`ASM_OUTPUT_CONSTRUCTOR (STREAM, NAME)'
-     Define this macro as a C statement to output on the stream STREAM
-     the assembler code to arrange to call the function named NAME at
-     initialization time.
-
-     Assume that NAME is the name of a C function generated
-     automatically by the compiler.  This function takes no arguments.
-     Use the function `assemble_name' to output the name NAME; this
-     performs any system-specific syntactic transformations such as
-     adding an underscore.
-
-     If you don't define this macro, nothing special is output to
-     arrange to call the function.  This is correct when the function
-     will be called in some other manner--for example, by means of the
-     `collect2' program, which looks through the symbol table to find
-     these functions by their names.
-
-`ASM_OUTPUT_DESTRUCTOR (STREAM, NAME)'
-     This is like `ASM_OUTPUT_CONSTRUCTOR' but used for termination
-     functions rather than initialization functions.
-
-   If your system uses `collect2' as the means of processing
-constructors, then that program normally uses `nm' to scan an object
-file for constructor functions to be called.  On certain kinds of
-systems, you can define these macros to make `collect2' work faster
-(and, in some cases, make it work at all):
-
-`OBJECT_FORMAT_COFF'
-     Define this macro if the system uses COFF (Common Object File
-     Format) object files, so that `collect2' can assume this format
-     and scan object files directly for dynamic constructor/destructor
-     functions.
-
-`OBJECT_FORMAT_ROSE'
-     Define this macro if the system uses ROSE format object files, so
-     that `collect2' can assume this format and scan object files
-     directly for dynamic constructor/destructor functions.
-
-     These macros are effective only in a native compiler; `collect2' as
-     part of a cross compiler always uses `nm' for the target machine.
-
-`REAL_NM_FILE_NAME'
-     Define this macro as a C string constant containing the file name
-     to use to execute `nm'.  The default is to search the path
-     normally for `nm'.
-
-     If your system supports shared libraries and has a program to list
-     the dynamic dependencies of a given library or executable, you can
-     define these macros to enable support for running initialization
-     and termination functions in shared libraries:
-
-`LDD_SUFFIX'
-     Define this macro to a C string constant containing the name of the
-     program which lists dynamic dependencies, like `"ldd"' under SunOS
-     4.
-
-`PARSE_LDD_OUTPUT (PTR)'
-     Define this macro to be C code that extracts filenames from the
-     output of the program denoted by `LDD_SUFFIX'.  PTR is a variable
-     of type `char *' that points to the beginning of a line of output
-     from `LDD_SUFFIX'.  If the line lists a dynamic dependency, the
-     code must advance PTR to the beginning of the filename on that
-     line.  Otherwise, it must set PTR to `NULL'.
-
-\1f
-File: gcc.info,  Node: Instruction Output,  Next: Dispatch Tables,  Prev: Macros for Initialization,  Up: Assembler Format
-
-Output of Assembler Instructions
---------------------------------
-
-   This describes assembler instruction output.
-
-`REGISTER_NAMES'
-     A C initializer containing the assembler's names for the machine
-     registers, each one as a C string constant.  This is what
-     translates register numbers in the compiler into assembler
-     language.
-
-`ADDITIONAL_REGISTER_NAMES'
-     If defined, a C initializer for an array of structures containing
-     a name and a register number.  This macro defines additional names
-     for hard registers, thus allowing the `asm' option in declarations
-     to refer to registers using alternate names.
-
-`ASM_OUTPUT_OPCODE (STREAM, PTR)'
-     Define this macro if you are using an unusual assembler that
-     requires different names for the machine instructions.
-
-     The definition is a C statement or statements which output an
-     assembler instruction opcode to the stdio stream STREAM.  The
-     macro-operand PTR is a variable of type `char *' which points to
-     the opcode name in its "internal" form--the form that is written
-     in the machine description.  The definition should output the
-     opcode name to STREAM, performing any translation you desire, and
-     increment the variable PTR to point at the end of the opcode so
-     that it will not be output twice.
-
-     In fact, your macro definition may process less than the entire
-     opcode name, or more than the opcode name; but if you want to
-     process text that includes `%'-sequences to substitute operands,
-     you must take care of the substitution yourself.  Just be sure to
-     increment PTR over whatever text should not be output normally.
-
-     If you need to look at the operand values, they can be found as the
-     elements of `recog_operand'.
-
-     If the macro definition does nothing, the instruction is output in
-     the usual way.
-
-`FINAL_PRESCAN_INSN (INSN, OPVEC, NOPERANDS)'
-     If defined, a C statement to be executed just prior to the output
-     of assembler code for INSN, to modify the extracted operands so
-     they will be output differently.
-
-     Here the argument OPVEC is the vector containing the operands
-     extracted from INSN, and NOPERANDS is the number of elements of
-     the vector which contain meaningful data for this insn.  The
-     contents of this vector are what will be used to convert the insn
-     template into assembler code, so you can change the assembler
-     output by changing the contents of the vector.
-
-     This macro is useful when various assembler syntaxes share a single
-     file of instruction patterns; by defining this macro differently,
-     you can cause a large class of instructions to be output
-     differently (such as with rearranged operands).  Naturally,
-     variations in assembler syntax affecting individual insn patterns
-     ought to be handled by writing conditional output routines in
-     those patterns.
-
-     If this macro is not defined, it is equivalent to a null statement.
-
-`FINAL_PRESCAN_LABEL'
-     If defined, `FINAL_PRESCAN_INSN' will be called on each
-     `CODE_LABEL'.  In that case, OPVEC will be a null pointer and
-     NOPERANDS will be zero.
-
-`PRINT_OPERAND (STREAM, X, CODE)'
-     A C compound statement to output to stdio stream STREAM the
-     assembler syntax for an instruction operand X.  X is an RTL
-     expression.
-
-     CODE is a value that can be used to specify one of several ways of
-     printing the operand.  It is used when identical operands must be
-     printed differently depending on the context.  CODE comes from the
-     `%' specification that was used to request printing of the
-     operand.  If the specification was just `%DIGIT' then CODE is 0;
-     if the specification was `%LTR DIGIT' then CODE is the ASCII code
-     for LTR.
-
-     If X is a register, this macro should print the register's name.
-     The names can be found in an array `reg_names' whose type is `char
-     *[]'.  `reg_names' is initialized from `REGISTER_NAMES'.
-
-     When the machine description has a specification `%PUNCT' (a `%'
-     followed by a punctuation character), this macro is called with a
-     null pointer for X and the punctuation character for CODE.
-
-`PRINT_OPERAND_PUNCT_VALID_P (CODE)'
-     A C expression which evaluates to true if CODE is a valid
-     punctuation character for use in the `PRINT_OPERAND' macro.  If
-     `PRINT_OPERAND_PUNCT_VALID_P' is not defined, it means that no
-     punctuation characters (except for the standard one, `%') are used
-     in this way.
-
-`PRINT_OPERAND_ADDRESS (STREAM, X)'
-     A C compound statement to output to stdio stream STREAM the
-     assembler syntax for an instruction operand that is a memory
-     reference whose address is X.  X is an RTL expression.
-
-     On some machines, the syntax for a symbolic address depends on the
-     section that the address refers to.  On these machines, define the
-     macro `ENCODE_SECTION_INFO' to store the information into the
-     `symbol_ref', and then check for it here.  *Note Assembler
-     Format::.
-
-`DBR_OUTPUT_SEQEND(FILE)'
-     A C statement, to be executed after all slot-filler instructions
-     have been output.  If necessary, call `dbr_sequence_length' to
-     determine the number of slots filled in a sequence (zero if not
-     currently outputting a sequence), to decide how many no-ops to
-     output, or whatever.
-
-     Don't define this macro if it has nothing to do, but it is helpful
-     in reading assembly output if the extent of the delay sequence is
-     made explicit (e.g. with white space).
-
-     Note that output routines for instructions with delay slots must be
-     prepared to deal with not being output as part of a sequence (i.e.
-     when the scheduling pass is not run, or when no slot fillers could
-     be found.)  The variable `final_sequence' is null when not
-     processing a sequence, otherwise it contains the `sequence' rtx
-     being output.
-
-`REGISTER_PREFIX'
-`LOCAL_LABEL_PREFIX'
-`USER_LABEL_PREFIX'
-`IMMEDIATE_PREFIX'
-     If defined, C string expressions to be used for the `%R', `%L',
-     `%U', and `%I' options of `asm_fprintf' (see `final.c').  These
-     are useful when a single `md' file must support multiple assembler
-     formats.  In that case, the various `tm.h' files can define these
-     macros differently.
-
-`ASSEMBLER_DIALECT'
-     If your target supports multiple dialects of assembler language
-     (such as different opcodes), define this macro as a C expression
-     that gives the numeric index of the assembler language dialect to
-     use, with zero as the first variant.
-
-     If this macro is defined, you may use constructs of the form
-     `{option0|option1|option2...}' in the output templates of patterns
-     (*note Output Template::.) or in the first argument of
-     `asm_fprintf'.  This construct outputs `option0', `option1' or
-     `option2', etc., if the value of `ASSEMBLER_DIALECT' is zero, one
-     or two, etc.  Any special characters within these strings retain
-     their usual meaning.
-
-     If you do not define this macro, the characters `{', `|' and `}'
-     do not have any special meaning when used in templates or operands
-     to `asm_fprintf'.
-
-     Define the macros `REGISTER_PREFIX', `LOCAL_LABEL_PREFIX',
-     `USER_LABEL_PREFIX' and `IMMEDIATE_PREFIX' if you can express the
-     variations in assemble language syntax with that mechanism.  Define
-     `ASSEMBLER_DIALECT' and use the `{option0|option1}' syntax if the
-     syntax variant are larger and involve such things as different
-     opcodes or operand order.
-
-`ASM_OUTPUT_REG_PUSH (STREAM, REGNO)'
-     A C expression to output to STREAM some assembler code which will
-     push hard register number REGNO onto the stack.  The code need not
-     be optimal, since this macro is used only when profiling.
-
-`ASM_OUTPUT_REG_POP (STREAM, REGNO)'
-     A C expression to output to STREAM some assembler code which will
-     pop hard register number REGNO off of the stack.  The code need
-     not be optimal, since this macro is used only when profiling.
-
-\1f
-File: gcc.info,  Node: Dispatch Tables,  Next: Exception Region Output,  Prev: Instruction Output,  Up: Assembler Format
-
-Output of Dispatch Tables
--------------------------
-
-   This concerns dispatch tables.
-
-`ASM_OUTPUT_ADDR_DIFF_ELT (STREAM, VALUE, REL)'
-     A C statement to output to the stdio stream STREAM an assembler
-     pseudo-instruction to generate a difference between two labels.
-     VALUE and REL are the numbers of two internal labels.  The
-     definitions of these labels are output using
-     `ASM_OUTPUT_INTERNAL_LABEL', and they must be printed in the same
-     way here.  For example,
-
-          fprintf (STREAM, "\t.word L%d-L%d\n",
-                   VALUE, REL)
-
-     You must provide this macro on machines where the addresses in a
-     dispatch table are relative to the table's own address.  If
-     defined, GNU CC will also use this macro on all machines when
-     producing PIC.
-
-`ASM_OUTPUT_ADDR_VEC_ELT (STREAM, VALUE)'
-     This macro should be provided on machines where the addresses in a
-     dispatch table are absolute.
-
-     The definition should be a C statement to output to the stdio
-     stream STREAM an assembler pseudo-instruction to generate a
-     reference to a label.  VALUE is the number of an internal label
-     whose definition is output using `ASM_OUTPUT_INTERNAL_LABEL'.  For
-     example,
-
-          fprintf (STREAM, "\t.word L%d\n", VALUE)
-
-`ASM_OUTPUT_CASE_LABEL (STREAM, PREFIX, NUM, TABLE)'
-     Define this if the label before a jump-table needs to be output
-     specially.  The first three arguments are the same as for
-     `ASM_OUTPUT_INTERNAL_LABEL'; the fourth argument is the jump-table
-     which follows (a `jump_insn' containing an `addr_vec' or
-     `addr_diff_vec').
-
-     This feature is used on system V to output a `swbeg' statement for
-     the table.
-
-     If this macro is not defined, these labels are output with
-     `ASM_OUTPUT_INTERNAL_LABEL'.
-
-`ASM_OUTPUT_CASE_END (STREAM, NUM, TABLE)'
-     Define this if something special must be output at the end of a
-     jump-table.  The definition should be a C statement to be executed
-     after the assembler code for the table is written.  It should write
-     the appropriate code to stdio stream STREAM.  The argument TABLE
-     is the jump-table insn, and NUM is the label-number of the
-     preceding label.
-
-     If this macro is not defined, nothing special is output at the end
-     of the jump-table.
-
-\1f
-File: gcc.info,  Node: Exception Region Output,  Next: Alignment Output,  Prev: Dispatch Tables,  Up: Assembler Format
-
-Assembler Commands for Exception Regions
-----------------------------------------
-
-   This describes commands marking the start and the end of an exception
-region.
-
-`ASM_OUTPUT_EH_REGION_BEG ()'
-     A C expression to output text to mark the start of an exception
-     region.
-
-     This macro need not be defined on most platforms.
-
-`ASM_OUTPUT_EH_REGION_END ()'
-     A C expression to output text to mark the end of an exception
-     region.
-
-     This macro need not be defined on most platforms.
-
-`EXCEPTION_SECTION ()'
-     A C expression to switch to the section in which the main
-     exception table is to be placed (*note Sections::.).  The default
-     is a section named `.gcc_except_table' on machines that support
-     named sections via `ASM_OUTPUT_SECTION_NAME', otherwise if `-fpic'
-     or `-fPIC' is in effect, the `data_section', otherwise the
-     `readonly_data_section'.
-
-`EH_FRAME_SECTION_ASM_OP'
-     If defined, a C string constant for the assembler operation to
-     switch to the section for exception handling frame unwind
-     information.  If not defined, GNU CC will provide a default
-     definition if the target supports named sections.  `crtstuff.c'
-     uses this macro to switch to the appropriate section.
-
-     You should define this symbol if your target supports DWARF 2 frame
-     unwind information and the default definition does not work.
-
-`OMIT_EH_TABLE ()'
-     A C expression that is nonzero if the normal exception table output
-     should be omitted.
-
-     This macro need not be defined on most platforms.
-
-`EH_TABLE_LOOKUP ()'
-     Alternate runtime support for looking up an exception at runtime
-     and finding the associated handler, if the default method won't
-     work.
-
-     This macro need not be defined on most platforms.
-
-`DOESNT_NEED_UNWINDER'
-     A C expression that decides whether or not the current function
-     needs to have a function unwinder generated for it.  See the file
-     `except.c' for details on when to define this, and how.
-
-`MASK_RETURN_ADDR'
-     An rtx used to mask the return address found via RETURN_ADDR_RTX,
-     so that it does not contain any extraneous set bits in it.
-
-`DWARF2_UNWIND_INFO'
-     Define this macro to 0 if your target supports DWARF 2 frame unwind
-     information, but it does not yet work with exception handling.
-     Otherwise, if your target supports this information (if it defines
-     `INCOMING_RETURN_ADDR_RTX' and either `UNALIGNED_INT_ASM_OP' or
-     `OBJECT_FORMAT_ELF'), GCC will provide a default definition of 1.
-
-     If this macro is defined to 1, the DWARF 2 unwinder will be the
-     default exception handling mechanism; otherwise, setjmp/longjmp
-     will be used by default.
-
-     If this macro is defined to anything, the DWARF 2 unwinder will be
-     used instead of inline unwinders and __unwind_function in the
-     non-setjmp case.
-
-\1f
-File: gcc.info,  Node: Alignment Output,  Prev: Exception Region Output,  Up: Assembler Format
-
-Assembler Commands for Alignment
---------------------------------
-
-   This describes commands for alignment.
-
-`ASM_OUTPUT_ALIGN_CODE (FILE)'
-     A C expression to output text to align the location counter in the
-     way that is desirable at a point in the code that is reached only
-     by jumping.
-
-     This macro need not be defined if you don't want any special
-     alignment to be done at such a time.  Most machine descriptions do
-     not currently define the macro.
-
-`ASM_OUTPUT_LOOP_ALIGN (FILE)'
-     A C expression to output text to align the location counter in the
-     way that is desirable at the beginning of a loop.
-
-     This macro need not be defined if you don't want any special
-     alignment to be done at such a time.  Most machine descriptions do
-     not currently define the macro.
-
-`ASM_OUTPUT_SKIP (STREAM, NBYTES)'
-     A C statement to output to the stdio stream STREAM an assembler
-     instruction to advance the location counter by NBYTES bytes.
-     Those bytes should be zero when loaded.  NBYTES will be a C
-     expression of type `int'.
-
-`ASM_NO_SKIP_IN_TEXT'
-     Define this macro if `ASM_OUTPUT_SKIP' should not be used in the
-     text section because it fails put zeros in the bytes that are
-     skipped.  This is true on many Unix systems, where the pseudo-op
-     to skip bytes produces no-op instructions rather than zeros when
-     used in the text section.
-
-`ASM_OUTPUT_ALIGN (STREAM, POWER)'
-     A C statement to output to the stdio stream STREAM an assembler
-     command to advance the location counter to a multiple of 2 to the
-     POWER bytes.  POWER will be a C expression of type `int'.
-
-\1f
-File: gcc.info,  Node: Debugging Info,  Next: Cross-compilation,  Prev: Assembler Format,  Up: Target Macros
-
-Controlling Debugging Information Format
-========================================
-
-   This describes how to specify debugging information.
-
-* Menu:
-
-* All Debuggers::      Macros that affect all debugging formats uniformly.
-* DBX Options::        Macros enabling specific options in DBX format.
-* DBX Hooks::          Hook macros for varying DBX format.
-* File Names and DBX:: Macros controlling output of file names in DBX format.
-* SDB and DWARF::      Macros for SDB (COFF) and DWARF formats.
-
-\1f
-File: gcc.info,  Node: All Debuggers,  Next: DBX Options,  Up: Debugging Info
-
-Macros Affecting All Debugging Formats
---------------------------------------
-
-   These macros affect all debugging formats.
-
-`DBX_REGISTER_NUMBER (REGNO)'
-     A C expression that returns the DBX register number for the
-     compiler register number REGNO.  In simple cases, the value of this
-     expression may be REGNO itself.  But sometimes there are some
-     registers that the compiler knows about and DBX does not, or vice
-     versa.  In such cases, some register may need to have one number in
-     the compiler and another for DBX.
-
-     If two registers have consecutive numbers inside GNU CC, and they
-     can be used as a pair to hold a multiword value, then they *must*
-     have consecutive numbers after renumbering with
-     `DBX_REGISTER_NUMBER'.  Otherwise, debuggers will be unable to
-     access such a pair, because they expect register pairs to be
-     consecutive in their own numbering scheme.
-
-     If you find yourself defining `DBX_REGISTER_NUMBER' in way that
-     does not preserve register pairs, then what you must do instead is
-     redefine the actual register numbering scheme.
-
-`DEBUGGER_AUTO_OFFSET (X)'
-     A C expression that returns the integer offset value for an
-     automatic variable having address X (an RTL expression).  The
-     default computation assumes that X is based on the frame-pointer
-     and gives the offset from the frame-pointer.  This is required for
-     targets that produce debugging output for DBX or COFF-style
-     debugging output for SDB and allow the frame-pointer to be
-     eliminated when the `-g' options is used.
-
-`DEBUGGER_ARG_OFFSET (OFFSET, X)'
-     A C expression that returns the integer offset value for an
-     argument having address X (an RTL expression).  The nominal offset
-     is OFFSET.
-
-`PREFERRED_DEBUGGING_TYPE'
-     A C expression that returns the type of debugging output GNU CC
-     produces when the user specifies `-g' or `-ggdb'.  Define this if
-     you have arranged for GNU CC to support more than one format of
-     debugging output.  Currently, the allowable values are `DBX_DEBUG',
-     `SDB_DEBUG', `DWARF_DEBUG', `DWARF2_DEBUG', and `XCOFF_DEBUG'.
-
-     The value of this macro only affects the default debugging output;
-     the user can always get a specific type of output by using
-     `-gstabs', `-gcoff', `-gdwarf-1', `-gdwarf-2', or `-gxcoff'.
-
-\1f
-File: gcc.info,  Node: DBX Options,  Next: DBX Hooks,  Prev: All Debuggers,  Up: Debugging Info
-
-Specific Options for DBX Output
--------------------------------
-
-   These are specific options for DBX output.
-
-`DBX_DEBUGGING_INFO'
-     Define this macro if GNU CC should produce debugging output for DBX
-     in response to the `-g' option.
-
-`XCOFF_DEBUGGING_INFO'
-     Define this macro if GNU CC should produce XCOFF format debugging
-     output in response to the `-g' option.  This is a variant of DBX
-     format.
-
-`DEFAULT_GDB_EXTENSIONS'
-     Define this macro to control whether GNU CC should by default
-     generate GDB's extended version of DBX debugging information
-     (assuming DBX-format debugging information is enabled at all).  If
-     you don't define the macro, the default is 1: always generate the
-     extended information if there is any occasion to.
-
-`DEBUG_SYMS_TEXT'
-     Define this macro if all `.stabs' commands should be output while
-     in the text section.
-
-`ASM_STABS_OP'
-     A C string constant naming the assembler pseudo op to use instead
-     of `.stabs' to define an ordinary debugging symbol.  If you don't
-     define this macro, `.stabs' is used.  This macro applies only to
-     DBX debugging information format.
-
-`ASM_STABD_OP'
-     A C string constant naming the assembler pseudo op to use instead
-     of `.stabd' to define a debugging symbol whose value is the current
-     location.  If you don't define this macro, `.stabd' is used.  This
-     macro applies only to DBX debugging information format.
-
-`ASM_STABN_OP'
-     A C string constant naming the assembler pseudo op to use instead
-     of `.stabn' to define a debugging symbol with no name.  If you
-     don't define this macro, `.stabn' is used.  This macro applies
-     only to DBX debugging information format.
-
-`DBX_NO_XREFS'
-     Define this macro if DBX on your system does not support the
-     construct `xsTAGNAME'.  On some systems, this construct is used to
-     describe a forward reference to a structure named TAGNAME.  On
-     other systems, this construct is not supported at all.
-
-`DBX_CONTIN_LENGTH'
-     A symbol name in DBX-format debugging information is normally
-     continued (split into two separate `.stabs' directives) when it
-     exceeds a certain length (by default, 80 characters).  On some
-     operating systems, DBX requires this splitting; on others,
-     splitting must not be done.  You can inhibit splitting by defining
-     this macro with the value zero.  You can override the default
-     splitting-length by defining this macro as an expression for the
-     length you desire.
-
-`DBX_CONTIN_CHAR'
-     Normally continuation is indicated by adding a `\' character to
-     the end of a `.stabs' string when a continuation follows.  To use
-     a different character instead, define this macro as a character
-     constant for the character you want to use.  Do not define this
-     macro if backslash is correct for your system.
-
-`DBX_STATIC_STAB_DATA_SECTION'
-     Define this macro if it is necessary to go to the data section
-     before outputting the `.stabs' pseudo-op for a non-global static
-     variable.
-
-`DBX_TYPE_DECL_STABS_CODE'
-     The value to use in the "code" field of the `.stabs' directive for
-     a typedef.  The default is `N_LSYM'.
-
-`DBX_STATIC_CONST_VAR_CODE'
-     The value to use in the "code" field of the `.stabs' directive for
-     a static variable located in the text section.  DBX format does not
-     provide any "right" way to do this.  The default is `N_FUN'.
-
-`DBX_REGPARM_STABS_CODE'
-     The value to use in the "code" field of the `.stabs' directive for
-     a parameter passed in registers.  DBX format does not provide any
-     "right" way to do this.  The default is `N_RSYM'.
-
-`DBX_REGPARM_STABS_LETTER'
-     The letter to use in DBX symbol data to identify a symbol as a
-     parameter passed in registers.  DBX format does not customarily
-     provide any way to do this.  The default is `'P''.
-
-`DBX_MEMPARM_STABS_LETTER'
-     The letter to use in DBX symbol data to identify a symbol as a
-     stack parameter.  The default is `'p''.
-
-`DBX_FUNCTION_FIRST'
-     Define this macro if the DBX information for a function and its
-     arguments should precede the assembler code for the function.
-     Normally, in DBX format, the debugging information entirely
-     follows the assembler code.
-
-`DBX_LBRAC_FIRST'
-     Define this macro if the `N_LBRAC' symbol for a block should
-     precede the debugging information for variables and functions
-     defined in that block.  Normally, in DBX format, the `N_LBRAC'
-     symbol comes first.
-
-`DBX_BLOCKS_FUNCTION_RELATIVE'
-     Define this macro if the value of a symbol describing the scope of
-     a block (`N_LBRAC' or `N_RBRAC') should be relative to the start
-     of the enclosing function.  Normally, GNU C uses an absolute
-     address.
-
-`DBX_USE_BINCL'
-     Define this macro if GNU C should generate `N_BINCL' and `N_EINCL'
-     stabs for included header files, as on Sun systems.  This macro
-     also directs GNU C to output a type number as a pair of a file
-     number and a type number within the file.  Normally, GNU C does not
-     generate `N_BINCL' or `N_EINCL' stabs, and it outputs a single
-     number for a type number.
-
-\1f
-File: gcc.info,  Node: DBX Hooks,  Next: File Names and DBX,  Prev: DBX Options,  Up: Debugging Info
-
-Open-Ended Hooks for DBX Format
--------------------------------
-
-   These are hooks for DBX format.
-
-`DBX_OUTPUT_LBRAC (STREAM, NAME)'
-     Define this macro to say how to output to STREAM the debugging
-     information for the start of a scope level for variable names.  The
-     argument NAME is the name of an assembler symbol (for use with
-     `assemble_name') whose value is the address where the scope begins.
-
-`DBX_OUTPUT_RBRAC (STREAM, NAME)'
-     Like `DBX_OUTPUT_LBRAC', but for the end of a scope level.
-
-`DBX_OUTPUT_ENUM (STREAM, TYPE)'
-     Define this macro if the target machine requires special handling
-     to output an enumeration type.  The definition should be a C
-     statement (sans semicolon) to output the appropriate information
-     to STREAM for the type TYPE.
-
-`DBX_OUTPUT_FUNCTION_END (STREAM, FUNCTION)'
-     Define this macro if the target machine requires special output at
-     the end of the debugging information for a function.  The
-     definition should be a C statement (sans semicolon) to output the
-     appropriate information to STREAM.  FUNCTION is the
-     `FUNCTION_DECL' node for the function.
-
-`DBX_OUTPUT_STANDARD_TYPES (SYMS)'
-     Define this macro if you need to control the order of output of the
-     standard data types at the beginning of compilation.  The argument
-     SYMS is a `tree' which is a chain of all the predefined global
-     symbols, including names of data types.
-
-     Normally, DBX output starts with definitions of the types for
-     integers and characters, followed by all the other predefined
-     types of the particular language in no particular order.
-
-     On some machines, it is necessary to output different particular
-     types first.  To do this, define `DBX_OUTPUT_STANDARD_TYPES' to
-     output those symbols in the necessary order.  Any predefined types
-     that you don't explicitly output will be output afterward in no
-     particular order.
-
-     Be careful not to define this macro so that it works only for C.
-     There are no global variables to access most of the built-in
-     types, because another language may have another set of types.
-     The way to output a particular type is to look through SYMS to see
-     if you can find it.  Here is an example:
-
-          {
-            tree decl;
-            for (decl = syms; decl; decl = TREE_CHAIN (decl))
-              if (!strcmp (IDENTIFIER_POINTER (DECL_NAME (decl)),
-                           "long int"))
-                dbxout_symbol (decl);
-            ...
-          }
-
-     This does nothing if the expected type does not exist.
-
-     See the function `init_decl_processing' in `c-decl.c' to find the
-     names to use for all the built-in C types.
-
-     Here is another way of finding a particular type:
-
-          {
-            tree decl;
-            for (decl = syms; decl; decl = TREE_CHAIN (decl))
-              if (TREE_CODE (decl) == TYPE_DECL
-                  && (TREE_CODE (TREE_TYPE (decl))
-                      == INTEGER_CST)
-                  && TYPE_PRECISION (TREE_TYPE (decl)) == 16
-                  && TYPE_UNSIGNED (TREE_TYPE (decl)))
-          /* This must be `unsigned short'.  */
-                dbxout_symbol (decl);
-            ...
-          }
-
-`NO_DBX_FUNCTION_END'
-     Some stabs encapsulation formats (in particular ECOFF), cannot
-     handle the `.stabs "",N_FUN,,0,0,Lscope-function-1' gdb dbx
-     extention construct.  On those machines, define this macro to turn
-     this feature off without disturbing the rest of the gdb extensions.
-
-\1f
-File: gcc.info,  Node: File Names and DBX,  Next: SDB and DWARF,  Prev: DBX Hooks,  Up: Debugging Info
-
-File Names in DBX Format
-------------------------
-
-   This describes file names in DBX format.
-
-`DBX_WORKING_DIRECTORY'
-     Define this if DBX wants to have the current directory recorded in
-     each object file.
-
-     Note that the working directory is always recorded if GDB
-     extensions are enabled.
-
-`DBX_OUTPUT_MAIN_SOURCE_FILENAME (STREAM, NAME)'
-     A C statement to output DBX debugging information to the stdio
-     stream STREAM which indicates that file NAME is the main source
-     file--the file specified as the input file for compilation.  This
-     macro is called only once, at the beginning of compilation.
-
-     This macro need not be defined if the standard form of output for
-     DBX debugging information is appropriate.
-
-`DBX_OUTPUT_MAIN_SOURCE_DIRECTORY (STREAM, NAME)'
-     A C statement to output DBX debugging information to the stdio
-     stream STREAM which indicates that the current directory during
-     compilation is named NAME.
-
-     This macro need not be defined if the standard form of output for
-     DBX debugging information is appropriate.
-
-`DBX_OUTPUT_MAIN_SOURCE_FILE_END (STREAM, NAME)'
-     A C statement to output DBX debugging information at the end of
-     compilation of the main source file NAME.
-
-     If you don't define this macro, nothing special is output at the
-     end of compilation, which is correct for most machines.
-
-`DBX_OUTPUT_SOURCE_FILENAME (STREAM, NAME)'
-     A C statement to output DBX debugging information to the stdio
-     stream STREAM which indicates that file NAME is the current source
-     file.  This output is generated each time input shifts to a
-     different source file as a result of `#include', the end of an
-     included file, or a `#line' command.
-
-     This macro need not be defined if the standard form of output for
-     DBX debugging information is appropriate.
-
-\1f
-File: gcc.info,  Node: SDB and DWARF,  Prev: File Names and DBX,  Up: Debugging Info
-
-Macros for SDB and DWARF Output
--------------------------------
-
-   Here are macros for SDB and DWARF output.
-
-`SDB_DEBUGGING_INFO'
-     Define this macro if GNU CC should produce COFF-style debugging
-     output for SDB in response to the `-g' option.
-
-`DWARF_DEBUGGING_INFO'
-     Define this macro if GNU CC should produce dwarf format debugging
-     output in response to the `-g' option.
-
-`DWARF2_DEBUGGING_INFO'
-     Define this macro if GNU CC should produce dwarf version 2 format
-     debugging output in response to the `-g' option.
-
-     To support optional call frame debugging information, you must also
-     define `INCOMING_RETURN_ADDR_RTX' and either set
-     `RTX_FRAME_RELATED_P' on the prologue insns if you use RTL for the
-     prologue, or call `dwarf2out_def_cfa' and `dwarf2out_reg_save' as
-     appropriate from `FUNCTION_PROLOGUE' if you don't.
-
-`PUT_SDB_...'
-     Define these macros to override the assembler syntax for the
-     special SDB assembler directives.  See `sdbout.c' for a list of
-     these macros and their arguments.  If the standard syntax is used,
-     you need not define them yourself.
-
-`SDB_DELIM'
-     Some assemblers do not support a semicolon as a delimiter, even
-     between SDB assembler directives.  In that case, define this macro
-     to be the delimiter to use (usually `\n').  It is not necessary to
-     define a new set of `PUT_SDB_OP' macros if this is the only change
-     required.
-
-`SDB_GENERATE_FAKE'
-     Define this macro to override the usual method of constructing a
-     dummy name for anonymous structure and union types.  See
-     `sdbout.c' for more information.
-
-`SDB_ALLOW_UNKNOWN_REFERENCES'
-     Define this macro to allow references to unknown structure, union,
-     or enumeration tags to be emitted.  Standard COFF does not allow
-     handling of unknown references, MIPS ECOFF has support for it.
-
-`SDB_ALLOW_FORWARD_REFERENCES'
-     Define this macro to allow references to structure, union, or
-     enumeration tags that have not yet been seen to be handled.  Some
-     assemblers choke if forward tags are used, while some require it.
-
-\1f
-File: gcc.info,  Node: Cross-compilation,  Next: Misc,  Prev: Debugging Info,  Up: Target Macros
-
-Cross Compilation and Floating Point
-====================================
-
-   While all modern machines use 2's complement representation for
-integers, there are a variety of representations for floating point
-numbers.  This means that in a cross-compiler the representation of
-floating point numbers in the compiled program may be different from
-that used in the machine doing the compilation.
-
-   Because different representation systems may offer different amounts
-of range and precision, the cross compiler cannot safely use the host
-machine's floating point arithmetic.  Therefore, floating point
-constants must be represented in the target machine's format.  This
-means that the cross compiler cannot use `atof' to parse a floating
-point constant; it must have its own special routine to use instead.
-Also, constant folding must emulate the target machine's arithmetic (or
-must not be done at all).
-
-   The macros in the following table should be defined only if you are
-cross compiling between different floating point formats.
-
-   Otherwise, don't define them.  Then default definitions will be set
-up which use `double' as the data type, `==' to test for equality, etc.
-
-   You don't need to worry about how many times you use an operand of
-any of these macros.  The compiler never uses operands which have side
-effects.
-
-`REAL_VALUE_TYPE'
-     A macro for the C data type to be used to hold a floating point
-     value in the target machine's format.  Typically this would be a
-     `struct' containing an array of `int'.
-
-`REAL_VALUES_EQUAL (X, Y)'
-     A macro for a C expression which compares for equality the two
-     values, X and Y, both of type `REAL_VALUE_TYPE'.
-
-`REAL_VALUES_LESS (X, Y)'
-     A macro for a C expression which tests whether X is less than Y,
-     both values being of type `REAL_VALUE_TYPE' and interpreted as
-     floating point numbers in the target machine's representation.
-
-`REAL_VALUE_LDEXP (X, SCALE)'
-     A macro for a C expression which performs the standard library
-     function `ldexp', but using the target machine's floating point
-     representation.  Both X and the value of the expression have type
-     `REAL_VALUE_TYPE'.  The second argument, SCALE, is an integer.
-
-`REAL_VALUE_FIX (X)'
-     A macro whose definition is a C expression to convert the
-     target-machine floating point value X to a signed integer.  X has
-     type `REAL_VALUE_TYPE'.
-
-`REAL_VALUE_UNSIGNED_FIX (X)'
-     A macro whose definition is a C expression to convert the
-     target-machine floating point value X to an unsigned integer.  X
-     has type `REAL_VALUE_TYPE'.
-
-`REAL_VALUE_RNDZINT (X)'
-     A macro whose definition is a C expression to round the
-     target-machine floating point value X towards zero to an integer
-     value (but still as a floating point number).  X has type
-     `REAL_VALUE_TYPE', and so does the value.
-
-`REAL_VALUE_UNSIGNED_RNDZINT (X)'
-     A macro whose definition is a C expression to round the
-     target-machine floating point value X towards zero to an unsigned
-     integer value (but still represented as a floating point number).
-     X has type `REAL_VALUE_TYPE', and so does the value.
-
-`REAL_VALUE_ATOF (STRING, MODE)'
-     A macro for a C expression which converts STRING, an expression of
-     type `char *', into a floating point number in the target machine's
-     representation for mode MODE.  The value has type
-     `REAL_VALUE_TYPE'.
-
-`REAL_INFINITY'
-     Define this macro if infinity is a possible floating point value,
-     and therefore division by 0 is legitimate.
-
-`REAL_VALUE_ISINF (X)'
-     A macro for a C expression which determines whether X, a floating
-     point value, is infinity.  The value has type `int'.  By default,
-     this is defined to call `isinf'.
-
-`REAL_VALUE_ISNAN (X)'
-     A macro for a C expression which determines whether X, a floating
-     point value, is a "nan" (not-a-number).  The value has type `int'.
-     By default, this is defined to call `isnan'.
-
-   Define the following additional macros if you want to make floating
-point constant folding work while cross compiling.  If you don't define
-them, cross compilation is still possible, but constant folding will
-not happen for floating point values.
-
-`REAL_ARITHMETIC (OUTPUT, CODE, X, Y)'
-     A macro for a C statement which calculates an arithmetic operation
-     of the two floating point values X and Y, both of type
-     `REAL_VALUE_TYPE' in the target machine's representation, to
-     produce a result of the same type and representation which is
-     stored in OUTPUT (which will be a variable).
-
-     The operation to be performed is specified by CODE, a tree code
-     which will always be one of the following: `PLUS_EXPR',
-     `MINUS_EXPR', `MULT_EXPR', `RDIV_EXPR', `MAX_EXPR', `MIN_EXPR'.
-
-     The expansion of this macro is responsible for checking for
-     overflow.  If overflow happens, the macro expansion should execute
-     the statement `return 0;', which indicates the inability to
-     perform the arithmetic operation requested.
-
-`REAL_VALUE_NEGATE (X)'
-     A macro for a C expression which returns the negative of the
-     floating point value X.  Both X and the value of the expression
-     have type `REAL_VALUE_TYPE' and are in the target machine's
-     floating point representation.
-
-     There is no way for this macro to report overflow, since overflow
-     can't happen in the negation operation.
-
-`REAL_VALUE_TRUNCATE (MODE, X)'
-     A macro for a C expression which converts the floating point value
-     X to mode MODE.
-
-     Both X and the value of the expression are in the target machine's
-     floating point representation and have type `REAL_VALUE_TYPE'.
-     However, the value should have an appropriate bit pattern to be
-     output properly as a floating constant whose precision accords
-     with mode MODE.
-
-     There is no way for this macro to report overflow.
-
-`REAL_VALUE_TO_INT (LOW, HIGH, X)'
-     A macro for a C expression which converts a floating point value X
-     into a double-precision integer which is then stored into LOW and
-     HIGH, two variables of type INT.
-
-`REAL_VALUE_FROM_INT (X, LOW, HIGH, MODE)'
-     A macro for a C expression which converts a double-precision
-     integer found in LOW and HIGH, two variables of type INT, into a
-     floating point value which is then stored into X.  The value is in
-     the target machine's representation for mode MODE and has the type
-     `REAL_VALUE_TYPE'.
-
diff --git a/gcc/gcc.info-26 b/gcc/gcc.info-26
deleted file mode 100644 (file)
index f70a06e..0000000
+++ /dev/null
@@ -1,973 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Misc,  Prev: Cross-compilation,  Up: Target Macros
-
-Miscellaneous Parameters
-========================
-
-   Here are several miscellaneous parameters.
-
-`PREDICATE_CODES'
-     Define this if you have defined special-purpose predicates in the
-     file `MACHINE.c'.  This macro is called within an initializer of an
-     array of structures.  The first field in the structure is the name
-     of a predicate and the second field is an array of rtl codes.  For
-     each predicate, list all rtl codes that can be in expressions
-     matched by the predicate.  The list should have a trailing comma.
-     Here is an example of two entries in the list for a typical RISC
-     machine:
-
-          #define PREDICATE_CODES \
-            {"gen_reg_rtx_operand", {SUBREG, REG}},  \
-            {"reg_or_short_cint_operand", {SUBREG, REG, CONST_INT}},
-
-     Defining this macro does not affect the generated code (however,
-     incorrect definitions that omit an rtl code that may be matched by
-     the predicate can cause the compiler to malfunction).  Instead, it
-     allows the table built by `genrecog' to be more compact and
-     efficient, thus speeding up the compiler.  The most important
-     predicates to include in the list specified by this macro are
-     thoses used in the most insn patterns.
-
-`CASE_VECTOR_MODE'
-     An alias for a machine mode name.  This is the machine mode that
-     elements of a jump-table should have.
-
-`CASE_VECTOR_PC_RELATIVE'
-     Define this macro if jump-tables should contain relative addresses.
-
-`CASE_DROPS_THROUGH'
-     Define this if control falls through a `case' insn when the index
-     value is out of range.  This means the specified default-label is
-     actually ignored by the `case' insn proper.
-
-`CASE_VALUES_THRESHOLD'
-     Define this to be the smallest number of different values for
-     which it is best to use a jump-table instead of a tree of
-     conditional branches.  The default is four for machines with a
-     `casesi' instruction and five otherwise.  This is best for most
-     machines.
-
-`WORD_REGISTER_OPERATIONS'
-     Define this macro if operations between registers with integral
-     mode smaller than a word are always performed on the entire
-     register.  Most RISC machines have this property and most CISC
-     machines do not.
-
-`LOAD_EXTEND_OP (MODE)'
-     Define this macro to be a C expression indicating when insns that
-     read memory in MODE, an integral mode narrower than a word, set the
-     bits outside of MODE to be either the sign-extension or the
-     zero-extension of the data read.  Return `SIGN_EXTEND' for values
-     of MODE for which the insn sign-extends, `ZERO_EXTEND' for which
-     it zero-extends, and `NIL' for other modes.
-
-     This macro is not called with MODE non-integral or with a width
-     greater than or equal to `BITS_PER_WORD', so you may return any
-     value in this case.  Do not define this macro if it would always
-     return `NIL'.  On machines where this macro is defined, you will
-     normally define it as the constant `SIGN_EXTEND' or `ZERO_EXTEND'.
-
-`IMPLICIT_FIX_EXPR'
-     An alias for a tree code that should be used by default for
-     conversion of floating point values to fixed point.  Normally,
-     `FIX_ROUND_EXPR' is used.
-
-`FIXUNS_TRUNC_LIKE_FIX_TRUNC'
-     Define this macro if the same instructions that convert a floating
-     point number to a signed fixed point number also convert validly
-     to an unsigned one.
-
-`EASY_DIV_EXPR'
-     An alias for a tree code that is the easiest kind of division to
-     compile code for in the general case.  It may be `TRUNC_DIV_EXPR',
-     `FLOOR_DIV_EXPR', `CEIL_DIV_EXPR' or `ROUND_DIV_EXPR'.  These four
-     division operators differ in how they round the result to an
-     integer.  `EASY_DIV_EXPR' is used when it is permissible to use
-     any of those kinds of division and the choice should be made on
-     the basis of efficiency.
-
-`MOVE_MAX'
-     The maximum number of bytes that a single instruction can move
-     quickly between memory and registers or between two memory
-     locations.
-
-`MAX_MOVE_MAX'
-     The maximum number of bytes that a single instruction can move
-     quickly between memory and registers or between two memory
-     locations.  If this is undefined, the default is `MOVE_MAX'.
-     Otherwise, it is the constant value that is the largest value that
-     `MOVE_MAX' can have at run-time.
-
-`SHIFT_COUNT_TRUNCATED'
-     A C expression that is nonzero if on this machine the number of
-     bits actually used for the count of a shift operation is equal to
-     the number of bits needed to represent the size of the object
-     being shifted.  When this macro is non-zero, the compiler will
-     assume that it is safe to omit a sign-extend, zero-extend, and
-     certain bitwise `and' instructions that truncates the count of a
-     shift operation.  On machines that have instructions that act on
-     bitfields at variable positions, which may include `bit test'
-     instructions, a nonzero `SHIFT_COUNT_TRUNCATED' also enables
-     deletion of truncations of the values that serve as arguments to
-     bitfield instructions.
-
-     If both types of instructions truncate the count (for shifts) and
-     position (for bitfield operations), or if no variable-position
-     bitfield instructions exist, you should define this macro.
-
-     However, on some machines, such as the 80386 and the 680x0,
-     truncation only applies to shift operations and not the (real or
-     pretended) bitfield operations.  Define `SHIFT_COUNT_TRUNCATED' to
-     be zero on such machines.  Instead, add patterns to the `md' file
-     that include the implied truncation of the shift instructions.
-
-     You need not define this macro if it would always have the value
-     of zero.
-
-`TRULY_NOOP_TRUNCATION (OUTPREC, INPREC)'
-     A C expression which is nonzero if on this machine it is safe to
-     "convert" an integer of INPREC bits to one of OUTPREC bits (where
-     OUTPREC is smaller than INPREC) by merely operating on it as if it
-     had only OUTPREC bits.
-
-     On many machines, this expression can be 1.
-
-     When `TRULY_NOOP_TRUNCATION' returns 1 for a pair of sizes for
-     modes for which `MODES_TIEABLE_P' is 0, suboptimal code can result.
-     If this is the case, making `TRULY_NOOP_TRUNCATION' return 0 in
-     such cases may improve things.
-
-`STORE_FLAG_VALUE'
-     A C expression describing the value returned by a comparison
-     operator with an integral mode and stored by a store-flag
-     instruction (`sCOND') when the condition is true.  This
-     description must apply to *all* the `sCOND' patterns and all the
-     comparison operators whose results have a `MODE_INT' mode.
-
-     A value of 1 or -1 means that the instruction implementing the
-     comparison operator returns exactly 1 or -1 when the comparison is
-     true and 0 when the comparison is false.  Otherwise, the value
-     indicates which bits of the result are guaranteed to be 1 when the
-     comparison is true.  This value is interpreted in the mode of the
-     comparison operation, which is given by the mode of the first
-     operand in the `sCOND' pattern.  Either the low bit or the sign
-     bit of `STORE_FLAG_VALUE' be on.  Presently, only those bits are
-     used by the compiler.
-
-     If `STORE_FLAG_VALUE' is neither 1 or -1, the compiler will
-     generate code that depends only on the specified bits.  It can also
-     replace comparison operators with equivalent operations if they
-     cause the required bits to be set, even if the remaining bits are
-     undefined.  For example, on a machine whose comparison operators
-     return an `SImode' value and where `STORE_FLAG_VALUE' is defined as
-     `0x80000000', saying that just the sign bit is relevant, the
-     expression
-
-          (ne:SI (and:SI X (const_int POWER-OF-2)) (const_int 0))
-
-     can be converted to
-
-          (ashift:SI X (const_int N))
-
-     where N is the appropriate shift count to move the bit being
-     tested into the sign bit.
-
-     There is no way to describe a machine that always sets the
-     low-order bit for a true value, but does not guarantee the value
-     of any other bits, but we do not know of any machine that has such
-     an instruction.  If you are trying to port GNU CC to such a
-     machine, include an instruction to perform a logical-and of the
-     result with 1 in the pattern for the comparison operators and let
-     us know (*note How to Report Bugs: Bug Reporting.).
-
-     Often, a machine will have multiple instructions that obtain a
-     value from a comparison (or the condition codes).  Here are rules
-     to guide the choice of value for `STORE_FLAG_VALUE', and hence the
-     instructions to be used:
-
-        * Use the shortest sequence that yields a valid definition for
-          `STORE_FLAG_VALUE'.  It is more efficient for the compiler to
-          "normalize" the value (convert it to, e.g., 1 or 0) than for
-          the comparison operators to do so because there may be
-          opportunities to combine the normalization with other
-          operations.
-
-        * For equal-length sequences, use a value of 1 or -1, with -1
-          being slightly preferred on machines with expensive jumps and
-          1 preferred on other machines.
-
-        * As a second choice, choose a value of `0x80000001' if
-          instructions exist that set both the sign and low-order bits
-          but do not define the others.
-
-        * Otherwise, use a value of `0x80000000'.
-
-     Many machines can produce both the value chosen for
-     `STORE_FLAG_VALUE' and its negation in the same number of
-     instructions.  On those machines, you should also define a pattern
-     for those cases, e.g., one matching
-
-          (set A (neg:M (ne:M B C)))
-
-     Some machines can also perform `and' or `plus' operations on
-     condition code values with less instructions than the corresponding
-     `sCOND' insn followed by `and' or `plus'.  On those machines,
-     define the appropriate patterns.  Use the names `incscc' and
-     `decscc', respectively, for the patterns which perform `plus' or
-     `minus' operations on condition code values.  See `rs6000.md' for
-     some examples.  The GNU Superoptizer can be used to find such
-     instruction sequences on other machines.
-
-     You need not define `STORE_FLAG_VALUE' if the machine has no
-     store-flag instructions.
-
-`FLOAT_STORE_FLAG_VALUE'
-     A C expression that gives a non-zero floating point value that is
-     returned when comparison operators with floating-point results are
-     true.  Define this macro on machine that have comparison
-     operations that return floating-point values.  If there are no
-     such operations, do not define this macro.
-
-`Pmode'
-     An alias for the machine mode for pointers.  On most machines,
-     define this to be the integer mode corresponding to the width of a
-     hardware pointer; `SImode' on 32-bit machine or `DImode' on 64-bit
-     machines.  On some machines you must define this to be one of the
-     partial integer modes, such as `PSImode'.
-
-     The width of `Pmode' must be at least as large as the value of
-     `POINTER_SIZE'.  If it is not equal, you must define the macro
-     `POINTERS_EXTEND_UNSIGNED' to specify how pointers are extended to
-     `Pmode'.
-
-`FUNCTION_MODE'
-     An alias for the machine mode used for memory references to
-     functions being called, in `call' RTL expressions.  On most
-     machines this should be `QImode'.
-
-`INTEGRATE_THRESHOLD (DECL)'
-     A C expression for the maximum number of instructions above which
-     the function DECL should not be inlined.  DECL is a
-     `FUNCTION_DECL' node.
-
-     The default definition of this macro is 64 plus 8 times the number
-     of arguments that the function accepts.  Some people think a larger
-     threshold should be used on RISC machines.
-
-`SCCS_DIRECTIVE'
-     Define this if the preprocessor should ignore `#sccs' directives
-     and print no error message.
-
-`NO_IMPLICIT_EXTERN_C'
-     Define this macro if the system header files support C++ as well
-     as C.  This macro inhibits the usual method of using system header
-     files in C++, which is to pretend that the file's contents are
-     enclosed in `extern "C" {...}'.
-
-`HANDLE_PRAGMA (STREAM, NODE)'
-     Define this macro if you want to implement any pragmas.  If
-     defined, it is a C expression whose value is 1 if the pragma was
-     handled by the function.  The argument STREAM is the stdio input
-     stream from which the source text can be read.  NODE is the tree
-     node for the identifier after the `#pragma'.
-
-     It is generally a bad idea to implement new uses of `#pragma'.  The
-     only reason to define this macro is for compatibility with other
-     compilers that do support `#pragma' for the sake of any user
-     programs which already use it.
-
-`VALID_MACHINE_DECL_ATTRIBUTE (DECL, ATTRIBUTES, IDENTIFIER, ARGS)'
-     If defined, a C expression whose value is nonzero if IDENTIFIER
-     with arguments ARGS is a valid machine specific attribute for DECL.
-     The attributes in ATTRIBUTES have previously been assigned to DECL.
-
-`VALID_MACHINE_TYPE_ATTRIBUTE (TYPE, ATTRIBUTES, IDENTIFIER, ARGS)'
-     If defined, a C expression whose value is nonzero if IDENTIFIER
-     with arguments ARGS is a valid machine specific attribute for TYPE.
-     The attributes in ATTRIBUTES have previously been assigned to TYPE.
-
-`COMP_TYPE_ATTRIBUTES (TYPE1, TYPE2)'
-     If defined, a C expression whose value is zero if the attributes on
-     TYPE1 and TYPE2 are incompatible, one if they are compatible, and
-     two if they are nearly compatible (which causes a warning to be
-     generated).
-
-`SET_DEFAULT_TYPE_ATTRIBUTES (TYPE)'
-     If defined, a C statement that assigns default attributes to newly
-     defined TYPE.
-
-`DOLLARS_IN_IDENTIFIERS'
-     Define this macro to control use of the character `$' in identifier
-     names.  0 means `$' is not allowed by default; 1 means it is
-     allowed.  1 is the default; there is no need to define this macro
-     in that case.  This macro controls the compiler proper; it does
-     not affect the preprocessor.
-
-`NO_DOLLAR_IN_LABEL'
-     Define this macro if the assembler does not accept the character
-     `$' in label names.  By default constructors and destructors in
-     G++ have `$' in the identifiers.  If this macro is defined, `.' is
-     used instead.
-
-`NO_DOT_IN_LABEL'
-     Define this macro if the assembler does not accept the character
-     `.' in label names.  By default constructors and destructors in G++
-     have names that use `.'.  If this macro is defined, these names
-     are rewritten to avoid `.'.
-
-`DEFAULT_MAIN_RETURN'
-     Define this macro if the target system expects every program's
-     `main' function to return a standard "success" value by default
-     (if no other value is explicitly returned).
-
-     The definition should be a C statement (sans semicolon) to
-     generate the appropriate rtl instructions.  It is used only when
-     compiling the end of `main'.
-
-`HAVE_ATEXIT'
-     Define this if the target system supports the function `atexit'
-     from the ANSI C standard.  If this is not defined, and
-     `INIT_SECTION_ASM_OP' is not defined, a default `exit' function
-     will be provided to support C++.
-
-`EXIT_BODY'
-     Define this if your `exit' function needs to do something besides
-     calling an external function `_cleanup' before terminating with
-     `_exit'.  The `EXIT_BODY' macro is only needed if neither
-     `HAVE_ATEXIT' nor `INIT_SECTION_ASM_OP' are defined.
-
-`INSN_SETS_ARE_DELAYED (INSN)'
-     Define this macro as a C expression that is nonzero if it is safe
-     for the delay slot scheduler to place instructions in the delay
-     slot of INSN, even if they appear to use a resource set or
-     clobbered in INSN.  INSN is always a `jump_insn' or an `insn'; GNU
-     CC knows that every `call_insn' has this behavior.  On machines
-     where some `insn' or `jump_insn' is really a function call and
-     hence has this behavior, you should define this macro.
-
-     You need not define this macro if it would always return zero.
-
-`INSN_REFERENCES_ARE_DELAYED (INSN)'
-     Define this macro as a C expression that is nonzero if it is safe
-     for the delay slot scheduler to place instructions in the delay
-     slot of INSN, even if they appear to set or clobber a resource
-     referenced in INSN.  INSN is always a `jump_insn' or an `insn'.
-     On machines where some `insn' or `jump_insn' is really a function
-     call and its operands are registers whose use is actually in the
-     subroutine it calls, you should define this macro.  Doing so
-     allows the delay slot scheduler to move instructions which copy
-     arguments into the argument registers into the delay slot of INSN.
-
-     You need not define this macro if it would always return zero.
-
-`MACHINE_DEPENDENT_REORG (INSN)'
-     In rare cases, correct code generation requires extra machine
-     dependent processing between the second jump optimization pass and
-     delayed branch scheduling.  On those machines, define this macro
-     as a C statement to act on the code starting at INSN.
-
-`MULTIPLE_SYMBOL_SPACES'
-     Define this macro if in some cases global symbols from one
-     translation unit may not be bound to undefined symbols in another
-     translation unit without user intervention.  For instance, under
-     Microsoft Windows symbols must be explicitly imported from shared
-     libraries (DLLs).
-
-`GIV_SORT_CRITERION (GIV1, GIV2)'
-     In some cases, the strength reduction optimization pass can
-     produce better code if this is defined.  This macro controls the
-     order that induction variables are combined.  This macro is
-     particularly useful if the target has limited addressing modes.
-     For instance, the SH target has only positive offsets in
-     addresses.  Thus sorting to put the smallest address first allows
-     the most combinations to be found.
-
-\1f
-File: gcc.info,  Node: Config,  Next: Fragments,  Prev: Target Macros,  Up: Top
-
-The Configuration File
-**********************
-
-   The configuration file `xm-MACHINE.h' contains macro definitions
-that describe the machine and system on which the compiler is running,
-unlike the definitions in `MACHINE.h', which describe the machine for
-which the compiler is producing output.  Most of the values in
-`xm-MACHINE.h' are actually the same on all machines that GNU CC runs
-on, so large parts of all configuration files are identical.  But there
-are some macros that vary:
-
-`USG'
-     Define this macro if the host system is System V.
-
-`VMS'
-     Define this macro if the host system is VMS.
-
-`FATAL_EXIT_CODE'
-     A C expression for the status code to be returned when the compiler
-     exits after serious errors.
-
-`SUCCESS_EXIT_CODE'
-     A C expression for the status code to be returned when the compiler
-     exits without serious errors.
-
-`HOST_WORDS_BIG_ENDIAN'
-     Defined if the host machine stores words of multi-word values in
-     big-endian order.  (GNU CC does not depend on the host byte
-     ordering within a word.)
-
-`HOST_FLOAT_WORDS_BIG_ENDIAN'
-     Define this macro to be 1 if the host machine stores `DFmode',
-     `XFmode' or `TFmode' floating point numbers in memory with the
-     word containing the sign bit at the lowest address; otherwise,
-     define it to be zero.
-
-     This macro need not be defined if the ordering is the same as for
-     multi-word integers.
-
-`HOST_FLOAT_FORMAT'
-     A numeric code distinguishing the floating point format for the
-     host machine.  See `TARGET_FLOAT_FORMAT' in *Note Storage Layout::
-     for the alternatives and default.
-
-`HOST_BITS_PER_CHAR'
-     A C expression for the number of bits in `char' on the host
-     machine.
-
-`HOST_BITS_PER_SHORT'
-     A C expression for the number of bits in `short' on the host
-     machine.
-
-`HOST_BITS_PER_INT'
-     A C expression for the number of bits in `int' on the host machine.
-
-`HOST_BITS_PER_LONG'
-     A C expression for the number of bits in `long' on the host
-     machine.
-
-`ONLY_INT_FIELDS'
-     Define this macro to indicate that the host compiler only supports
-     `int' bit fields, rather than other integral types, including
-     `enum', as do most C compilers.
-
-`OBSTACK_CHUNK_SIZE'
-     A C expression for the size of ordinary obstack chunks.  If you
-     don't define this, a usually-reasonable default is used.
-
-`OBSTACK_CHUNK_ALLOC'
-     The function used to allocate obstack chunks.  If you don't define
-     this, `xmalloc' is used.
-
-`OBSTACK_CHUNK_FREE'
-     The function used to free obstack chunks.  If you don't define
-     this, `free' is used.
-
-`USE_C_ALLOCA'
-     Define this macro to indicate that the compiler is running with the
-     `alloca' implemented in C.  This version of `alloca' can be found
-     in the file `alloca.c'; to use it, you must also alter the
-     `Makefile' variable `ALLOCA'.  (This is done automatically for the
-     systems on which we know it is needed.)
-
-     If you do define this macro, you should probably do it as follows:
-
-          #ifndef __GNUC__
-          #define USE_C_ALLOCA
-          #else
-          #define alloca __builtin_alloca
-          #endif
-
-     so that when the compiler is compiled with GNU CC it uses the more
-     efficient built-in `alloca' function.
-
-`FUNCTION_CONVERSION_BUG'
-     Define this macro to indicate that the host compiler does not
-     properly handle converting a function value to a
-     pointer-to-function when it is used in an expression.
-
-`HAVE_VPRINTF'
-     Define this if the library function `vprintf' is available on your
-     system.
-
-`MULTIBYTE_CHARS'
-     Define this macro to enable support for multibyte characters in the
-     input to GNU CC.  This requires that the host system support the
-     ANSI C library functions for converting multibyte characters to
-     wide characters.
-
-`HAVE_PUTENV'
-     Define this if the library function `putenv' is available on your
-     system.
-
-`POSIX'
-     Define this if your system is POSIX.1 compliant.
-
-`HAVE_POPEN'
-     Define this if the library function `popen' is available on your
-     system.
-
-`NO_SYS_SIGLIST'
-     Define this if your system *does not* provide the variable
-     `sys_siglist'.
-
-     Some systems do provide this variable, but with a different name
-     such as `_sys_siglist'.  On these systems, you can define
-     `sys_siglist' as a macro which expands into the name actually
-     provided.
-
-     Autoconf normally defines `SYS_SIGLIST_DECLARED' when it finds a
-     declaration of `sys_siglist' in the system header files.  However,
-     when you define `sys_siglist' to a different name autoconf will
-     not automatically define `SYS_SIGLIST_DECLARED'.  Therefore, if
-     you define `sys_siglist', you should also define
-     `SYS_SIGLIST_DECLARED'.
-
-`USE_PROTOTYPES'
-     Define this to be 1 if you know that the host compiler supports
-     prototypes, even if it doesn't define __STDC__, or define it to be
-     0 if you do not want any prototypes used in compiling GNU CC.  If
-     `USE_PROTOTYPES' is not defined, it will be determined
-     automatically whether your compiler supports prototypes by
-     checking if `__STDC__' is defined.
-
-`NO_MD_PROTOTYPES'
-     Define this if you wish suppression of prototypes generated from
-     the machine description file, but to use other prototypes within
-     GNU CC.  If `USE_PROTOTYPES' is defined to be 0, or the host
-     compiler does not support prototypes, this macro has no effect.
-
-`MD_CALL_PROTOTYPES'
-     Define this if you wish to generate prototypes for the `gen_call'
-     or `gen_call_value' functions generated from the machine
-     description file.  If `USE_PROTOTYPES' is defined to be 0, or the
-     host compiler does not support prototypes, or `NO_MD_PROTOTYPES'
-     is defined, this macro has no effect.  As soon as all of the
-     machine descriptions are modified to have the appropriate number
-     of arguments, this macro will be removed.
-
-`NO_STAB_H'
-     Define this if your system does not have the include file
-     `stab.h'.  If `USG' is defined, `NO_STAB_H' is assumed.
-
-`PATH_SEPARATOR'
-     Define this macro to be a C character constant representing the
-     character used to separate components in paths.  The default value
-     is the colon character
-
-`DIR_SEPARATOR'
-     If your system uses some character other than slash to separate
-     directory names within a file specification, define this macro to
-     be a C character constant specifying that character.  When GNU CC
-     displays file names, the character you specify will be used.  GNU
-     CC will test for both slash and the character you specify when
-     parsing filenames.
-
-`OBJECT_SUFFIX'
-     Define this macro to be a C string representing the suffix for
-     object files on your machine.  If you do not define this macro,
-     GNU CC will use `.o' as the suffix for object files.
-
-`EXECUTABLE_SUFFIX'
-     Define this macro to be a C string representing the suffix for
-     executable files on your machine.  If you do not define this
-     macro, GNU CC will use the null string as the suffix for object
-     files.
-
-`COLLECT_EXPORT_LIST'
-     If defined, `collect2' will scan the individual object files
-     specified on its command line and create an export list for the
-     linker.  Define this macro for systems like AIX, where the linker
-     discards object files that are not referenced from `main' and uses
-     export lists.
-
-   In addition, configuration files for system V define `bcopy',
-`bzero' and `bcmp' as aliases.  Some files define `alloca' as a macro
-when compiled with GNU CC, in order to take advantage of the benefit of
-GNU CC's built-in `alloca'.
-
-\1f
-File: gcc.info,  Node: Fragments,  Next: Funding,  Prev: Config,  Up: Top
-
-Makefile Fragments
-******************
-
-   When you configure GNU CC using the `configure' script (*note
-Installation::.), it will construct the file `Makefile' from the
-template file `Makefile.in'.  When it does this, it will incorporate
-makefile fragment files from the `config' directory, named `t-TARGET'
-and `x-HOST'.  If these files do not exist, it means nothing needs to
-be added for a given target or host.
-
-* Menu:
-
-* Target Fragment:: Writing the `t-TARGET' file.
-* Host Fragment::   Writing the `x-HOST' file.
-
-\1f
-File: gcc.info,  Node: Target Fragment,  Next: Host Fragment,  Up: Fragments
-
-The Target Makefile Fragment
-============================
-
-   The target makefile fragment, `t-TARGET', defines special target
-dependent variables and targets used in the `Makefile':
-
-`LIBGCC1'
-     The rule to use to build `libgcc1.a'.  If your target does not
-     need to use the functions in `libgcc1.a', set this to empty.
-     *Note Interface::.
-
-`CROSS_LIBGCC1'
-     The rule to use to build `libgcc1.a' when building a cross
-     compiler.  If your target does not need to use the functions in
-     `libgcc1.a', set this to empty.  *Note Cross Runtime::.
-
-`LIBGCC2_CFLAGS'
-     Compiler flags to use when compiling `libgcc2.c'.
-
-`LIB2FUNCS_EXTRA'
-     A list of source file names to be compiled or assembled and
-     inserted into `libgcc.a'.
-
-`CRTSTUFF_T_CFLAGS'
-     Special flags used when compiling `crtstuff.c'.  *Note
-     Initialization::.
-
-`CRTSTUFF_T_CFLAGS_S'
-     Special flags used when compiling `crtstuff.c' for shared linking.
-     Used if you use `crtbeginS.o' and `crtendS.o' in `EXTRA-PARTS'.
-     *Note Initialization::.
-
-`MULTILIB_OPTIONS'
-     For some targets, invoking GNU CC in different ways produces
-     objects that can not be linked together.  For example, for some
-     targets GNU CC produces both big and little endian code.  For
-     these targets, you must arrange for multiple versions of
-     `libgcc.a' to be compiled, one for each set of incompatible
-     options.  When GNU CC invokes the linker, it arranges to link in
-     the right version of `libgcc.a', based on the command line options
-     used.
-
-     The `MULTILIB_OPTIONS' macro lists the set of options for which
-     special versions of `libgcc.a' must be built.  Write options that
-     are mutually incompatible side by side, separated by a slash.
-     Write options that may be used together separated by a space.  The
-     build procedure will build all combinations of compatible options.
-
-     For example, if you set `MULTILIB_OPTIONS' to `m68000/m68020
-     msoft-float', `Makefile' will build special versions of `libgcc.a'
-     using the sets of options `-m68000', `-m68020', `-msoft-float',
-     `-m68000 -msoft-float', and `-m68020 -msoft-float'.
-
-`MULTILIB_DIRNAMES'
-     If `MULTILIB_OPTIONS' is used, this variable specifies the
-     directory names that should be used to hold the various libraries.
-     Write one element in `MULTILIB_DIRNAMES' for each element in
-     `MULTILIB_OPTIONS'.  If `MULTILIB_DIRNAMES' is not used, the
-     default value will be `MULTILIB_OPTIONS', with all slashes treated
-     as spaces.
-
-     For example, if `MULTILIB_OPTIONS' is specified as `m68000/m68020
-     msoft-float', then the default value of `MULTILIB_DIRNAMES' is
-     `m68000 m68020 msoft-float'.  You may specify a different value if
-     you desire a different set of directory names.
-
-`MULTILIB_MATCHES'
-     Sometimes the same option may be written in two different ways.
-     If an option is listed in `MULTILIB_OPTIONS', GNU CC needs to know
-     about any synonyms.  In that case, set `MULTILIB_MATCHES' to a
-     list of items of the form `option=option' to describe all relevant
-     synonyms.  For example, `m68000=mc68000 m68020=mc68020'.
-
-`MULTILIB_EXCEPTIONS'
-     Sometimes when there are multiple sets of `MULTILIB_OPTIONS' being
-     specified, there are combinations that should not be built.  In
-     that case, set `MULTILIB_EXCEPTIONS' to be all of the switch
-     exceptions in shell case syntax that should not be built.
-
-     For example, in the PowerPC embedded ABI support, it was not
-     desirable to build libraries that compiled with the
-     `-mcall-aixdesc' option and either of the `-mcall-aixdesc' or
-     `-mlittle' options at the same time, and therefore
-     `MULTILIB_EXCEPTIONS' is set to `*mrelocatable/*mcall-aixdesc*
-     *mlittle/*mcall-aixdesc*'.
-
-`MULTILIB_EXTRA_OPTS'
-     Sometimes it is desirable that when building multiple versions of
-     `libgcc.a' certain options should always be passed on to the
-     compiler.  In that case, set `MULTILIB_EXTRA_OPTS' to be the list
-     of options to be used for all builds.
-
-\1f
-File: gcc.info,  Node: Host Fragment,  Prev: Target Fragment,  Up: Fragments
-
-The Host Makefile Fragment
-==========================
-
-   The host makefile fragment, `x-HOST', defines special host dependent
-variables and targets used in the `Makefile':
-
-`CC'
-     The compiler to use when building the first stage.
-
-`CLIB'
-     Additional host libraries to link with.
-
-`OLDCC'
-     The compiler to use when building `libgcc1.a' for a native
-     compilation.
-
-`OLDAR'
-     The version of `ar' to use when building `libgcc1.a' for a native
-     compilation.
-
-`INSTALL'
-     The install program to use.
-
-\1f
-File: gcc.info,  Node: Funding,  Next: Look and Feel,  Prev: Fragments,  Up: Top
-
-Funding Free Software
-*********************
-
-   If you want to have more free software a few years from now, it makes
-sense for you to help encourage people to contribute funds for its
-development.  The most effective approach known is to encourage
-commercial redistributors to donate.
-
-   Users of free software systems can boost the pace of development by
-encouraging for-a-fee distributors to donate part of their selling price
-to free software developers--the Free Software Foundation, and others.
-
-   The way to convince distributors to do this is to demand it and
-expect it from them.  So when you compare distributors, judge them
-partly by how much they give to free software development.  Show
-distributors they must compete to be the one who gives the most.
-
-   To make this approach work, you must insist on numbers that you can
-compare, such as, "We will donate ten dollars to the Frobnitz project
-for each disk sold."  Don't be satisfied with a vague promise, such as
-"A portion of the profits are donated," since it doesn't give a basis
-for comparison.
-
-   Even a precise fraction "of the profits from this disk" is not very
-meaningful, since creative accounting and unrelated business decisions
-can greatly alter what fraction of the sales price counts as profit.
-If the price you pay is $50, ten percent of the profit is probably less
-than a dollar; it might be a few cents, or nothing at all.
-
-   Some redistributors do development work themselves.  This is useful
-too; but to keep everyone honest, you need to inquire how much they do,
-and what kind.  Some kinds of development make much more long-term
-difference than others.  For example, maintaining a separate version of
-a program contributes very little; maintaining the standard version of a
-program for the whole community contributes much.  Easy new ports
-contribute little, since someone else would surely do them; difficult
-ports such as adding a new CPU to the GNU C compiler contribute more;
-major new features or packages contribute the most.
-
-   By establishing the idea that supporting further development is "the
-proper thing to do" when distributing free software for a fee, we can
-assure a steady flow of resources into making more free software.
-
-     Copyright (C) 1994 Free Software Foundation, Inc.
-     Verbatim copying and redistribution of this section is permitted
-     without royalty; alteration is not permitted.
-
-\1f
-File: gcc.info,  Node: Look and Feel,  Next: Copying,  Prev: Funding,  Up: Top
-
-Protect Your Freedom--Fight "Look And Feel"
-*******************************************
-
-     This section is a political message from the League for Programming
-     Freedom to the users of GNU CC.  We have included it here because
-     the issue of interface copyright is important to the GNU project.
-
-   Apple, Lotus, and now CDC have tried to create a new form of legal
-monopoly: a copyright on a user interface.
-
-   An interface is a kind of language--a set of conventions for
-communication between two entities, human or machine.  Until a few years
-ago, the law seemed clear: interfaces were outside the domain of
-copyright, so programmers could program freely and implement whatever
-interface the users demanded.  Imitating de-facto standard interfaces,
-sometimes with improvements, was standard practice in the computer
-field.  These improvements, if accepted by the users, caught on and
-became the norm; in this way, much progress took place.
-
-   Computer users, and most software developers, were happy with this
-state of affairs.  However, large companies such as Apple and Lotus
-would prefer a different system--one in which they can own interfaces
-and thereby rid themselves of all serious competitors.  They hope that
-interface copyright will give them, in effect, monopolies on major
-classes of software.
-
-   Other large companies such as IBM and Digital also favor interface
-monopolies, for the same reason: if languages become property, they
-expect to own many de-facto standard languages.  But Apple and Lotus are
-the ones who have actually sued.  Apple's lawsuit was defeated, for
-reasons only partly related to the general issue of interface copyright.
-
-   Lotus won lawsuits against two small companies, which were thus put
-out of business.  Then Lotus sued Borland; Lotus won in the trial court
-(no surprise, since it was the same court that had ruled for Lotus twice
-before), but the court of appeals ruled in favor of Borland, which was
-assisted by a friend-of-the-court brief from the League for Programming
-Freedom.
-
-   Lotus appealed the case to the Supreme Court, which heard the case
-but was unable to reach a decision.  This failure means that the appeals
-court decision stands, in one portion of the United States, and may
-influence the other appeals courts, but it does not set a nationwide
-precedent.  The battle is not over, and it is not limited to the United
-States.
-
-   The battle is extending into other areas of software as well.  In
-1995 a company that produced a simulator for a CDC computer was shut
-down by a copyright lawsuit, in which CDC charged that the simulator
-infringed the copyright on the manuals for the computer.
-
-   If the monopolists get their way, they will hobble the software
-field:
-
-   * Gratuitous incompatibilities will burden users.  Imagine if each
-     car manufacturer had to design a different way to start, stop, and
-     steer a car.
-
-   * Users will be "locked in" to whichever interface they learn; then
-     they will be prisoners of one supplier, who will charge a
-     monopolistic price.
-
-   * Large companies have an unfair advantage wherever lawsuits become
-     commonplace.  Since they can afford to sue, they can intimidate
-     smaller developers with threats even when they don't really have a
-     case.
-
-   * Interface improvements will come slower, since incremental
-     evolution through creative partial imitation will no longer occur.
-
-   If interface monopolies are accepted, other large companies are
-waiting to grab theirs:
-
-   * Adobe is expected to claim a monopoly on the interfaces of various
-     popular application programs, if Lotus ultimately wins the case
-     against Borland.
-
-   * Open Computing magazine reported a Microsoft vice president as
-     threatening to sue people who imitate the interface of Windows.
-
-   Users invest a great deal of time and money in learning to use
-computer interfaces.  Far more, in fact, than software developers
-invest in developing *and even implementing* the interfaces.  Whoever
-can own an interface, has made its users into captives, and
-misappropriated their investment.
-
-   To protect our freedom from monopolies like these, a group of
-programmers and users have formed a grass-roots political organization,
-the League for Programming Freedom.
-
-   The purpose of the League is to oppose monopolistic practices such as
-interface copyright and software patents.  The League calls for a return
-to the legal policies of the recent past, in which programmers could
-program freely.  The League is not concerned with free software as an
-issue, and is not affiliated with the Free Software Foundation.
-
-   The League's activities include publicizing the issues, as is being
-done here, and filing friend-of-the-court briefs on behalf of
-defendants sued by monopolists.
-
-   The League's membership rolls include Donald Knuth, the foremost
-authority on algorithms, John McCarthy, inventor of Lisp, Marvin Minsky,
-founder of the MIT Artificial Intelligence lab, Guy L. Steele, Jr.,
-author of well-known books on Lisp and C, as well as Richard Stallman,
-the developer of GNU CC.  Please join and add your name to the list.
-Membership dues in the League are $42 per year for programmers, managers
-and professionals; $10.50 for students; $21 for others.
-
-   Activist members are especially important, but members who have no
-time to give are also important.  Surveys at major ACM conferences have
-indicated a vast majority of attendees agree with the League on both
-issues (interface copyrights and software patents).  If just ten percent
-of the programmers who agree with the League join the League, we will
-probably triumph.
-
-   To join, or for more information, send electronic mail to the
-address `lpf@uunet.uu.net' or write to:
-
-     League for Programming Freedom
-     1 Kendall Square #143
-     P.O. Box 9171
-     Cambridge, MA 02139
-
-   In addition to joining the League, here are some suggestions from the
-League for other things you can do to protect your freedom to write
-programs:
-
-   * Tell your friends and colleagues about this issue and how it
-     threatens to ruin the computer industry.
-
-   * Mention that you are a League member in your `.signature', and
-     mention the League's email address for inquiries.
-
-   * Ask the companies you consider working for or working with to make
-     statements against software monopolies, and give preference to
-     those that do.
-
-   * When employers ask you to sign contracts giving them copyright on
-     your work, insist on a clause saying they will not claim the
-     copyright covers imitating the interface.
-
-   * When employers ask you to sign contracts giving them patent rights,
-     insist on clauses saying they can use these rights only
-     defensively.  Don't rely on "company policy," since that can
-     change at any time; don't rely on an individual executive's
-     private word, since that person may be replaced.  Get a commitment
-     just as binding as the commitment they get from you.
-
-   * Write to Congress to explain the importance of these issues.
-
-          House Subcommittee on Intellectual Property
-          2137 Rayburn Bldg
-          Washington, DC 20515
-          
-          Senate Subcommittee on Patents, Trademarks and Copyrights
-          United States Senate
-          Washington, DC 20510
-
-     (These committees have received lots of mail already; let's give
-     them even more.)
-
-   Democracy means nothing if you don't use it.  Stand up and be
-counted!
-
diff --git a/gcc/gcc.info-27 b/gcc/gcc.info-27
deleted file mode 100644 (file)
index d486a64..0000000
+++ /dev/null
@@ -1,534 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Copying,  Next: Contributors,  Prev: Look and Feel,  Up: Top
-
-GNU GENERAL PUBLIC LICENSE
-**************************
-
-                         Version 2, June 1991
-
-     Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-     59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
-     
-     Everyone is permitted to copy and distribute verbatim copies
-     of this license document, but changing it is not allowed.
-
-Preamble
-========
-
-   The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-   When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it in
-new free programs; and that you know you can do these things.
-
-   To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-   For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-   We protect your rights with two steps: (1) copyright the software,
-and (2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-   Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-   Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-   The precise terms and conditions for copying, distribution and
-modification follow.
-
-    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains a
-     notice placed by the copyright holder saying it may be distributed
-     under the terms of this General Public License.  The "Program",
-     below, refers to any such program or work, and a "work based on
-     the Program" means either the Program or any derivative work under
-     copyright law: that is to say, a work containing the Program or a
-     portion of it, either verbatim or with modifications and/or
-     translated into another language.  (Hereinafter, translation is
-     included without limitation in the term "modification".)  Each
-     licensee is addressed as "you".
-
-     Activities other than copying, distribution and modification are
-     not covered by this License; they are outside its scope.  The act
-     of running the Program is not restricted, and the output from the
-     Program is covered only if its contents constitute a work based on
-     the Program (independent of having been made by running the
-     Program).  Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-     source code as you receive it, in any medium, provided that you
-     conspicuously and appropriately publish on each copy an appropriate
-     copyright notice and disclaimer of warranty; keep intact all the
-     notices that refer to this License and to the absence of any
-     warranty; and give any other recipients of the Program a copy of
-     this License along with the Program.
-
-     You may charge a fee for the physical act of transferring a copy,
-     and you may at your option offer warranty protection in exchange
-     for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-     of it, thus forming a work based on the Program, and copy and
-     distribute such modifications or work under the terms of Section 1
-     above, provided that you also meet all of these conditions:
-
-       a. You must cause the modified files to carry prominent notices
-          stating that you changed the files and the date of any change.
-
-       b. You must cause any work that you distribute or publish, that
-          in whole or in part contains or is derived from the Program
-          or any part thereof, to be licensed as a whole at no charge
-          to all third parties under the terms of this License.
-
-       c. If the modified program normally reads commands interactively
-          when run, you must cause it, when started running for such
-          interactive use in the most ordinary way, to print or display
-          an announcement including an appropriate copyright notice and
-          a notice that there is no warranty (or else, saying that you
-          provide a warranty) and that users may redistribute the
-          program under these conditions, and telling the user how to
-          view a copy of this License.  (Exception: if the Program
-          itself is interactive but does not normally print such an
-          announcement, your work based on the Program is not required
-          to print an announcement.)
-
-     These requirements apply to the modified work as a whole.  If
-     identifiable sections of that work are not derived from the
-     Program, and can be reasonably considered independent and separate
-     works in themselves, then this License, and its terms, do not
-     apply to those sections when you distribute them as separate
-     works.  But when you distribute the same sections as part of a
-     whole which is a work based on the Program, the distribution of
-     the whole must be on the terms of this License, whose permissions
-     for other licensees extend to the entire whole, and thus to each
-     and every part regardless of who wrote it.
-
-     Thus, it is not the intent of this section to claim rights or
-     contest your rights to work written entirely by you; rather, the
-     intent is to exercise the right to control the distribution of
-     derivative or collective works based on the Program.
-
-     In addition, mere aggregation of another work not based on the
-     Program with the Program (or with a work based on the Program) on
-     a volume of a storage or distribution medium does not bring the
-     other work under the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-     under Section 2) in object code or executable form under the terms
-     of Sections 1 and 2 above provided that you also do one of the
-     following:
-
-       a. Accompany it with the complete corresponding machine-readable
-          source code, which must be distributed under the terms of
-          Sections 1 and 2 above on a medium customarily used for
-          software interchange; or,
-
-       b. Accompany it with a written offer, valid for at least three
-          years, to give any third party, for a charge no more than your
-          cost of physically performing source distribution, a complete
-          machine-readable copy of the corresponding source code, to be
-          distributed under the terms of Sections 1 and 2 above on a
-          medium customarily used for software interchange; or,
-
-       c. Accompany it with the information you received as to the offer
-          to distribute corresponding source code.  (This alternative is
-          allowed only for noncommercial distribution and only if you
-          received the program in object code or executable form with
-          such an offer, in accord with Subsection b above.)
-
-     The source code for a work means the preferred form of the work for
-     making modifications to it.  For an executable work, complete
-     source code means all the source code for all modules it contains,
-     plus any associated interface definition files, plus the scripts
-     used to control compilation and installation of the executable.
-     However, as a special exception, the source code distributed need
-     not include anything that is normally distributed (in either
-     source or binary form) with the major components (compiler,
-     kernel, and so on) of the operating system on which the executable
-     runs, unless that component itself accompanies the executable.
-
-     If distribution of executable or object code is made by offering
-     access to copy from a designated place, then offering equivalent
-     access to copy the source code from the same place counts as
-     distribution of the source code, even though third parties are not
-     compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-     except as expressly provided under this License.  Any attempt
-     otherwise to copy, modify, sublicense or distribute the Program is
-     void, and will automatically terminate your rights under this
-     License.  However, parties who have received copies, or rights,
-     from you under this License will not have their licenses
-     terminated so long as such parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-     signed it.  However, nothing else grants you permission to modify
-     or distribute the Program or its derivative works.  These actions
-     are prohibited by law if you do not accept this License.
-     Therefore, by modifying or distributing the Program (or any work
-     based on the Program), you indicate your acceptance of this
-     License to do so, and all its terms and conditions for copying,
-     distributing or modifying the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-     Program), the recipient automatically receives a license from the
-     original licensor to copy, distribute or modify the Program
-     subject to these terms and conditions.  You may not impose any
-     further restrictions on the recipients' exercise of the rights
-     granted herein.  You are not responsible for enforcing compliance
-     by third parties to this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-     infringement or for any other reason (not limited to patent
-     issues), conditions are imposed on you (whether by court order,
-     agreement or otherwise) that contradict the conditions of this
-     License, they do not excuse you from the conditions of this
-     License.  If you cannot distribute so as to satisfy simultaneously
-     your obligations under this License and any other pertinent
-     obligations, then as a consequence you may not distribute the
-     Program at all.  For example, if a patent license would not permit
-     royalty-free redistribution of the Program by all those who
-     receive copies directly or indirectly through you, then the only
-     way you could satisfy both it and this License would be to refrain
-     entirely from distribution of the Program.
-
-     If any portion of this section is held invalid or unenforceable
-     under any particular circumstance, the balance of the section is
-     intended to apply and the section as a whole is intended to apply
-     in other circumstances.
-
-     It is not the purpose of this section to induce you to infringe any
-     patents or other property right claims or to contest validity of
-     any such claims; this section has the sole purpose of protecting
-     the integrity of the free software distribution system, which is
-     implemented by public license practices.  Many people have made
-     generous contributions to the wide range of software distributed
-     through that system in reliance on consistent application of that
-     system; it is up to the author/donor to decide if he or she is
-     willing to distribute software through any other system and a
-     licensee cannot impose that choice.
-
-     This section is intended to make thoroughly clear what is believed
-     to be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-     certain countries either by patents or by copyrighted interfaces,
-     the original copyright holder who places the Program under this
-     License may add an explicit geographical distribution limitation
-     excluding those countries, so that distribution is permitted only
-     in or among countries not thus excluded.  In such case, this
-     License incorporates the limitation as if written in the body of
-     this License.
-
-  9. The Free Software Foundation may publish revised and/or new
-     versions of the General Public License from time to time.  Such
-     new versions will be similar in spirit to the present version, but
-     may differ in detail to address new problems or concerns.
-
-     Each version is given a distinguishing version number.  If the
-     Program specifies a version number of this License which applies
-     to it and "any later version", you have the option of following
-     the terms and conditions either of that version or of any later
-     version published by the Free Software Foundation.  If the Program
-     does not specify a version number of this License, you may choose
-     any version ever published by the Free Software Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-     programs whose distribution conditions are different, write to the
-     author to ask for permission.  For software which is copyrighted
-     by the Free Software Foundation, write to the Free Software
-     Foundation; we sometimes make exceptions for this.  Our decision
-     will be guided by the two goals of preserving the free status of
-     all derivatives of our free software and of promoting the sharing
-     and reuse of software generally.
-
-                                NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
-     WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
-     LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-     HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT
-     WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT
-     NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-     FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS TO THE
-     QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-     PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
-     SERVICING, REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-     WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY
-     MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE
-     LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
-     INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
-     INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-     DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU
-     OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY
-     OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
-     ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-                      END OF TERMS AND CONDITIONS
-
-How to Apply These Terms to Your New Programs
-=============================================
-
-   If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these
-terms.
-
-   To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-     ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES.
-     Copyright (C) 19YY  NAME OF AUTHOR
-     
-     This program 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 of the License, or
-     (at your option) any later version.
-     
-     This program 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 program; if not, write to the Free Software
-     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-   Also add information on how to contact you by electronic and paper
-mail.
-
-   If the program is interactive, make it output a short notice like
-this when it starts in an interactive mode:
-
-     Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR
-     Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
-     type `show w'.
-     This is free software, and you are welcome to redistribute it
-     under certain conditions; type `show c' for details.
-
-   The hypothetical commands `show w' and `show c' should show the
-appropriate parts of the General Public License.  Of course, the
-commands you use may be called something other than `show w' and `show
-c'; they could even be mouse-clicks or menu items--whatever suits your
-program.
-
-   You should also get your employer (if you work as a programmer) or
-your school, if any, to sign a "copyright disclaimer" for the program,
-if necessary.  Here is a sample; alter the names:
-
-     Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-     `Gnomovision' (which makes passes at compilers) written by James Hacker.
-     
-     SIGNATURE OF TY COON, 1 April 1989
-     Ty Coon, President of Vice
-
-   This General Public License does not permit incorporating your
-program into proprietary programs.  If your program is a subroutine
-library, you may consider it more useful to permit linking proprietary
-applications with the library.  If this is what you want to do, use the
-GNU Library General Public License instead of this License.
-
-\1f
-File: gcc.info,  Node: Contributors,  Next: Index,  Prev: Copying,  Up: Top
-
-Contributors to GNU CC
-**********************
-
-   In addition to Richard Stallman, several people have written parts
-of GNU CC.
-
-   * The idea of using RTL and some of the optimization ideas came from
-     the program PO written at the University of Arizona by Jack
-     Davidson and Christopher Fraser.  See "Register Allocation and
-     Exhaustive Peephole Optimization", Software Practice and
-     Experience 14 (9), Sept. 1984, 857-866.
-
-   * Paul Rubin wrote most of the preprocessor.
-
-   * Leonard Tower wrote parts of the parser, RTL generator, and RTL
-     definitions, and of the Vax machine description.
-
-   * Ted Lemon wrote parts of the RTL reader and printer.
-
-   * Jim Wilson implemented loop strength reduction and some other loop
-     optimizations.
-
-   * Nobuyuki Hikichi of Software Research Associates, Tokyo,
-     contributed the support for the Sony NEWS machine.
-
-   * Charles LaBrec contributed the support for the Integrated Solutions
-     68020 system.
-
-   * Michael Tiemann of Cygnus Support wrote the front end for C++, as
-     well as the support for inline functions and instruction
-     scheduling.  Also the descriptions of the National Semiconductor
-     32000 series cpu, the SPARC cpu and part of the Motorola 88000 cpu.
-
-   * Gerald Baumgartner added the signature extension to the C++
-     front-end.
-
-   * Jan Stein of the Chalmers Computer Society provided support for
-     Genix, as well as part of the 32000 machine description.
-
-   * Randy Smith finished the Sun FPA support.
-
-   * Robert Brown implemented the support for Encore 32000 systems.
-
-   * David Kashtan of SRI adapted GNU CC to VMS.
-
-   * Alex Crain provided changes for the 3b1.
-
-   * Greg Satz and Chris Hanson assisted in making GNU CC work on HP-UX
-     for the 9000 series 300.
-
-   * William Schelter did most of the work on the Intel 80386 support.
-
-   * Christopher Smith did the port for Convex machines.
-
-   * Paul Petersen wrote the machine description for the Alliant FX/8.
-
-   * Dario Dariol contributed the four varieties of sample programs
-     that print a copy of their source.
-
-   * Alain Lichnewsky ported GNU CC to the Mips cpu.
-
-   * Devon Bowen, Dale Wiles and Kevin Zachmann ported GNU CC to the
-     Tahoe.
-
-   * Jonathan Stone wrote the machine description for the Pyramid
-     computer.
-
-   * Gary Miller ported GNU CC to Charles River Data Systems machines.
-
-   * Richard Kenner of the New York University Ultracomputer Research
-     Laboratory wrote the machine descriptions for the AMD 29000, the
-     DEC Alpha, the IBM RT PC, and the IBM RS/6000 as well as the
-     support for instruction attributes.  He also made changes to
-     better support RISC processors including changes to common
-     subexpression elimination, strength reduction, function calling
-     sequence handling, and condition code support, in addition to
-     generalizing the code for frame pointer elimination.
-
-   * Richard Kenner and Michael Tiemann jointly developed reorg.c, the
-     delay slot scheduler.
-
-   * Mike Meissner and Tom Wood of Data General finished the port to the
-     Motorola 88000.
-
-   * Masanobu Yuhara of Fujitsu Laboratories implemented the machine
-     description for the Tron architecture (specifically, the Gmicro).
-
-   * NeXT, Inc. donated the front end that supports the Objective C
-     language.
-
-   * James van Artsdalen wrote the code that makes efficient use of the
-     Intel 80387 register stack.
-
-   * Mike Meissner at the Open Software Foundation finished the port to
-     the MIPS cpu, including adding ECOFF debug support, and worked on
-     the Intel port for the Intel 80386 cpu.  Later at Cygnus Support,
-     he worked on the rs6000 and PowerPC ports.
-
-   * Ron Guilmette implemented the `protoize' and `unprotoize' tools,
-     the support for Dwarf symbolic debugging information, and much of
-     the support for System V Release 4.  He has also worked heavily on
-     the Intel 386 and 860 support.
-
-   * Torbjorn Granlund implemented multiply- and divide-by-constant
-     optimization, improved long long support, and improved leaf
-     function register allocation.
-
-   * Mike Stump implemented the support for Elxsi 64 bit CPU.
-
-   * John Wehle added the machine description for the Western Electric
-     32000 processor used in several 3b series machines (no relation to
-     the National Semiconductor 32000 processor).
-
-   * Holger Teutsch provided the support for the Clipper cpu.
-
-   * Kresten Krab Thorup wrote the run time support for the Objective C
-     language.
-
-   * Stephen Moshier contributed the floating point emulator that
-     assists in cross-compilation and permits support for floating
-     point numbers wider than 64 bits.
-
-   * David Edelsohn contributed the changes to RS/6000 port to make it
-     support the PowerPC and POWER2 architectures.
-
-   * Steve Chamberlain wrote the support for the Hitachi SH processor.
-
-   * Peter Schauer wrote the code to allow debugging to work on the
-     Alpha.
-
-   * Oliver M. Kellogg of Deutsche Aerospace contributed the port to the
-     MIL-STD-1750A.
-
-   * Michael K. Gschwind contributed the port to the PDP-11.
-
-   * David Reese of Sun Microsystems contributed to the Solaris on
-     PowerPC port.
-
diff --git a/gcc/gcc.info-28 b/gcc/gcc.info-28
deleted file mode 100644 (file)
index c90dd64..0000000
+++ /dev/null
@@ -1,2030 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Index,  Prev: Contributors,  Up: Top
-
-Index
-*****
-
-* Menu:
-
-* ! in constraint:                       Multi-Alternative.
-* # in constraint:                       Modifiers.
-* # in template:                         Output Template.
-* #pragma:                               Misc.
-* #pragma implementation, implied:       C++ Interface.
-* #pragma, reason for not using:         Function Attributes.
-* $:                                     Dollar Signs.
-* % in constraint:                       Modifiers.
-* % in template:                         Output Template.
-* & in constraint:                       Modifiers.
-* ':                                     Incompatibilities.
-* (nil):                                 RTL Objects.
-* * in constraint:                       Modifiers.
-* * in template:                         Output Statement.
-* + in constraint:                       Modifiers.
-* -lgcc, use with -nodefaultlibs:        Link Options.
-* -lgcc, use with -nostdlib:             Link Options.
-* -nodefaultlibs and unresolved references: Link Options.
-* -nostdlib and unresolved references:   Link Options.
-* .sdata/.sdata2 references (PowerPC):   RS/6000 and PowerPC Options.
-* //:                                    C++ Comments.
-* /i in RTL dump:                        Flags.
-* /s in RTL dump:                        Flags.
-* /u in RTL dump:                        Flags.
-* /v in RTL dump:                        Flags.
-* 0 in constraint:                       Simple Constraints.
-* < in constraint:                       Simple Constraints.
-* <?:                                    Min and Max.
-* = in constraint:                       Modifiers.
-* > in constraint:                       Simple Constraints.
-* >?:                                    Min and Max.
-* ? in constraint:                       Multi-Alternative.
-* ?: extensions <1>:                     Conditionals.
-* ?: extensions:                         Lvalues.
-* ?: side effect:                        Conditionals.
-* \:                                     Output Template.
-* _ in variables in macros:              Naming Types.
-* __bb:                                  Profiling.
-* __bb_init_func:                        Profiling.
-* __bb_init_trace_func:                  Profiling.
-* __bb_trace_func:                       Profiling.
-* __bb_trace_ret:                        Profiling.
-* __builtin_apply:                       Constructing Calls.
-* __builtin_apply_args:                  Constructing Calls.
-* __builtin_args_info:                   Varargs.
-* __builtin_classify_type:               Varargs.
-* __builtin_next_arg:                    Varargs.
-* __builtin_return:                      Constructing Calls.
-* __builtin_saveregs:                    Varargs.
-* __CTOR_LIST__:                         Initialization.
-* __DTOR_LIST__:                         Initialization.
-* __main:                                Collect2.
-* abort <1>:                             Portability.
-* abort:                                 C Dialect Options.
-* abs <1>:                               Arithmetic.
-* abs:                                   C Dialect Options.
-* abs and attributes:                    Expressions.
-* absM2 instruction pattern:             Standard Names.
-* absolute value:                        Arithmetic.
-* access to operands:                    Accessors.
-* accessors:                             Accessors.
-* ACCUMULATE_OUTGOING_ARGS:              Stack Arguments.
-* ACCUMULATE_OUTGOING_ARGS and stack frames: Function Entry.
-* ADDITIONAL_REGISTER_NAMES:             Instruction Output.
-* addM3 instruction pattern:             Standard Names.
-* addr_diff_vec:                         Side Effects.
-* addr_diff_vec, length of:              Insn Lengths.
-* addr_vec:                              Side Effects.
-* addr_vec, length of:                   Insn Lengths.
-* address:                               RTL Template.
-* address constraints:                   Simple Constraints.
-* address of a label:                    Labels as Values.
-* ADDRESS_COST:                          Costs.
-* address_operand:                       Simple Constraints.
-* addressing modes:                      Addressing Modes.
-* addressof:                             Regs and Memory.
-* ADJUST_COST:                           Costs.
-* ADJUST_FIELD_ALIGN:                    Storage Layout.
-* ADJUST_INSN_LENGTH:                    Insn Lengths.
-* ADJUST_PRIORITY:                       Costs.
-* aggregates as return values:           Aggregate Return.
-* alias attribute:                       Function Attributes.
-* aligned attribute <1>:                 Type Attributes.
-* aligned attribute:                     Variable Attributes.
-* alignment:                             Alignment.
-* ALL_REGS:                              Register Classes.
-* Alliant:                               Interoperation.
-* alloca:                                C Dialect Options.
-* alloca and SunOS:                      Installation.
-* alloca vs variable-length arrays:      Variable Length.
-* alloca, for SunOS:                     Sun Install.
-* alloca, for Unos:                      Configurations.
-* allocate_stack instruction pattern:    Standard Names.
-* ALLOCATE_TRAMPOLINE:                   Trampolines.
-* alternate keywords:                    Alternate Keywords.
-* AMD29K options:                        AMD29K Options.
-* analysis, data flow:                   Passes.
-* and:                                   Arithmetic.
-* and and attributes:                    Expressions.
-* and, canonicalization of:              Insn Canonicalizations.
-* andM3 instruction pattern:             Standard Names.
-* ANSI support:                          C Dialect Options.
-* apostrophes:                           Incompatibilities.
-* APPLY_RESULT_SIZE:                     Scalar Return.
-* ARG_POINTER_REGNUM:                    Frame Registers.
-* ARG_POINTER_REGNUM and virtual registers: Regs and Memory.
-* arg_pointer_rtx:                       Frame Registers.
-* ARGS_GROW_DOWNWARD:                    Frame Layout.
-* argument passing:                      Interface.
-* arguments in frame (88k):              M88K Options.
-* arguments in registers:                Register Arguments.
-* arguments on stack:                    Stack Arguments.
-* arithmetic libraries:                  Interface.
-* arithmetic shift:                      Arithmetic.
-* arithmetic simplifications:            Passes.
-* arithmetic, in RTL:                    Arithmetic.
-* ARM options:                           ARM Options.
-* arrays of length zero:                 Zero Length.
-* arrays of variable length:             Variable Length.
-* arrays, non-lvalue:                    Subscripting.
-* ashift:                                Arithmetic.
-* ashift and attributes:                 Expressions.
-* ashiftrt:                              Arithmetic.
-* ashiftrt and attributes:               Expressions.
-* ashlM3 instruction pattern:            Standard Names.
-* ashrM3 instruction pattern:            Standard Names.
-* asm expressions:                       Extended Asm.
-* ASM_APP_OFF:                           File Framework.
-* ASM_APP_ON:                            File Framework.
-* ASM_BYTE_OP:                           Data Output.
-* ASM_CLOSE_PAREN:                       Data Output.
-* ASM_COMMENT_START:                     File Framework.
-* ASM_DECLARE_FUNCTION_NAME:             Label Output.
-* ASM_DECLARE_FUNCTION_SIZE:             Label Output.
-* ASM_DECLARE_OBJECT_NAME:               Label Output.
-* ASM_FILE_END:                          File Framework.
-* ASM_FILE_START:                        File Framework.
-* ASM_FINAL_SPEC:                        Driver.
-* ASM_FINISH_DECLARE_OBJECT:             Label Output.
-* ASM_FORMAT_PRIVATE_NAME:               Label Output.
-* asm_fprintf:                           Instruction Output.
-* ASM_GENERATE_INTERNAL_LABEL:           Label Output.
-* ASM_GLOBALIZE_LABEL:                   Label Output.
-* ASM_IDENTIFY_GCC:                      File Framework.
-* asm_input:                             Side Effects.
-* ASM_NO_SKIP_IN_TEXT:                   Alignment Output.
-* asm_noperands:                         Insns.
-* ASM_OPEN_PAREN:                        Data Output.
-* asm_operands, RTL sharing:             Sharing.
-* asm_operands, usage:                   Assembler.
-* ASM_OUTPUT_ADDR_DIFF_ELT:              Dispatch Tables.
-* ASM_OUTPUT_ADDR_VEC_ELT:               Dispatch Tables.
-* ASM_OUTPUT_ALIGN:                      Alignment Output.
-* ASM_OUTPUT_ALIGN_CODE:                 Alignment Output.
-* ASM_OUTPUT_ALIGNED_BSS:                Uninitialized Data.
-* ASM_OUTPUT_ALIGNED_COMMON:             Uninitialized Data.
-* ASM_OUTPUT_ALIGNED_DECL_COMMON:        Uninitialized Data.
-* ASM_OUTPUT_ALIGNED_DECL_LOCAL:         Uninitialized Data.
-* ASM_OUTPUT_ALIGNED_LOCAL:              Uninitialized Data.
-* ASM_OUTPUT_ASCII:                      Data Output.
-* ASM_OUTPUT_BSS:                        Uninitialized Data.
-* ASM_OUTPUT_BYTE:                       Data Output.
-* ASM_OUTPUT_CASE_END:                   Dispatch Tables.
-* ASM_OUTPUT_CASE_LABEL:                 Dispatch Tables.
-* ASM_OUTPUT_CHAR:                       Data Output.
-* ASM_OUTPUT_COMMON:                     Uninitialized Data.
-* ASM_OUTPUT_CONSTRUCTOR:                Macros for Initialization.
-* ASM_OUTPUT_DEF:                        Label Output.
-* ASM_OUTPUT_DESTRUCTOR:                 Macros for Initialization.
-* ASM_OUTPUT_DOUBLE:                     Data Output.
-* ASM_OUTPUT_DOUBLE_INT:                 Data Output.
-* ASM_OUTPUT_EH_REGION_BEG:              Exception Region Output.
-* ASM_OUTPUT_EH_REGION_END:              Exception Region Output.
-* ASM_OUTPUT_EXTERNAL:                   Label Output.
-* ASM_OUTPUT_EXTERNAL_LIBCALL:           Label Output.
-* ASM_OUTPUT_FLOAT:                      Data Output.
-* ASM_OUTPUT_IDENT:                      File Framework.
-* ASM_OUTPUT_INT:                        Data Output.
-* ASM_OUTPUT_INTERNAL_LABEL:             Label Output.
-* ASM_OUTPUT_LABEL:                      Label Output.
-* ASM_OUTPUT_LABELREF:                   Label Output.
-* ASM_OUTPUT_LOCAL:                      Uninitialized Data.
-* ASM_OUTPUT_LONG_DOUBLE:                Data Output.
-* ASM_OUTPUT_LOOP_ALIGN:                 Alignment Output.
-* ASM_OUTPUT_MI_THUNK:                   Function Entry.
-* ASM_OUTPUT_OPCODE:                     Instruction Output.
-* ASM_OUTPUT_POOL_EPILOGUE:              Data Output.
-* ASM_OUTPUT_POOL_PROLOGUE:              Data Output.
-* ASM_OUTPUT_QUADRUPLE_INT:              Data Output.
-* ASM_OUTPUT_REG_POP:                    Instruction Output.
-* ASM_OUTPUT_REG_PUSH:                   Instruction Output.
-* ASM_OUTPUT_SECTION_NAME:               File Framework.
-* ASM_OUTPUT_SHARED_BSS:                 Uninitialized Data.
-* ASM_OUTPUT_SHARED_COMMON:              Uninitialized Data.
-* ASM_OUTPUT_SHARED_LOCAL:               Uninitialized Data.
-* ASM_OUTPUT_SHORT:                      Data Output.
-* ASM_OUTPUT_SKIP:                       Alignment Output.
-* ASM_OUTPUT_SOURCE_FILENAME:            File Framework.
-* ASM_OUTPUT_SOURCE_LINE:                File Framework.
-* ASM_OUTPUT_SPECIAL_POOL_ENTRY:         Data Output.
-* ASM_OUTPUT_WEAK_ALIAS:                 Label Output.
-* ASM_SPEC:                              Driver.
-* ASM_STABD_OP:                          DBX Options.
-* ASM_STABN_OP:                          DBX Options.
-* ASM_STABS_OP:                          DBX Options.
-* ASM_WEAKEN_LABEL:                      Label Output.
-* assemble_name:                         Label Output.
-* assembler format:                      File Framework.
-* assembler instructions:                Extended Asm.
-* assembler instructions in RTL:         Assembler.
-* assembler names for identifiers:       Asm Labels.
-* assembler syntax, 88k:                 M88K Options.
-* ASSEMBLER_DIALECT:                     Instruction Output.
-* assembly code, invalid:                Bug Criteria.
-* assigning attribute values to insns:   Tagging Insns.
-* asterisk in template:                  Output Statement.
-* atof:                                  Cross-compilation.
-* attr:                                  Tagging Insns.
-* attr_flag:                             Expressions.
-* attribute expressions:                 Expressions.
-* attribute of types:                    Type Attributes.
-* attribute of variables:                Variable Attributes.
-* attribute specifications:              Attr Example.
-* attribute specifications example:      Attr Example.
-* attributes, defining:                  Defining Attributes.
-* autoincrement addressing, availability: Portability.
-* autoincrement/decrement addressing:    Simple Constraints.
-* autoincrement/decrement analysis:      Passes.
-* automatic inline for C++ member fns:   Inline.
-* backslash:                             Output Template.
-* backtrace for bug reports:             Bug Reporting.
-* barrier:                               Insns.
-* BASE_REG_CLASS:                        Register Classes.
-* basic blocks:                          Passes.
-* bcmp:                                  Config.
-* bCOND instruction pattern:             Standard Names.
-* bcopy, implicit usage:                 Library Calls.
-* BIGGEST_ALIGNMENT:                     Storage Layout.
-* BIGGEST_FIELD_ALIGNMENT:               Storage Layout.
-* Bison parser generator:                Installation.
-* bit fields:                            Bit Fields.
-* bit shift overflow (88k):              M88K Options.
-* BITFIELD_NBYTES_LIMITED:               Storage Layout.
-* BITS_BIG_ENDIAN:                       Storage Layout.
-* BITS_BIG_ENDIAN, effect on sign_extract: Bit Fields.
-* BITS_PER_UNIT:                         Storage Layout.
-* BITS_PER_WORD:                         Storage Layout.
-* bitwise complement:                    Arithmetic.
-* bitwise exclusive-or:                  Arithmetic.
-* bitwise inclusive-or:                  Arithmetic.
-* bitwise logical-and:                   Arithmetic.
-* BLKmode:                               Machine Modes.
-* BLKmode, and function return values:   Calls.
-* BLOCK_PROFILER:                        Profiling.
-* BLOCK_PROFILER_CODE:                   Profiling.
-* BRANCH_COST:                           Costs.
-* break_out_memory_refs:                 Addressing Modes.
-* BSS_SECTION_ASM_OP:                    Sections.
-* bug criteria:                          Bug Criteria.
-* bug report mailing lists:              Bug Lists.
-* bugs:                                  Bugs.
-* bugs, known:                           Trouble.
-* builtin functions:                     C Dialect Options.
-* byte writes (29k):                     AMD29K Options.
-* byte_mode:                             Machine Modes.
-* BYTES_BIG_ENDIAN:                      Storage Layout.
-* bzero:                                 Config.
-* bzero, implicit usage:                 Library Calls.
-* C compilation options:                 Invoking GCC.
-* C intermediate output, nonexistent:    G++ and GCC.
-* C language extensions:                 C Extensions.
-* C language, traditional:               C Dialect Options.
-* C statements for assembler output:     Output Statement.
-* c++:                                   Invoking G++.
-* C++:                                   G++ and GCC.
-* C++ comments:                          C++ Comments.
-* C++ compilation options:               Invoking GCC.
-* C++ interface and implementation headers: C++ Interface.
-* C++ language extensions:               C++ Extensions.
-* C++ member fns, automatically inline:  Inline.
-* C++ misunderstandings:                 C++ Misunderstandings.
-* C++ named return value:                Naming Results.
-* C++ options, command line:             C++ Dialect Options.
-* C++ pragmas, effect on inlining:       C++ Interface.
-* C++ signatures:                        C++ Signatures.
-* C++ source file suffixes:              Invoking G++.
-* C++ static data, declaring and defining: Static Definitions.
-* C++ subtype polymorphism:              C++ Signatures.
-* C++ type abstraction:                  C++ Signatures.
-* C_INCLUDE_PATH:                        Environment Variables.
-* call:                                  Side Effects.
-* call instruction pattern:              Standard Names.
-* call usage:                            Calls.
-* call-clobbered register:               Register Basics.
-* call-saved register:                   Register Basics.
-* call-used register:                    Register Basics.
-* call_insn:                             Insns.
-* call_insn and /u:                      Flags.
-* CALL_INSN_FUNCTION_USAGE:              Insns.
-* call_pop instruction pattern:          Standard Names.
-* CALL_USED_REGISTERS:                   Register Basics.
-* call_used_regs:                        Register Basics.
-* call_value instruction pattern:        Standard Names.
-* call_value_pop instruction pattern:    Standard Names.
-* CALLER_SAVE_PROFITABLE:                Caller Saves.
-* calling conventions:                   Stack and Calling.
-* calling functions in RTL:              Calls.
-* calling functions through the function vector on the H8/300 processors: Function Attributes.
-* CAN_DEBUG_WITHOUT_FP:                  Run-time Target.
-* CAN_ELIMINATE:                         Elimination.
-* canonicalization of instructions:      Insn Canonicalizations.
-* CANONICALIZE_COMPARISON:               Condition Code.
-* canonicalize_funcptr_for_compare instruction pattern: Standard Names.
-* case labels in initializers:           Labeled Elements.
-* case ranges:                           Case Ranges.
-* case sensitivity and VMS:              VMS Misc.
-* CASE_DROPS_THROUGH:                    Misc.
-* CASE_VALUES_THRESHOLD:                 Misc.
-* CASE_VECTOR_MODE:                      Misc.
-* CASE_VECTOR_PC_RELATIVE:               Misc.
-* casesi instruction pattern:            Standard Names.
-* cast to a union:                       Cast to Union.
-* casts as lvalues:                      Lvalues.
-* CC:                                    Host Fragment.
-* cc0:                                   Regs and Memory.
-* cc0, RTL sharing:                      Sharing.
-* cc0_rtx:                               Regs and Memory.
-* CC1_SPEC:                              Driver.
-* CC1PLUS_SPEC:                          Driver.
-* cc_status:                             Condition Code.
-* CC_STATUS_MDEP:                        Condition Code.
-* CC_STATUS_MDEP_INIT:                   Condition Code.
-* CCmode:                                Machine Modes.
-* CDImode:                               Machine Modes.
-* change_address:                        Standard Names.
-* CHAR_TYPE_SIZE:                        Type Layout.
-* CHECK_FLOAT_VALUE:                     Storage Layout.
-* check_stack instruction pattern:       Standard Names.
-* CHImode:                               Machine Modes.
-* class definitions, register:           Register Classes.
-* class preference constraints:          Class Preferences.
-* CLASS_LIKELY_SPILLED_P:                Register Classes.
-* CLASS_MAX_NREGS:                       Register Classes.
-* classes of RTX codes:                  Accessors.
-* CLEAR_INSN_CACHE:                      Trampolines.
-* CLIB:                                  Host Fragment.
-* clobber:                               Side Effects.
-* clrstrM instruction pattern:           Standard Names.
-* cmpM instruction pattern:              Standard Names.
-* cmpstrM instruction pattern:           Standard Names.
-* code generation conventions:           Code Gen Options.
-* code generation RTL sequences:         Expander Definitions.
-* code motion:                           Passes.
-* code_label:                            Insns.
-* code_label and /i:                     Flags.
-* CODE_LABEL_NUMBER:                     Insns.
-* codes, RTL expression:                 RTL Objects.
-* COImode:                               Machine Modes.
-* COLLECT_EXPORT_LIST:                   Config.
-* combiner pass:                         Regs and Memory.
-* command options:                       Invoking GCC.
-* comments, C++ style:                   C++ Comments.
-* common subexpression elimination:      Passes.
-* COMP_TYPE_ATTRIBUTES:                  Misc.
-* compare:                               Arithmetic.
-* compare, canonicalization of:          Insn Canonicalizations.
-* comparison of signed and unsigned values, warning: Warning Options.
-* compilation in a separate directory:   Other Dir.
-* compiler bugs, reporting:              Bug Reporting.
-* compiler compared to C++ preprocessor: G++ and GCC.
-* compiler options, C++:                 C++ Dialect Options.
-* compiler passes and files:             Passes.
-* compiler version, specifying:          Target Options.
-* COMPILER_PATH:                         Environment Variables.
-* complement, bitwise:                   Arithmetic.
-* complex numbers:                       Complex.
-* compound expressions as lvalues:       Lvalues.
-* computed gotos:                        Labels as Values.
-* computing the length of an insn:       Insn Lengths.
-* cond:                                  Comparisons.
-* cond and attributes:                   Expressions.
-* condition code register:               Regs and Memory.
-* condition code status:                 Condition Code.
-* condition codes:                       Comparisons.
-* conditional expressions as lvalues:    Lvalues.
-* conditional expressions, extensions:   Conditionals.
-* CONDITIONAL_REGISTER_USAGE:            Register Basics.
-* conditions, in patterns:               Patterns.
-* configuration file:                    Config.
-* configurations supported by GNU CC:    Configurations.
-* conflicting types:                     Disappointments.
-* const applied to function:             Function Attributes.
-* const function attribute:              Function Attributes.
-* CONST0_RTX:                            Constants.
-* const0_rtx:                            Constants.
-* CONST1_RTX:                            Constants.
-* const1_rtx:                            Constants.
-* CONST2_RTX:                            Constants.
-* const2_rtx:                            Constants.
-* CONST_CALL_P:                          Flags.
-* CONST_COSTS:                           Costs.
-* const_double:                          Constants.
-* const_double, RTL sharing:             Sharing.
-* CONST_DOUBLE_CHAIN:                    Constants.
-* CONST_DOUBLE_LOW:                      Constants.
-* CONST_DOUBLE_MEM:                      Constants.
-* CONST_DOUBLE_OK_FOR_LETTER_P:          Register Classes.
-* const_int:                             Constants.
-* const_int and attribute tests:         Expressions.
-* const_int and attributes:              Expressions.
-* const_int, RTL sharing:                Sharing.
-* CONST_OK_FOR_LETTER_P:                 Register Classes.
-* const_string:                          Constants.
-* const_string and attributes:           Expressions.
-* const_true_rtx:                        Constants.
-* constant attributes:                   Constant Attributes.
-* constant folding:                      Passes.
-* constant folding and floating point:   Cross-compilation.
-* constant propagation:                  Passes.
-* CONSTANT_ADDRESS_P:                    Addressing Modes.
-* CONSTANT_AFTER_FUNCTION_P:             Data Output.
-* CONSTANT_ALIGNMENT:                    Storage Layout.
-* CONSTANT_P:                            Addressing Modes.
-* CONSTANT_POOL_ADDRESS_P:               Flags.
-* CONSTANT_POOL_BEFORE_FUNCTION:         Data Output.
-* constants in constraints:              Simple Constraints.
-* constm1_rtx:                           Constants.
-* constraint modifier characters:        Modifiers.
-* constraint, matching:                  Simple Constraints.
-* constraints:                           Constraints.
-* constraints, machine specific:         Machine Constraints.
-* constructing calls:                    Constructing Calls.
-* constructor expressions:               Constructors.
-* constructor function attribute:        Function Attributes.
-* constructors vs goto:                  Destructors and Goto.
-* constructors, automatic calls:         Collect2.
-* constructors, output of:               Initialization.
-* contributors:                          Contributors.
-* controlling register usage:            Register Basics.
-* controlling the compilation driver:    Driver.
-* conventions, run-time:                 Interface.
-* conversions:                           Conversions.
-* Convex options:                        Convex Options.
-* copy_rtx_if_shared:                    Sharing.
-* core dump:                             Bug Criteria.
-* cos:                                   C Dialect Options.
-* costs of instructions:                 Costs.
-* COSTS_N_INSNS:                         Costs.
-* CPLUS_INCLUDE_PATH:                    Environment Variables.
-* CPP_PREDEFINES:                        Run-time Target.
-* CPP_SPEC:                              Driver.
-* CQImode:                               Machine Modes.
-* cross compilation and floating point:  Cross-compilation.
-* cross compiling:                       Target Options.
-* cross-compiler, installation:          Cross-Compiler.
-* cross-jumping:                         Passes.
-* CROSS_LIBGCC1:                         Target Fragment.
-* CRTSTUFF_T_CFLAGS:                     Target Fragment.
-* CRTSTUFF_T_CFLAGS_S:                   Target Fragment.
-* CSImode:                               Machine Modes.
-* CTImode:                               Machine Modes.
-* CUMULATIVE_ARGS:                       Register Arguments.
-* current_function_epilogue_delay_list:  Function Entry.
-* current_function_outgoing_args_size:   Stack Arguments.
-* current_function_pops_args:            Function Entry.
-* current_function_pretend_args_size:    Function Entry.
-* d in constraint:                       Simple Constraints.
-* data flow analysis:                    Passes.
-* DATA_ALIGNMENT:                        Storage Layout.
-* data_section:                          Sections.
-* DATA_SECTION_ASM_OP:                   Sections.
-* DBR_OUTPUT_SEQEND:                     Instruction Output.
-* dbr_sequence_length:                   Instruction Output.
-* DBX:                                   Interoperation.
-* DBX_BLOCKS_FUNCTION_RELATIVE:          DBX Options.
-* DBX_CONTIN_CHAR:                       DBX Options.
-* DBX_CONTIN_LENGTH:                     DBX Options.
-* DBX_DEBUGGING_INFO:                    DBX Options.
-* DBX_FUNCTION_FIRST:                    DBX Options.
-* DBX_LBRAC_FIRST:                       DBX Options.
-* DBX_MEMPARM_STABS_LETTER:              DBX Options.
-* DBX_NO_XREFS:                          DBX Options.
-* DBX_OUTPUT_ENUM:                       DBX Hooks.
-* DBX_OUTPUT_FUNCTION_END:               DBX Hooks.
-* DBX_OUTPUT_LBRAC:                      DBX Hooks.
-* DBX_OUTPUT_MAIN_SOURCE_DIRECTORY:      File Names and DBX.
-* DBX_OUTPUT_MAIN_SOURCE_FILE_END:       File Names and DBX.
-* DBX_OUTPUT_MAIN_SOURCE_FILENAME:       File Names and DBX.
-* DBX_OUTPUT_RBRAC:                      DBX Hooks.
-* DBX_OUTPUT_SOURCE_FILENAME:            File Names and DBX.
-* DBX_OUTPUT_STANDARD_TYPES:             DBX Hooks.
-* DBX_REGISTER_NUMBER:                   All Debuggers.
-* DBX_REGPARM_STABS_CODE:                DBX Options.
-* DBX_REGPARM_STABS_LETTER:              DBX Options.
-* DBX_STATIC_CONST_VAR_CODE:             DBX Options.
-* DBX_STATIC_STAB_DATA_SECTION:          DBX Options.
-* DBX_TYPE_DECL_STABS_CODE:              DBX Options.
-* DBX_USE_BINCL:                         DBX Options.
-* DBX_WORKING_DIRECTORY:                 File Names and DBX.
-* DCmode:                                Machine Modes.
-* De Morgan's law:                       Insn Canonicalizations.
-* dead code:                             Passes.
-* dead_or_set_p:                         Peephole Definitions.
-* deallocating variable length arrays:   Variable Length.
-* death notes:                           Obsolete Register Macros.
-* debug_rtx:                             Bug Reporting.
-* DEBUG_SYMS_TEXT:                       DBX Options.
-* DEBUGGER_ARG_OFFSET:                   All Debuggers.
-* DEBUGGER_AUTO_OFFSET:                  All Debuggers.
-* debugging information generation:      Passes.
-* debugging information options:         Debugging Options.
-* debugging, 88k OCS:                    M88K Options.
-* declaration scope:                     Incompatibilities.
-* declarations inside expressions:       Statement Exprs.
-* declarations, RTL:                     RTL Declarations.
-* declaring attributes of functions:     Function Attributes.
-* declaring static data in C++:          Static Definitions.
-* default implementation, signature member function: C++ Signatures.
-* DEFAULT_CALLER_SAVES:                  Caller Saves.
-* DEFAULT_GDB_EXTENSIONS:                DBX Options.
-* DEFAULT_MAIN_RETURN:                   Misc.
-* DEFAULT_PCC_STRUCT_RETURN:             Aggregate Return.
-* DEFAULT_SHORT_ENUMS:                   Type Layout.
-* DEFAULT_SIGNED_CHAR:                   Type Layout.
-* DEFAULT_VTABLE_THUNKS:                 Storage Layout.
-* define_asm_attributes:                 Tagging Insns.
-* define_attr:                           Defining Attributes.
-* define_delay:                          Delay Slots.
-* define_expand:                         Expander Definitions.
-* define_function_unit:                  Function Units.
-* define_insn:                           Patterns.
-* define_insn example:                   Example.
-* define_peephole:                       Expander Definitions.
-* define_split:                          Insn Splitting.
-* defining attributes and their values:  Defining Attributes.
-* defining jump instruction patterns:    Jump Patterns.
-* defining peephole optimizers:          Peephole Definitions.
-* defining RTL sequences for code generation: Expander Definitions.
-* defining static data in C++:           Static Definitions.
-* delay slots, defining:                 Delay Slots.
-* DELAY_SLOTS_FOR_EPILOGUE:              Function Entry.
-* delayed branch scheduling:             Passes.
-* dependencies for make as output:       Environment Variables.
-* dependencies, make:                    Preprocessor Options.
-* DEPENDENCIES_OUTPUT:                   Environment Variables.
-* Dependent Patterns:                    Dependent Patterns.
-* destructor function attribute:         Function Attributes.
-* destructors vs goto:                   Destructors and Goto.
-* destructors, output of:                Initialization.
-* detecting -traditional:                C Dialect Options.
-* DFmode:                                Machine Modes.
-* dialect options:                       C Dialect Options.
-* digits in constraint:                  Simple Constraints.
-* DImode:                                Machine Modes.
-* DIR_SEPARATOR:                         Config.
-* directory options:                     Directory Options.
-* disabling certain registers:           Register Basics.
-* dispatch table:                        Dispatch Tables.
-* div:                                   Arithmetic.
-* div and attributes:                    Expressions.
-* DIVDI3_LIBCALL:                        Library Calls.
-* divide instruction, 88k:               M88K Options.
-* division:                              Arithmetic.
-* divM3 instruction pattern:             Standard Names.
-* divmodM4 instruction pattern:          Standard Names.
-* DIVSI3_LIBCALL:                        Library Calls.
-* DOESNT_NEED_UNWINDER:                  Exception Region Output.
-* dollar signs in identifier names:      Dollar Signs.
-* DOLLARS_IN_IDENTIFIERS:                Misc.
-* DONE:                                  Expander Definitions.
-* DONT_REDUCE_ADDR:                      Costs.
-* double-word arithmetic:                Long Long.
-* DOUBLE_TYPE_SIZE:                      Type Layout.
-* downward funargs:                      Nested Functions.
-* driver:                                Driver.
-* DW bit (29k):                          AMD29K Options.
-* DWARF2_DEBUGGING_INFO:                 SDB and DWARF.
-* DWARF2_UNWIND_INFO:                    Exception Region Output.
-* DWARF_DEBUGGING_INFO:                  SDB and DWARF.
-* DYNAMIC_CHAIN_ADDRESS:                 Frame Layout.
-* E in constraint:                       Simple Constraints.
-* earlyclobber operand:                  Modifiers.
-* EASY_DIV_EXPR:                         Misc.
-* EDOM, implicit usage:                  Library Calls.
-* EH_FRAME_SECTION_ASM_OP:               Exception Region Output.
-* EH_TABLE_LOOKUP:                       Exception Region Output.
-* eight bit data on the H8/300 and H8/300H: Function Attributes.
-* ELIGIBLE_FOR_EPILOGUE_DELAY:           Function Entry.
-* ELIMINABLE_REGS:                       Elimination.
-* empty constraints:                     No Constraints.
-* EMPTY_FIELD_BOUNDARY:                  Storage Layout.
-* ENCODE_SECTION_INFO:                   Sections.
-* ENCODE_SECTION_INFO and address validation: Addressing Modes.
-* ENCODE_SECTION_INFO usage:             Instruction Output.
-* ENDFILE_SPEC:                          Driver.
-* endianness:                            Portability.
-* enum machine_mode:                     Machine Modes.
-* enum reg_class:                        Register Classes.
-* environment variables:                 Environment Variables.
-* epilogue:                              Function Entry.
-* EPILOGUE_USES:                         Function Entry.
-* eq:                                    Comparisons.
-* eq and attributes:                     Expressions.
-* eq_attr:                               Expressions.
-* equal:                                 Comparisons.
-* errno, implicit usage:                 Library Calls.
-* error messages:                        Warnings and Errors.
-* escape sequences, traditional:         C Dialect Options.
-* exception_receiver instruction pattern: Standard Names.
-* EXCEPTION_SECTION:                     Exception Region Output.
-* exclamation point:                     Multi-Alternative.
-* exclusive-or, bitwise:                 Arithmetic.
-* EXECUTABLE_SUFFIX:                     Config.
-* exit:                                  C Dialect Options.
-* exit status and VMS:                   VMS Misc.
-* EXIT_BODY:                             Misc.
-* EXIT_IGNORE_STACK:                     Function Entry.
-* EXPAND_BUILTIN_SAVEREGS:               Varargs.
-* expander definitions:                  Expander Definitions.
-* explicit register variables:           Explicit Reg Vars.
-* expr_list:                             Insns.
-* expression codes:                      RTL Objects.
-* expressions containing statements:     Statement Exprs.
-* expressions, compound, as lvalues:     Lvalues.
-* expressions, conditional, as lvalues:  Lvalues.
-* expressions, constructor:              Constructors.
-* extended asm:                          Extended Asm.
-* extendMN2 instruction pattern:         Standard Names.
-* extensible constraints:                Simple Constraints.
-* extensions, ?: <1>:                    Conditionals.
-* extensions, ?::                        Lvalues.
-* extensions, C language:                C Extensions.
-* extensions, C++ language:              C++ Extensions.
-* extern int target_flags:               Run-time Target.
-* external declaration scope:            Incompatibilities.
-* EXTRA_CC_MODES:                        Condition Code.
-* EXTRA_CC_NAMES:                        Condition Code.
-* EXTRA_CONSTRAINT:                      Register Classes.
-* EXTRA_SECTION_FUNCTIONS:               Sections.
-* EXTRA_SECTIONS:                        Sections.
-* EXTRA_SPECS:                           Driver.
-* extv instruction pattern:              Standard Names.
-* extzv instruction pattern:             Standard Names.
-* F in constraint:                       Simple Constraints.
-* fabs:                                  C Dialect Options.
-* FAIL:                                  Expander Definitions.
-* fatal signal:                          Bug Criteria.
-* FATAL_EXIT_CODE:                       Config.
-* features, optional, in system conventions: Run-time Target.
-* ffs <1>:                               Arithmetic.
-* ffs:                                   C Dialect Options.
-* ffsM2 instruction pattern:             Standard Names.
-* file name suffix:                      Overall Options.
-* file names:                            Link Options.
-* files and passes of the compiler:      Passes.
-* final pass:                            Passes.
-* FINAL_PRESCAN_INSN:                    Instruction Output.
-* FINAL_PRESCAN_LABEL:                   Instruction Output.
-* FINAL_REG_PARM_STACK_SPACE:            Stack Arguments.
-* final_scan_insn:                       Function Entry.
-* final_sequence:                        Instruction Output.
-* FINALIZE_PIC:                          PIC.
-* FIRST_INSN_ADDRESS:                    Insn Lengths.
-* FIRST_PARM_OFFSET:                     Frame Layout.
-* FIRST_PARM_OFFSET and virtual registers: Regs and Memory.
-* FIRST_PSEUDO_REGISTER:                 Register Basics.
-* FIRST_STACK_REG:                       Stack Registers.
-* FIRST_VIRTUAL_REGISTER:                Regs and Memory.
-* fix:                                   Conversions.
-* fix_truncMN2 instruction pattern:      Standard Names.
-* fixed register:                        Register Basics.
-* FIXED_REGISTERS:                       Register Basics.
-* fixed_regs:                            Register Basics.
-* fixMN2 instruction pattern:            Standard Names.
-* FIXUNS_TRUNC_LIKE_FIX_TRUNC:           Misc.
-* fixuns_truncMN2 instruction pattern:   Standard Names.
-* fixunsMN2 instruction pattern:         Standard Names.
-* flags in RTL expression:               Flags.
-* float:                                 Conversions.
-* float as function value type:          Incompatibilities.
-* FLOAT_ARG_TYPE:                        Library Calls.
-* float_extend:                          Conversions.
-* FLOAT_STORE_FLAG_VALUE:                Misc.
-* float_truncate:                        Conversions.
-* FLOAT_TYPE_SIZE:                       Type Layout.
-* FLOAT_VALUE_TYPE:                      Library Calls.
-* FLOAT_WORDS_BIG_ENDIAN:                Storage Layout.
-* FLOATIFY:                              Library Calls.
-* floating point and cross compilation:  Cross-compilation.
-* floating point precision <1>:          Disappointments.
-* floating point precision:              Optimize Options.
-* floatMN2 instruction pattern:          Standard Names.
-* floatunsMN2 instruction pattern:       Standard Names.
-* force_reg:                             Standard Names.
-* format function attribute:             Function Attributes.
-* format_arg function attribute:         Function Attributes.
-* forwarding calls:                      Constructing Calls.
-* frame layout:                          Frame Layout.
-* FRAME_GROWS_DOWNWARD:                  Frame Layout.
-* FRAME_GROWS_DOWNWARD and virtual registers: Regs and Memory.
-* frame_pointer_needed:                  Function Entry.
-* FRAME_POINTER_REGNUM:                  Frame Registers.
-* FRAME_POINTER_REGNUM and virtual registers: Regs and Memory.
-* FRAME_POINTER_REQUIRED:                Elimination.
-* frame_pointer_rtx:                     Frame Registers.
-* fscanf, and constant strings:          Incompatibilities.
-* ftruncM2 instruction pattern:          Standard Names.
-* function addressability on the M32R/D: Function Attributes.
-* function attributes:                   Function Attributes.
-* function call conventions:             Interface.
-* function entry and exit:               Function Entry.
-* function pointers, arithmetic:         Pointer Arith.
-* function prototype declarations:       Function Prototypes.
-* function units, for scheduling:        Function Units.
-* function, size of pointer to:          Pointer Arith.
-* function-call insns:                   Calls.
-* FUNCTION_ARG:                          Register Arguments.
-* FUNCTION_ARG_ADVANCE:                  Register Arguments.
-* FUNCTION_ARG_BOUNDARY:                 Register Arguments.
-* FUNCTION_ARG_CALLEE_COPIES:            Register Arguments.
-* FUNCTION_ARG_PADDING:                  Register Arguments.
-* FUNCTION_ARG_PARTIAL_NREGS:            Register Arguments.
-* FUNCTION_ARG_PASS_BY_REFERENCE:        Register Arguments.
-* FUNCTION_ARG_REGNO_P:                  Register Arguments.
-* FUNCTION_BLOCK_PROFILER:               Profiling.
-* FUNCTION_BLOCK_PROFILER_EXIT:          Profiling.
-* FUNCTION_BOUNDARY:                     Storage Layout.
-* FUNCTION_CONVERSION_BUG:               Config.
-* FUNCTION_EPILOGUE:                     Function Entry.
-* FUNCTION_EPILOGUE and trampolines:     Trampolines.
-* FUNCTION_INCOMING_ARG:                 Register Arguments.
-* FUNCTION_MODE:                         Misc.
-* FUNCTION_OUTGOING_VALUE:               Scalar Return.
-* FUNCTION_PROFILER:                     Profiling.
-* FUNCTION_PROLOGUE:                     Function Entry.
-* FUNCTION_PROLOGUE and trampolines:     Trampolines.
-* FUNCTION_VALUE:                        Scalar Return.
-* FUNCTION_VALUE_REGNO_P:                Scalar Return.
-* functions called via pointer on the RS/6000 and PowerPC: Function Attributes.
-* functions in arbitrary sections:       Function Attributes.
-* functions that are passed arguments in registers on the 386: Function Attributes.
-* functions that do not pop the argument stack on the 386: Function Attributes.
-* functions that do pop the argument stack on the 386: Function Attributes.
-* functions that have no side effects:   Function Attributes.
-* functions that never return:           Function Attributes.
-* functions that pop the argument stack on the 386: Function Attributes.
-* functions which are exported from a dll on PowerPC Windows NT: Function Attributes.
-* functions which are imported from a dll on PowerPC Windows NT: Function Attributes.
-* functions which specify exception handling on PowerPC Windows NT: Function Attributes.
-* functions with printf or scanf style arguments: Function Attributes.
-* functions, leaf:                       Leaf Functions.
-* g in constraint:                       Simple Constraints.
-* G in constraint:                       Simple Constraints.
-* g++:                                   Invoking G++.
-* G++:                                   G++ and GCC.
-* g++ 1.XX:                              Invoking G++.
-* g++ older version:                     Invoking G++.
-* g++, separate compiler:                Invoking G++.
-* GCC:                                   G++ and GCC.
-* GCC_EXEC_PREFIX:                       Environment Variables.
-* ge:                                    Comparisons.
-* ge and attributes:                     Expressions.
-* GEN_ERRNO_RTX:                         Library Calls.
-* gencodes:                              Passes.
-* genconfig:                             Passes.
-* general_operand:                       RTL Template.
-* GENERAL_REGS:                          Register Classes.
-* generalized lvalues:                   Lvalues.
-* generating assembler output:           Output Statement.
-* generating insns:                      RTL Template.
-* genflags:                              Passes.
-* genflags, crash on Sun 4:              Installation Problems.
-* get_attr:                              Expressions.
-* get_attr_length:                       Insn Lengths.
-* GET_CLASS_NARROWEST_MODE:              Machine Modes.
-* GET_CODE:                              RTL Objects.
-* get_frame_size:                        Elimination.
-* get_insns:                             Insns.
-* get_last_insn:                         Insns.
-* GET_MODE:                              Machine Modes.
-* GET_MODE_ALIGNMENT:                    Machine Modes.
-* GET_MODE_BITSIZE:                      Machine Modes.
-* GET_MODE_CLASS:                        Machine Modes.
-* GET_MODE_MASK:                         Machine Modes.
-* GET_MODE_NAME:                         Machine Modes.
-* GET_MODE_NUNITS:                       Machine Modes.
-* GET_MODE_SIZE:                         Machine Modes.
-* GET_MODE_UNIT_SIZE:                    Machine Modes.
-* GET_MODE_WIDER_MODE:                   Machine Modes.
-* GET_RTX_CLASS:                         Accessors.
-* GET_RTX_FORMAT:                        Accessors.
-* GET_RTX_LENGTH:                        Accessors.
-* geu:                                   Comparisons.
-* geu and attributes:                    Expressions.
-* GIV_SORT_CRITERION:                    Misc.
-* global offset table:                   Code Gen Options.
-* global register after longjmp:         Global Reg Vars.
-* global register allocation:            Passes.
-* global register variables:             Global Reg Vars.
-* GLOBALDEF:                             Global Declarations.
-* GLOBALREF:                             Global Declarations.
-* GLOBALVALUEDEF:                        Global Declarations.
-* GLOBALVALUEREF:                        Global Declarations.
-* GNU CC and portability:                Portability.
-* GNU CC command options:                Invoking GCC.
-* GO_IF_LEGITIMATE_ADDRESS:              Addressing Modes.
-* GO_IF_MODE_DEPENDENT_ADDRESS:          Addressing Modes.
-* goto in C++:                           Destructors and Goto.
-* goto with computed label:              Labels as Values.
-* gp-relative references (MIPS):         MIPS Options.
-* gprof:                                 Debugging Options.
-* greater than:                          Comparisons.
-* grouping options:                      Invoking GCC.
-* gt:                                    Comparisons.
-* gt and attributes:                     Expressions.
-* gtu:                                   Comparisons.
-* gtu and attributes:                    Expressions.
-* H in constraint:                       Simple Constraints.
-* HANDLE_PRAGMA:                         Misc.
-* hard registers:                        Regs and Memory.
-* HARD_FRAME_POINTER_REGNUM:             Frame Registers.
-* HARD_REGNO_MODE_OK:                    Values in Registers.
-* HARD_REGNO_NREGS:                      Values in Registers.
-* hardware models and configurations, specifying: Submodel Options.
-* HAS_INIT_SECTION:                      Macros for Initialization.
-* HAVE_ATEXIT:                           Misc.
-* HAVE_POPEN:                            Config.
-* HAVE_POST_DECREMENT:                   Addressing Modes.
-* HAVE_POST_INCREMENT:                   Addressing Modes.
-* HAVE_PRE_DECREMENT:                    Addressing Modes.
-* HAVE_PRE_INCREMENT:                    Addressing Modes.
-* HAVE_PUTENV:                           Config.
-* HAVE_VPRINTF:                          Config.
-* header files and VMS:                  Include Files and VMS.
-* high:                                  Constants.
-* HImode:                                Machine Modes.
-* HImode, in insn:                       Insns.
-* host makefile fragment:                Host Fragment.
-* HOST_BITS_PER_CHAR:                    Config.
-* HOST_BITS_PER_INT:                     Config.
-* HOST_BITS_PER_LONG:                    Config.
-* HOST_BITS_PER_SHORT:                   Config.
-* HOST_FLOAT_FORMAT:                     Config.
-* HOST_FLOAT_WORDS_BIG_ENDIAN:           Config.
-* HOST_WORDS_BIG_ENDIAN:                 Config.
-* hosted environment:                    C Dialect Options.
-* HPPA Options:                          HPPA Options.
-* I in constraint:                       Simple Constraints.
-* i in constraint:                       Simple Constraints.
-* i386 Options:                          i386 Options.
-* IBM RS/6000 and PowerPC Options:       RS/6000 and PowerPC Options.
-* IBM RT options:                        RT Options.
-* IBM RT PC:                             Interoperation.
-* identifier names, dollar signs in:     Dollar Signs.
-* identifiers, names in assembler code:  Asm Labels.
-* identifying source, compiler (88k):    M88K Options.
-* IEEE_FLOAT_FORMAT:                     Storage Layout.
-* if_then_else:                          Comparisons.
-* if_then_else and attributes:           Expressions.
-* if_then_else usage:                    Side Effects.
-* immediate_operand:                     RTL Template.
-* IMMEDIATE_PREFIX:                      Instruction Output.
-* implicit argument: return value:       Naming Results.
-* IMPLICIT_FIX_EXPR:                     Misc.
-* implied #pragma implementation:        C++ Interface.
-* in_data:                               Sections.
-* in_struct:                             Flags.
-* in_struct, in code_label:              Flags.
-* in_struct, in insn:                    Flags.
-* in_struct, in label_ref:               Flags.
-* in_struct, in mem:                     Flags.
-* in_struct, in reg:                     Flags.
-* in_struct, in subreg:                  Flags.
-* in_text:                               Sections.
-* include files and VMS:                 Include Files and VMS.
-* INCLUDE_DEFAULTS:                      Driver.
-* inclusive-or, bitwise:                 Arithmetic.
-* INCOMING_FRAME_SP_OFFSET:              Frame Layout.
-* INCOMING_REGNO:                        Register Basics.
-* INCOMING_RETURN_ADDR_RTX:              Frame Layout.
-* incompatibilities of GNU CC:           Incompatibilities.
-* increment operators:                   Bug Criteria.
-* INDEX_REG_CLASS:                       Register Classes.
-* indirect_jump instruction pattern:     Standard Names.
-* INIT_CUMULATIVE_ARGS:                  Register Arguments.
-* INIT_CUMULATIVE_INCOMING_ARGS:         Register Arguments.
-* INIT_ENVIRONMENT:                      Driver.
-* INIT_SECTION_ASM_OP <1>:               Macros for Initialization.
-* INIT_SECTION_ASM_OP:                   Sections.
-* INIT_TARGET_OPTABS:                    Library Calls.
-* INITIAL_ELIMINATION_OFFSET:            Elimination.
-* INITIAL_FRAME_POINTER_OFFSET:          Elimination.
-* initialization routines:               Initialization.
-* initializations in expressions:        Constructors.
-* INITIALIZE_TRAMPOLINE:                 Trampolines.
-* initializers with labeled elements:    Labeled Elements.
-* initializers, non-constant:            Initializers.
-* inline automatic for C++ member fns:   Inline.
-* inline functions:                      Inline.
-* inline functions, omission of:         Inline.
-* inline, automatic:                     Passes.
-* inlining and C++ pragmas:              C++ Interface.
-* insn:                                  Insns.
-* insn and /i:                           Flags.
-* insn and /s:                           Flags.
-* insn and /u:                           Flags.
-* insn attributes:                       Insn Attributes.
-* insn canonicalization:                 Insn Canonicalizations.
-* insn lengths, computing:               Insn Lengths.
-* insn splitting:                        Insn Splitting.
-* insn-attr.h:                           Defining Attributes.
-* INSN_ANNULLED_BRANCH_P:                Flags.
-* INSN_CACHE_DEPTH:                      Trampolines.
-* INSN_CACHE_LINE_WIDTH:                 Trampolines.
-* INSN_CACHE_SIZE:                       Trampolines.
-* INSN_CLOBBERS_REGNO_P:                 Obsolete Register Macros.
-* INSN_CODE:                             Insns.
-* INSN_DELETED_P:                        Flags.
-* INSN_FROM_TARGET_P:                    Flags.
-* insn_list:                             Insns.
-* INSN_REFERENCES_ARE_DELAYED:           Misc.
-* INSN_SETS_ARE_DELAYED:                 Misc.
-* INSN_UID:                              Insns.
-* insns:                                 Insns.
-* insns, generating:                     RTL Template.
-* insns, recognizing:                    RTL Template.
-* INSTALL:                               Host Fragment.
-* installation trouble:                  Trouble.
-* installing GNU CC:                     Installation.
-* installing GNU CC on the Sun:          Sun Install.
-* installing GNU CC on VMS:              VMS Install.
-* instruction attributes:                Insn Attributes.
-* instruction combination:               Passes.
-* instruction patterns:                  Patterns.
-* instruction recognizer:                Passes.
-* instruction scheduling:                Passes.
-* instruction splitting:                 Insn Splitting.
-* insv instruction pattern:              Standard Names.
-* INT_TYPE_SIZE:                         Type Layout.
-* INTEGRATE_THRESHOLD:                   Misc.
-* integrated:                            Flags.
-* integrated, in insn:                   Flags.
-* integrated, in reg:                    Flags.
-* integrating function code:             Inline.
-* Intel 386 Options:                     i386 Options.
-* Interdependence of Patterns:           Dependent Patterns.
-* interface and implementation headers, C++: C++ Interface.
-* interfacing to GNU CC output:          Interface.
-* intermediate C version, nonexistent:   G++ and GCC.
-* interrupt handler functions on the H8/300 processors: Function Attributes.
-* interrupt handlers on the M32R/D:      Function Attributes.
-* INTIFY:                                Library Calls.
-* introduction:                          Top.
-* invalid assembly code:                 Bug Criteria.
-* invalid input:                         Bug Criteria.
-* INVOKE__main:                          Macros for Initialization.
-* invoking g++:                          Invoking G++.
-* ior:                                   Arithmetic.
-* ior and attributes:                    Expressions.
-* ior, canonicalization of:              Insn Canonicalizations.
-* iorM3 instruction pattern:             Standard Names.
-* IS_ASM_LOGICAL_LINE_SEPARATOR:         Data Output.
-* isinf:                                 Cross-compilation.
-* isnan:                                 Cross-compilation.
-* jump instruction patterns:             Jump Patterns.
-* jump instructions and set:             Side Effects.
-* jump optimization:                     Passes.
-* jump threading:                        Passes.
-* jump_insn:                             Insns.
-* JUMP_LABEL:                            Insns.
-* JUMP_TABLES_IN_TEXT_SECTION:           Sections.
-* kernel and user registers (29k):       AMD29K Options.
-* keywords, alternate:                   Alternate Keywords.
-* known causes of trouble:               Trouble.
-* LABEL_NUSES:                           Insns.
-* LABEL_OUTSIDE_LOOP_P:                  Flags.
-* LABEL_PRESERVE_P:                      Flags.
-* label_ref:                             Constants.
-* label_ref and /s:                      Flags.
-* label_ref, RTL sharing:                Sharing.
-* labeled elements in initializers:      Labeled Elements.
-* labels as values:                      Labels as Values.
-* labs:                                  C Dialect Options.
-* language dialect options:              C Dialect Options.
-* large bit shifts (88k):                M88K Options.
-* large return values:                   Aggregate Return.
-* LAST_STACK_REG:                        Stack Registers.
-* LAST_VIRTUAL_REGISTER:                 Regs and Memory.
-* LD_FINI_SWITCH:                        Macros for Initialization.
-* LD_INIT_SWITCH:                        Macros for Initialization.
-* LDD_SUFFIX:                            Macros for Initialization.
-* ldexp:                                 Cross-compilation.
-* le:                                    Comparisons.
-* le and attributes:                     Expressions.
-* leaf functions:                        Leaf Functions.
-* leaf_function:                         Leaf Functions.
-* leaf_function_p:                       Standard Names.
-* LEAF_REG_REMAP:                        Leaf Functions.
-* LEAF_REGISTERS:                        Leaf Functions.
-* left rotate:                           Arithmetic.
-* left shift:                            Arithmetic.
-* LEGITIMATE_CONSTANT_P:                 Addressing Modes.
-* LEGITIMATE_PIC_OPERAND_P:              PIC.
-* LEGITIMIZE_ADDRESS:                    Addressing Modes.
-* length-zero arrays:                    Zero Length.
-* less than:                             Comparisons.
-* less than or equal:                    Comparisons.
-* leu:                                   Comparisons.
-* leu and attributes:                    Expressions.
-* LIB2FUNCS_EXTRA:                       Target Fragment.
-* LIB_SPEC:                              Driver.
-* LIBCALL_VALUE:                         Scalar Return.
-* libgcc.a:                              Library Calls.
-* LIBGCC1:                               Target Fragment.
-* LIBGCC2_CFLAGS:                        Target Fragment.
-* LIBGCC2_WORDS_BIG_ENDIAN:              Storage Layout.
-* LIBGCC_NEEDS_DOUBLE:                   Library Calls.
-* LIBGCC_SPEC:                           Driver.
-* Libraries:                             Link Options.
-* library subroutine names:              Library Calls.
-* LIBRARY_PATH:                          Environment Variables.
-* LIMIT_RELOAD_CLASS:                    Register Classes.
-* link options:                          Link Options.
-* LINK_LIBGCC_SPECIAL:                   Driver.
-* LINK_LIBGCC_SPECIAL_1:                 Driver.
-* LINK_SPEC:                             Driver.
-* lo_sum:                                Arithmetic.
-* load address instruction:              Simple Constraints.
-* LOAD_EXTEND_OP:                        Misc.
-* load_multiple instruction pattern:     Standard Names.
-* local labels:                          Local Labels.
-* local register allocation:             Passes.
-* local variables in macros:             Naming Types.
-* local variables, specifying registers: Local Reg Vars.
-* LOCAL_INCLUDE_DIR:                     Driver.
-* LOCAL_LABEL_PREFIX:                    Instruction Output.
-* LOG_LINKS:                             Insns.
-* logical-and, bitwise:                  Arithmetic.
-* long long data types:                  Long Long.
-* LONG_DOUBLE_TYPE_SIZE:                 Type Layout.
-* LONG_LONG_TYPE_SIZE:                   Type Layout.
-* LONG_TYPE_SIZE:                        Type Layout.
-* longjmp:                               Global Reg Vars.
-* longjmp and automatic variables <1>:   Interface.
-* longjmp and automatic variables:       C Dialect Options.
-* longjmp incompatibilities:             Incompatibilities.
-* longjmp warnings:                      Warning Options.
-* LONGJMP_RESTORE_FROM_STACK:            Elimination.
-* loop optimization:                     Passes.
-* lshiftrt:                              Arithmetic.
-* lshiftrt and attributes:               Expressions.
-* lshrM3 instruction pattern:            Standard Names.
-* lt:                                    Comparisons.
-* lt and attributes:                     Expressions.
-* ltu:                                   Comparisons.
-* lvalues, generalized:                  Lvalues.
-* m in constraint:                       Simple Constraints.
-* M32R/D options:                        M32R/D Options.
-* M680x0 options:                        M680x0 Options.
-* M88k options:                          M88K Options.
-* machine dependent options:             Submodel Options.
-* machine description macros:            Target Macros.
-* machine descriptions:                  Machine Desc.
-* machine mode conversions:              Conversions.
-* machine modes:                         Machine Modes.
-* machine specific constraints:          Machine Constraints.
-* MACHINE_DEPENDENT_REORG:               Misc.
-* MACHINE_STATE_RESTORE:                 Profiling.
-* MACHINE_STATE_SAVE:                    Profiling.
-* macro with variable arguments:         Macro Varargs.
-* macros containing asm:                 Extended Asm.
-* macros, inline alternative:            Inline.
-* macros, local labels:                  Local Labels.
-* macros, local variables in:            Naming Types.
-* macros, statements in expressions:     Statement Exprs.
-* macros, target description:            Target Macros.
-* macros, types of arguments:            Typeof.
-* main and the exit status:              VMS Misc.
-* make:                                  Preprocessor Options.
-* MAKE_DECL_ONE_ONLY (DECL):             Label Output.
-* make_safe_from:                        Expander Definitions.
-* makefile fragment:                     Fragments.
-* MASK_RETURN_ADDR:                      Exception Region Output.
-* match_dup:                             RTL Template.
-* match_dup and attributes:              Insn Lengths.
-* match_op_dup:                          RTL Template.
-* match_operand:                         RTL Template.
-* match_operand and attributes:          Expressions.
-* match_operator:                        RTL Template.
-* match_par_dup:                         RTL Template.
-* match_parallel:                        RTL Template.
-* match_scratch:                         RTL Template.
-* matching constraint:                   Simple Constraints.
-* matching operands:                     Output Template.
-* math libraries:                        Interface.
-* math, in RTL:                          Arithmetic.
-* MAX_BITS_PER_WORD:                     Storage Layout.
-* MAX_CHAR_TYPE_SIZE:                    Type Layout.
-* MAX_FIXED_MODE_SIZE:                   Storage Layout.
-* MAX_INT_TYPE_SIZE:                     Type Layout.
-* MAX_LONG_TYPE_SIZE:                    Type Layout.
-* MAX_MOVE_MAX:                          Misc.
-* MAX_OFILE_ALIGNMENT:                   Storage Layout.
-* MAX_REGS_PER_ADDRESS:                  Addressing Modes.
-* MAX_WCHAR_TYPE_SIZE:                   Type Layout.
-* maximum operator:                      Min and Max.
-* MAYBE_REG_PARM_STACK_SPACE:            Stack Arguments.
-* mcount:                                Profiling.
-* MD_CALL_PROTOTYPES:                    Config.
-* MD_EXEC_PREFIX:                        Driver.
-* MD_STARTFILE_PREFIX:                   Driver.
-* MD_STARTFILE_PREFIX_1:                 Driver.
-* mem:                                   Regs and Memory.
-* mem and /s:                            Flags.
-* mem and /u:                            Flags.
-* mem and /v:                            Flags.
-* mem, RTL sharing:                      Sharing.
-* MEM_IN_STRUCT_P:                       Flags.
-* MEM_VOLATILE_P:                        Flags.
-* member fns, automatically inline:      Inline.
-* memcmp:                                C Dialect Options.
-* memcpy:                                C Dialect Options.
-* memcpy, implicit usage:                Library Calls.
-* memory model (29k):                    AMD29K Options.
-* memory reference, nonoffsettable:      Simple Constraints.
-* memory references in constraints:      Simple Constraints.
-* MEMORY_MOVE_COST:                      Costs.
-* memset, implicit usage:                Library Calls.
-* messages, warning:                     Warning Options.
-* messages, warning and error:           Warnings and Errors.
-* middle-operands, omitted:              Conditionals.
-* MIN_UNITS_PER_WORD:                    Storage Layout.
-* minimum operator:                      Min and Max.
-* MINIMUM_ATOMIC_ALIGNMENT:              Storage Layout.
-* minus:                                 Arithmetic.
-* minus and attributes:                  Expressions.
-* minus, canonicalization of:            Insn Canonicalizations.
-* MIPS options:                          MIPS Options.
-* misunderstandings in C++:              C++ Misunderstandings.
-* mktemp, and constant strings:          Incompatibilities.
-* mod:                                   Arithmetic.
-* mod and attributes:                    Expressions.
-* MODDI3_LIBCALL:                        Library Calls.
-* mode attribute:                        Variable Attributes.
-* mode classes:                          Machine Modes.
-* MODE_CC:                               Machine Modes.
-* MODE_COMPLEX_FLOAT:                    Machine Modes.
-* MODE_COMPLEX_INT:                      Machine Modes.
-* MODE_FLOAT:                            Machine Modes.
-* MODE_FUNCTION:                         Machine Modes.
-* MODE_INT:                              Machine Modes.
-* MODE_PARTIAL_INT:                      Machine Modes.
-* MODE_RANDOM:                           Machine Modes.
-* MODES_TIEABLE_P:                       Values in Registers.
-* modifiers in constraints:              Modifiers.
-* modM3 instruction pattern:             Standard Names.
-* MODSI3_LIBCALL:                        Library Calls.
-* MOVE_MAX:                              Misc.
-* MOVE_RATIO:                            Costs.
-* movM instruction pattern:              Standard Names.
-* movMODEcc instruction pattern:         Standard Names.
-* movstrictM instruction pattern:        Standard Names.
-* movstrM instruction pattern:           Standard Names.
-* MULDI3_LIBCALL:                        Library Calls.
-* mulhisi3 instruction pattern:          Standard Names.
-* mulM3 instruction pattern:             Standard Names.
-* mulqihi3 instruction pattern:          Standard Names.
-* MULSI3_LIBCALL:                        Library Calls.
-* mulsidi3 instruction pattern:          Standard Names.
-* mult:                                  Arithmetic.
-* mult and attributes:                   Expressions.
-* mult, canonicalization of:             Insn Canonicalizations.
-* MULTIBYTE_CHARS:                       Config.
-* MULTILIB_DEFAULTS:                     Driver.
-* MULTILIB_DIRNAMES:                     Target Fragment.
-* MULTILIB_EXCEPTIONS:                   Target Fragment.
-* MULTILIB_EXTRA_OPTS:                   Target Fragment.
-* MULTILIB_MATCHES:                      Target Fragment.
-* MULTILIB_OPTIONS:                      Target Fragment.
-* multiple alternative constraints:      Multi-Alternative.
-* MULTIPLE_SYMBOL_SPACES:                Misc.
-* multiplication:                        Arithmetic.
-* multiprecision arithmetic:             Long Long.
-* MUST_PASS_IN_STACK, and FUNCTION_ARG:  Register Arguments.
-* n in constraint:                       Simple Constraints.
-* N_REG_CLASSES:                         Register Classes.
-* name augmentation:                     VMS Misc.
-* named patterns and conditions:         Patterns.
-* named return value in C++:             Naming Results.
-* names used in assembler code:          Asm Labels.
-* names, pattern:                        Standard Names.
-* naming convention, implementation headers: C++ Interface.
-* naming types:                          Naming Types.
-* ne:                                    Comparisons.
-* ne and attributes:                     Expressions.
-* neg:                                   Arithmetic.
-* neg and attributes:                    Expressions.
-* neg, canonicalization of:              Insn Canonicalizations.
-* negM2 instruction pattern:             Standard Names.
-* nested functions:                      Nested Functions.
-* nested functions, trampolines for:     Trampolines.
-* newline vs string constants:           C Dialect Options.
-* next_cc0_user:                         Jump Patterns.
-* NEXT_INSN:                             Insns.
-* NEXT_OBJC_RUNTIME:                     Library Calls.
-* nil:                                   RTL Objects.
-* no constraints:                        No Constraints.
-* no-op move instructions:               Passes.
-* NO_BUILTIN_PTRDIFF_TYPE:               Driver.
-* NO_BUILTIN_SIZE_TYPE:                  Driver.
-* NO_DBX_FUNCTION_END:                   DBX Hooks.
-* NO_DOLLAR_IN_LABEL:                    Misc.
-* NO_DOT_IN_LABEL:                       Misc.
-* NO_FUNCTION_CSE:                       Costs.
-* NO_IMPLICIT_EXTERN_C:                  Misc.
-* NO_MD_PROTOTYPES:                      Config.
-* NO_RECURSIVE_FUNCTION_CSE:             Costs.
-* NO_REGS:                               Register Classes.
-* NO_STAB_H:                             Config.
-* NO_SYS_SIGLIST:                        Config.
-* nocommon attribute:                    Variable Attributes.
-* non-constant initializers:             Initializers.
-* non-static inline function:            Inline.
-* NON_SAVING_SETJMP:                     Register Basics.
-* nongcc_SI_type:                        Library Calls.
-* nongcc_word_type:                      Library Calls.
-* nonlocal_goto instruction pattern:     Standard Names.
-* nonlocal_goto_receiver instruction pattern: Standard Names.
-* nonoffsettable memory reference:       Simple Constraints.
-* nop instruction pattern:               Standard Names.
-* noreturn function attribute:           Function Attributes.
-* not:                                   Arithmetic.
-* not and attributes:                    Expressions.
-* not equal:                             Comparisons.
-* not using constraints:                 No Constraints.
-* not, canonicalization of:              Insn Canonicalizations.
-* note:                                  Insns.
-* NOTE_INSN_BLOCK_BEG:                   Insns.
-* NOTE_INSN_BLOCK_END:                   Insns.
-* NOTE_INSN_DELETED:                     Insns.
-* NOTE_INSN_EH_REGION_BEG:               Insns.
-* NOTE_INSN_EH_REGION_END:               Insns.
-* NOTE_INSN_FUNCTION_END:                Insns.
-* NOTE_INSN_LOOP_BEG:                    Insns.
-* NOTE_INSN_LOOP_CONT:                   Insns.
-* NOTE_INSN_LOOP_END:                    Insns.
-* NOTE_INSN_LOOP_VTOP:                   Insns.
-* NOTE_INSN_SETJMP:                      Insns.
-* NOTE_LINE_NUMBER:                      Insns.
-* NOTE_SOURCE_FILE:                      Insns.
-* NOTICE_UPDATE_CC:                      Condition Code.
-* NUM_MACHINE_MODES:                     Machine Modes.
-* o in constraint:                       Simple Constraints.
-* OBJC_GEN_METHOD_LABEL:                 Label Output.
-* OBJC_INCLUDE_PATH:                     Environment Variables.
-* OBJC_INT_SELECTORS:                    Type Layout.
-* OBJC_PROLOGUE:                         File Framework.
-* OBJC_SELECTORS_WITHOUT_LABELS:         Type Layout.
-* OBJECT_FORMAT_COFF:                    Macros for Initialization.
-* OBJECT_FORMAT_ROSE:                    Macros for Initialization.
-* OBJECT_SUFFIX:                         Config.
-* Objective C:                           G++ and GCC.
-* Objective C threads:                   Installation.
-* OBSTACK_CHUNK_ALLOC:                   Config.
-* OBSTACK_CHUNK_FREE:                    Config.
-* OBSTACK_CHUNK_SIZE:                    Config.
-* obstack_free:                          Configurations.
-* OCS (88k):                             M88K Options.
-* offsettable address:                   Simple Constraints.
-* old-style function definitions:        Function Prototypes.
-* OLDAR:                                 Host Fragment.
-* OLDCC:                                 Host Fragment.
-* OMIT_EH_TABLE:                         Exception Region Output.
-* omitted middle-operands:               Conditionals.
-* one_cmplM2 instruction pattern:        Standard Names.
-* ONLY_INT_FIELDS:                       Config.
-* open coding:                           Inline.
-* operand access:                        Accessors.
-* operand constraints:                   Constraints.
-* operand substitution:                  Output Template.
-* operands:                              Patterns.
-* OPTIMIZATION_OPTIONS:                  Run-time Target.
-* optimize options:                      Optimize Options.
-* optional hardware or system features:  Run-time Target.
-* options to control warnings:           Warning Options.
-* options, C++:                          C++ Dialect Options.
-* options, code generation:              Code Gen Options.
-* options, debugging:                    Debugging Options.
-* options, dialect:                      C Dialect Options.
-* options, directory search:             Directory Options.
-* options, GNU CC command:               Invoking GCC.
-* options, grouping:                     Invoking GCC.
-* options, linking:                      Link Options.
-* options, optimization:                 Optimize Options.
-* options, order:                        Invoking GCC.
-* options, preprocessor:                 Preprocessor Options.
-* order of evaluation, side effects:     Non-bugs.
-* order of options:                      Invoking GCC.
-* order of register allocation:          Allocation Order.
-* ORDER_REGS_FOR_LOCAL_ALLOC:            Allocation Order.
-* Ordering of Patterns:                  Pattern Ordering.
-* other directory, compilation in:       Other Dir.
-* OUTGOING_REG_PARM_STACK_SPACE:         Stack Arguments.
-* OUTGOING_REGNO:                        Register Basics.
-* output file option:                    Overall Options.
-* output of assembler code:              File Framework.
-* output statements:                     Output Statement.
-* output templates:                      Output Template.
-* output_addr_const:                     Data Output.
-* output_asm_insn:                       Output Statement.
-* OUTPUT_QUOTED_STRING:                  File Framework.
-* overflow while constant folding:       Cross-compilation.
-* OVERLAPPING_REGNO_P:                   Obsolete Register Macros.
-* overloaded virtual fn, warning:        Warning Options.
-* OVERRIDE_OPTIONS:                      Run-time Target.
-* p in constraint:                       Simple Constraints.
-* packed attribute:                      Variable Attributes.
-* parallel:                              Side Effects.
-* parameter forward declaration:         Variable Length.
-* parameters, miscellaneous:             Misc.
-* PARM_BOUNDARY:                         Storage Layout.
-* PARSE_LDD_OUTPUT:                      Macros for Initialization.
-* parser generator, Bison:               Installation.
-* parsing pass:                          Passes.
-* passes and files of the compiler:      Passes.
-* passing arguments:                     Interface.
-* PATH_SEPARATOR:                        Config.
-* PATTERN:                               Insns.
-* pattern conditions:                    Patterns.
-* pattern names:                         Standard Names.
-* Pattern Ordering:                      Pattern Ordering.
-* patterns:                              Patterns.
-* pc:                                    Regs and Memory.
-* pc and attributes:                     Insn Lengths.
-* pc, RTL sharing:                       Sharing.
-* pc_rtx:                                Regs and Memory.
-* PCC_BITFIELD_TYPE_MATTERS:             Storage Layout.
-* PCC_STATIC_STRUCT_RETURN:              Aggregate Return.
-* PDImode:                               Machine Modes.
-* peephole optimization:                 Passes.
-* peephole optimization, RTL representation: Side Effects.
-* peephole optimizer definitions:        Peephole Definitions.
-* percent sign:                          Output Template.
-* perform_...:                           Library Calls.
-* PIC <1>:                               PIC.
-* PIC:                                   Code Gen Options.
-* PIC_OFFSET_TABLE_REG_CALL_CLOBBERED:   PIC.
-* PIC_OFFSET_TABLE_REGNUM:               PIC.
-* plus:                                  Arithmetic.
-* plus and attributes:                   Expressions.
-* plus, canonicalization of:             Insn Canonicalizations.
-* Pmode:                                 Misc.
-* pointer arguments:                     Function Attributes.
-* POINTER_SIZE:                          Storage Layout.
-* POINTERS_EXTEND_UNSIGNED:              Storage Layout.
-* popen:                                 Config.
-* portability:                           Portability.
-* portions of temporary objects, pointers to: Temporaries.
-* position independent code:             PIC.
-* POSIX:                                 Config.
-* post_dec:                              Incdec.
-* post_inc:                              Incdec.
-* pragma:                                Misc.
-* pragma, reason for not using:          Function Attributes.
-* pragmas in C++, effect on inlining:    C++ Interface.
-* pragmas, interface and implementation: C++ Interface.
-* pre_dec:                               Incdec.
-* pre_inc:                               Incdec.
-* predefined macros:                     Run-time Target.
-* PREDICATE_CODES:                       Misc.
-* PREFERRED_DEBUGGING_TYPE:              All Debuggers.
-* PREFERRED_OUTPUT_RELOAD_CLASS:         Register Classes.
-* PREFERRED_RELOAD_CLASS:                Register Classes.
-* preprocessing numbers:                 Incompatibilities.
-* preprocessing tokens:                  Incompatibilities.
-* preprocessor options:                  Preprocessor Options.
-* PRESERVE_DEATH_INFO_REGNO_P:           Obsolete Register Macros.
-* prev_active_insn:                      Peephole Definitions.
-* prev_cc0_setter:                       Jump Patterns.
-* PREV_INSN:                             Insns.
-* PRINT_OPERAND:                         Instruction Output.
-* PRINT_OPERAND_ADDRESS:                 Instruction Output.
-* PRINT_OPERAND_PUNCT_VALID_P:           Instruction Output.
-* probe instruction pattern:             Standard Names.
-* processor selection (29k):             AMD29K Options.
-* product:                               Arithmetic.
-* prof:                                  Debugging Options.
-* PROFILE_BEFORE_PROLOGUE:               Profiling.
-* profile_block_flag:                    Profiling.
-* profiling, code generation:            Profiling.
-* program counter:                       Regs and Memory.
-* prologue:                              Function Entry.
-* PROMOTE_FOR_CALL_ONLY:                 Storage Layout.
-* PROMOTE_FUNCTION_ARGS:                 Storage Layout.
-* PROMOTE_FUNCTION_RETURN:               Storage Layout.
-* PROMOTE_MODE:                          Storage Layout.
-* PROMOTE_PROTOTYPES:                    Stack Arguments.
-* promotion of formal parameters:        Function Prototypes.
-* pseudo registers:                      Regs and Memory.
-* PSImode:                               Machine Modes.
-* PTRDIFF_TYPE:                          Type Layout.
-* push address instruction:              Simple Constraints.
-* PUSH_ROUNDING:                         Stack Arguments.
-* PUSH_ROUNDING, interaction with STACK_BOUNDARY: Storage Layout.
-* PUT_CODE:                              RTL Objects.
-* PUT_MODE:                              Machine Modes.
-* PUT_REG_NOTE_KIND:                     Insns.
-* PUT_SDB_...:                           SDB and DWARF.
-* putenv:                                Config.
-* Q, in constraint:                      Simple Constraints.
-* QImode:                                Machine Modes.
-* QImode, in insn:                       Insns.
-* qsort, and global register variables:  Global Reg Vars.
-* question mark:                         Multi-Alternative.
-* quotient:                              Arithmetic.
-* r in constraint:                       Simple Constraints.
-* r0-relative references (88k):          M88K Options.
-* ranges in case statements:             Case Ranges.
-* read-only strings:                     Incompatibilities.
-* READONLY_DATA_SECTION:                 Sections.
-* REAL_ARITHMETIC:                       Cross-compilation.
-* REAL_INFINITY:                         Cross-compilation.
-* REAL_NM_FILE_NAME:                     Macros for Initialization.
-* REAL_VALUE_ATOF:                       Cross-compilation.
-* REAL_VALUE_FIX:                        Cross-compilation.
-* REAL_VALUE_FROM_INT:                   Cross-compilation.
-* REAL_VALUE_ISINF:                      Cross-compilation.
-* REAL_VALUE_ISNAN:                      Cross-compilation.
-* REAL_VALUE_LDEXP:                      Cross-compilation.
-* REAL_VALUE_NEGATE:                     Cross-compilation.
-* REAL_VALUE_RNDZINT:                    Cross-compilation.
-* REAL_VALUE_TO_DECIMAL:                 Data Output.
-* REAL_VALUE_TO_INT:                     Cross-compilation.
-* REAL_VALUE_TO_TARGET_DOUBLE:           Data Output.
-* REAL_VALUE_TO_TARGET_LONG_DOUBLE:      Data Output.
-* REAL_VALUE_TO_TARGET_SINGLE:           Data Output.
-* REAL_VALUE_TRUNCATE:                   Cross-compilation.
-* REAL_VALUE_TYPE:                       Cross-compilation.
-* REAL_VALUE_UNSIGNED_FIX:               Cross-compilation.
-* REAL_VALUE_UNSIGNED_RNDZINT:           Cross-compilation.
-* REAL_VALUES_EQUAL:                     Cross-compilation.
-* REAL_VALUES_LESS:                      Cross-compilation.
-* recog_operand:                         Instruction Output.
-* recognizing insns:                     RTL Template.
-* reg:                                   Regs and Memory.
-* reg and /i:                            Flags.
-* reg and /s:                            Flags.
-* reg and /u:                            Flags.
-* reg and /v:                            Flags.
-* reg, RTL sharing:                      Sharing.
-* REG_ALLOC_ORDER:                       Allocation Order.
-* REG_BR_PROB:                           Insns.
-* REG_CC_SETTER:                         Insns.
-* REG_CC_USER:                           Insns.
-* REG_CLASS_CONTENTS:                    Register Classes.
-* REG_CLASS_FROM_LETTER:                 Register Classes.
-* REG_CLASS_NAMES:                       Register Classes.
-* REG_DEAD:                              Insns.
-* REG_DEP_ANTI:                          Insns.
-* REG_DEP_OUTPUT:                        Insns.
-* REG_EQUAL:                             Insns.
-* REG_EQUIV:                             Insns.
-* REG_EXEC_COUNT:                        Insns.
-* REG_FUNCTION_VALUE_P:                  Flags.
-* REG_INC:                               Insns.
-* REG_LABEL:                             Insns.
-* REG_LIBCALL:                           Insns.
-* REG_LOOP_TEST_P:                       Flags.
-* REG_MODE_OK_FOR_BASE_P:                Addressing Modes.
-* reg_names:                             Instruction Output.
-* REG_NO_CONFLICT:                       Insns.
-* REG_NONNEG:                            Insns.
-* REG_NOTE_KIND:                         Insns.
-* REG_NOTES:                             Insns.
-* REG_OK_FOR_BASE_P:                     Addressing Modes.
-* REG_OK_FOR_INDEX_P:                    Addressing Modes.
-* REG_OK_STRICT:                         Addressing Modes.
-* REG_PARM_STACK_SPACE:                  Stack Arguments.
-* REG_PARM_STACK_SPACE, and FUNCTION_ARG: Register Arguments.
-* REG_RETVAL:                            Insns.
-* REG_UNUSED:                            Insns.
-* REG_USERVAR_P:                         Flags.
-* REG_WAS_0:                             Insns.
-* register allocation:                   Passes.
-* register allocation order:             Allocation Order.
-* register allocation, stupid:           Passes.
-* register class definitions:            Register Classes.
-* register class preference constraints: Class Preferences.
-* register class preference pass:        Passes.
-* register pairs:                        Values in Registers.
-* register positions in frame (88k):     M88K Options.
-* Register Transfer Language (RTL):      RTL.
-* register usage:                        Registers.
-* register use analysis:                 Passes.
-* register variable after longjmp:       Global Reg Vars.
-* register-to-stack conversion:          Passes.
-* REGISTER_MOVE_COST:                    Costs.
-* REGISTER_NAMES:                        Instruction Output.
-* register_operand:                      RTL Template.
-* REGISTER_PREFIX:                       Instruction Output.
-* registers:                             Extended Asm.
-* registers arguments:                   Register Arguments.
-* registers for local variables:         Local Reg Vars.
-* registers in constraints:              Simple Constraints.
-* registers, global allocation:          Explicit Reg Vars.
-* registers, global variables in:        Global Reg Vars.
-* REGNO_MODE_OK_FOR_BASE_P:              Register Classes.
-* REGNO_OK_FOR_BASE_P:                   Register Classes.
-* REGNO_OK_FOR_INDEX_P:                  Register Classes.
-* REGNO_REG_CLASS:                       Register Classes.
-* regs_ever_live:                        Function Entry.
-* relative costs:                        Costs.
-* RELATIVE_PREFIX_NOT_LINKDIR:           Driver.
-* reload pass:                           Regs and Memory.
-* reload_completed:                      Standard Names.
-* reload_in instruction pattern:         Standard Names.
-* reload_in_progress:                    Standard Names.
-* reload_out instruction pattern:        Standard Names.
-* reloading:                             Passes.
-* remainder:                             Arithmetic.
-* reordering, warning:                   Warning Options.
-* reporting bugs:                        Bugs.
-* representation of RTL:                 RTL.
-* rest argument (in macro):              Macro Varargs.
-* rest_of_compilation:                   Passes.
-* rest_of_decl_compilation:              Passes.
-* restore_stack_block instruction pattern: Standard Names.
-* restore_stack_function instruction pattern: Standard Names.
-* restore_stack_nonlocal instruction pattern: Standard Names.
-* return:                                Side Effects.
-* return instruction pattern:            Standard Names.
-* return value of main:                  VMS Misc.
-* return value, named, in C++:           Naming Results.
-* return values in registers:            Scalar Return.
-* return, in C++ function header:        Naming Results.
-* RETURN_ADDR_IN_PREVIOUS_FRAME:         Frame Layout.
-* RETURN_ADDR_RTX:                       Frame Layout.
-* RETURN_ADDRESS_POINTER_REGNUM:         Frame Registers.
-* RETURN_IN_MEMORY:                      Aggregate Return.
-* RETURN_POPS_ARGS:                      Stack Arguments.
-* returning aggregate values:            Aggregate Return.
-* returning structures and unions:       Interface.
-* REVERSIBLE_CC_MODE:                    Condition Code.
-* right rotate:                          Arithmetic.
-* right shift:                           Arithmetic.
-* rotate:                                Arithmetic.
-* rotatert:                              Arithmetic.
-* rotlM3 instruction pattern:            Standard Names.
-* rotrM3 instruction pattern:            Standard Names.
-* ROUND_TYPE_ALIGN:                      Storage Layout.
-* ROUND_TYPE_SIZE:                       Storage Layout.
-* RS/6000 and PowerPC Options:           RS/6000 and PowerPC Options.
-* RT options:                            RT Options.
-* RT PC:                                 Interoperation.
-* RTL addition:                          Arithmetic.
-* RTL comparison:                        Arithmetic.
-* RTL comparison operations:             Comparisons.
-* RTL constant expression types:         Constants.
-* RTL constants:                         Constants.
-* RTL declarations:                      RTL Declarations.
-* RTL difference:                        Arithmetic.
-* RTL expression:                        RTL Objects.
-* RTL expressions for arithmetic:        Arithmetic.
-* RTL format:                            Accessors.
-* RTL format characters:                 Accessors.
-* RTL function-call insns:               Calls.
-* RTL generation:                        Passes.
-* RTL insn template:                     RTL Template.
-* RTL integers:                          RTL Objects.
-* RTL memory expressions:                Regs and Memory.
-* RTL object types:                      RTL Objects.
-* RTL postdecrement:                     Incdec.
-* RTL postincrement:                     Incdec.
-* RTL predecrement:                      Incdec.
-* RTL preincrement:                      Incdec.
-* RTL register expressions:              Regs and Memory.
-* RTL representation:                    RTL.
-* RTL side effect expressions:           Side Effects.
-* RTL strings:                           RTL Objects.
-* RTL structure sharing assumptions:     Sharing.
-* RTL subtraction:                       Arithmetic.
-* RTL sum:                               Arithmetic.
-* RTL vectors:                           RTL Objects.
-* RTX (See RTL):                         RTL Objects.
-* RTX_COSTS:                             Costs.
-* RTX_INTEGRATED_P:                      Flags.
-* RTX_UNCHANGING_P:                      Flags.
-* run-time conventions:                  Interface.
-* run-time options:                      Code Gen Options.
-* run-time target specification:         Run-time Target.
-* s in constraint:                       Simple Constraints.
-* save_stack_block instruction pattern:  Standard Names.
-* save_stack_function instruction pattern: Standard Names.
-* save_stack_nonlocal instruction pattern: Standard Names.
-* saveable_obstack:                      Addressing Modes.
-* scalars, returned as values:           Scalar Return.
-* scanf, and constant strings:           Incompatibilities.
-* SCCS_DIRECTIVE:                        Misc.
-* SCHED_GROUP_P:                         Flags.
-* scheduling, delayed branch:            Passes.
-* scheduling, instruction:               Passes.
-* SCmode:                                Machine Modes.
-* sCOND instruction pattern:             Standard Names.
-* scope of a variable length array:      Variable Length.
-* scope of declaration:                  Disappointments.
-* scope of external declarations:        Incompatibilities.
-* scratch:                               Regs and Memory.
-* scratch operands:                      Regs and Memory.
-* scratch, RTL sharing:                  Sharing.
-* SDB_ALLOW_FORWARD_REFERENCES:          SDB and DWARF.
-* SDB_ALLOW_UNKNOWN_REFERENCES:          SDB and DWARF.
-* SDB_DEBUGGING_INFO:                    SDB and DWARF.
-* SDB_DELIM:                             SDB and DWARF.
-* SDB_GENERATE_FAKE:                     SDB and DWARF.
-* search path:                           Directory Options.
-* second include path:                   Preprocessor Options.
-* SECONDARY_INPUT_RELOAD_CLASS:          Register Classes.
-* SECONDARY_MEMORY_NEEDED:               Register Classes.
-* SECONDARY_MEMORY_NEEDED_MODE:          Register Classes.
-* SECONDARY_MEMORY_NEEDED_RTX:           Register Classes.
-* SECONDARY_OUTPUT_RELOAD_CLASS:         Register Classes.
-* SECONDARY_RELOAD_CLASS:                Register Classes.
-* section function attribute:            Function Attributes.
-* section variable attribute:            Variable Attributes.
-* SELECT_CC_MODE:                        Condition Code.
-* SELECT_RTX_SECTION:                    Sections.
-* SELECT_SECTION:                        Sections.
-* separate directory, compilation in:    Other Dir.
-* sequence:                              Side Effects.
-* sequential consistency on 88k:         M88K Options.
-* set:                                   Side Effects.
-* set_attr:                              Tagging Insns.
-* set_attr_alternative:                  Tagging Insns.
-* SET_DEFAULT_TYPE_ATTRIBUTES:           Misc.
-* SET_DEST:                              Side Effects.
-* SET_SRC:                               Side Effects.
-* setjmp:                                Global Reg Vars.
-* setjmp incompatibilities:              Incompatibilities.
-* SETUP_FRAME_ADDRESSES:                 Frame Layout.
-* SETUP_INCOMING_VARARGS:                Varargs.
-* SFmode:                                Machine Modes.
-* shared strings:                        Incompatibilities.
-* shared VMS run time system:            VMS Misc.
-* SHARED_BSS_SECTION_ASM_OP:             Sections.
-* SHARED_SECTION_ASM_OP:                 Sections.
-* sharing of RTL components:             Sharing.
-* shift:                                 Arithmetic.
-* SHIFT_COUNT_TRUNCATED:                 Misc.
-* SHORT_TYPE_SIZE:                       Type Layout.
-* side effect in ?::                     Conditionals.
-* side effects, macro argument:          Statement Exprs.
-* side effects, order of evaluation:     Non-bugs.
-* sign_extend:                           Conversions.
-* sign_extract:                          Bit Fields.
-* sign_extract, canonicalization of:     Insn Canonicalizations.
-* signature:                             C++ Signatures.
-* signature in C++, advantages:          C++ Signatures.
-* signature member function default implementation: C++ Signatures.
-* signatures, C++:                       C++ Signatures.
-* signed and unsigned values, comparison warning: Warning Options.
-* signed division:                       Arithmetic.
-* signed maximum:                        Arithmetic.
-* signed minimum:                        Arithmetic.
-* SIGNED_CHAR_SPEC:                      Driver.
-* SImode:                                Machine Modes.
-* simple constraints:                    Simple Constraints.
-* simplifications, arithmetic:           Passes.
-* sin:                                   C Dialect Options.
-* SIZE_TYPE:                             Type Layout.
-* sizeof:                                Typeof.
-* SLOW_BYTE_ACCESS:                      Costs.
-* SLOW_UNALIGNED_ACCESS:                 Costs.
-* SLOW_ZERO_EXTEND:                      Costs.
-* SMALL_REGISTER_CLASSES:                Register Classes.
-* smaller data references:               M32R/D Options.
-* smaller data references (88k):         M88K Options.
-* smaller data references (MIPS):        MIPS Options.
-* smaller data references (PowerPC):     RS/6000 and PowerPC Options.
-* smax:                                  Arithmetic.
-* smaxM3 instruction pattern:            Standard Names.
-* smin:                                  Arithmetic.
-* sminM3 instruction pattern:            Standard Names.
-* smulM3_highpart instruction pattern:   Standard Names.
-* SPARC options:                         SPARC Options.
-* specified registers:                   Explicit Reg Vars.
-* specifying compiler version and target machine: Target Options.
-* specifying hardware config:            Submodel Options.
-* specifying machine version:            Target Options.
-* specifying registers for local variables: Local Reg Vars.
-* speed of instructions:                 Costs.
-* splitting instructions:                Insn Splitting.
-* sqrt <1>:                              Arithmetic.
-* sqrt:                                  C Dialect Options.
-* sqrtM2 instruction pattern:            Standard Names.
-* square root:                           Arithmetic.
-* sscanf, and constant strings:          Incompatibilities.
-* stack arguments:                       Stack Arguments.
-* stack checks (29k):                    AMD29K Options.
-* stack frame layout:                    Frame Layout.
-* STACK_BOUNDARY:                        Storage Layout.
-* STACK_CHECK_BUILTIN:                   Stack Checking.
-* STACK_CHECK_FIXED_FRAME_SIZE:          Stack Checking.
-* STACK_CHECK_MAX_FRAME_SIZE:            Stack Checking.
-* STACK_CHECK_MAX_VAR_SIZE:              Stack Checking.
-* STACK_CHECK_PROBE_INTERVAL:            Stack Checking.
-* STACK_CHECK_PROBE_LOAD:                Stack Checking.
-* STACK_CHECK_PROTECT:                   Stack Checking.
-* STACK_DYNAMIC_OFFSET:                  Frame Layout.
-* STACK_DYNAMIC_OFFSET and virtual registers: Regs and Memory.
-* STACK_GROWS_DOWNWARD:                  Frame Layout.
-* STACK_PARMS_IN_REG_PARM_AREA:          Stack Arguments.
-* STACK_POINTER_OFFSET:                  Frame Layout.
-* STACK_POINTER_OFFSET and virtual registers: Regs and Memory.
-* STACK_POINTER_REGNUM:                  Frame Registers.
-* STACK_POINTER_REGNUM and virtual registers: Regs and Memory.
-* stack_pointer_rtx:                     Frame Registers.
-* STACK_REGS:                            Stack Registers.
-* stage1:                                Installation.
-* standard pattern names:                Standard Names.
-* STANDARD_EXEC_PREFIX:                  Driver.
-* STANDARD_INCLUDE_COMPONENT:            Driver.
-* STANDARD_INCLUDE_DIR:                  Driver.
-* STANDARD_STARTFILE_PREFIX:             Driver.
-* start files:                           Tools and Libraries.
-* STARTFILE_SPEC:                        Driver.
-* STARTING_FRAME_OFFSET:                 Frame Layout.
-* STARTING_FRAME_OFFSET and virtual registers: Regs and Memory.
-* statements inside expressions:         Statement Exprs.
-* static data in C++, declaring and defining: Static Definitions.
-* STATIC_CHAIN:                          Frame Registers.
-* STATIC_CHAIN_INCOMING:                 Frame Registers.
-* STATIC_CHAIN_INCOMING_REGNUM:          Frame Registers.
-* STATIC_CHAIN_REGNUM:                   Frame Registers.
-* stdarg.h and register arguments:       Register Arguments.
-* stdarg.h and RT PC:                    RT Options.
-* storage layout:                        Storage Layout.
-* STORE_FLAG_VALUE:                      Misc.
-* store_multiple instruction pattern:    Standard Names.
-* storem bug (29k):                      AMD29K Options.
-* strcmp:                                C Dialect Options.
-* strcpy <1>:                            Storage Layout.
-* strcpy:                                C Dialect Options.
-* strength-reduction:                    Passes.
-* STRICT_ALIGNMENT:                      Storage Layout.
-* STRICT_ARGUMENT_NAMING:                Varargs.
-* strict_low_part:                       RTL Declarations.
-* string constants:                      Incompatibilities.
-* string constants vs newline:           C Dialect Options.
-* STRIP_NAME_ENCODING:                   Sections.
-* strlen:                                C Dialect Options.
-* strlenM instruction pattern:           Standard Names.
-* STRUCT_VALUE:                          Aggregate Return.
-* STRUCT_VALUE_INCOMING:                 Aggregate Return.
-* STRUCT_VALUE_INCOMING_REGNUM:          Aggregate Return.
-* STRUCT_VALUE_REGNUM:                   Aggregate Return.
-* structure passing (88k):               M88K Options.
-* structure value address:               Aggregate Return.
-* STRUCTURE_SIZE_BOUNDARY:               Storage Layout.
-* structures:                            Incompatibilities.
-* structures, constructor expression:    Constructors.
-* structures, returning:                 Interface.
-* stupid register allocation:            Passes.
-* subM3 instruction pattern:             Standard Names.
-* submodel options:                      Submodel Options.
-* subreg:                                Regs and Memory.
-* subreg and /s:                         Flags.
-* subreg and /u:                         Flags.
-* subreg, in strict_low_part:            RTL Declarations.
-* subreg, special reload handling:       Regs and Memory.
-* SUBREG_PROMOTED_UNSIGNED_P:            Flags.
-* SUBREG_PROMOTED_VAR_P:                 Flags.
-* SUBREG_REG:                            Regs and Memory.
-* SUBREG_WORD:                           Regs and Memory.
-* subscripting:                          Subscripting.
-* subscripting and function values:      Subscripting.
-* subtype polymorphism, C++:             C++ Signatures.
-* SUCCESS_EXIT_CODE:                     Config.
-* suffixes for C++ source:               Invoking G++.
-* Sun installation:                      Sun Install.
-* SUPPORTS_ONE_ONLY:                     Label Output.
-* SUPPORTS_WEAK:                         Label Output.
-* suppressing warnings:                  Warning Options.
-* surprises in C++:                      C++ Misunderstandings.
-* SVr4:                                  M88K Options.
-* SWITCH_TAKES_ARG:                      Driver.
-* SWITCHES_NEED_SPACES:                  Driver.
-* symbol_ref:                            Constants.
-* symbol_ref and /u:                     Flags.
-* symbol_ref and /v:                     Flags.
-* symbol_ref, RTL sharing:               Sharing.
-* SYMBOL_REF_FLAG:                       Flags.
-* SYMBOL_REF_FLAG, in ENCODE_SECTION_INFO: Sections.
-* SYMBOL_REF_USED:                       Flags.
-* symbolic label:                        Sharing.
-* syntax checking:                       Warning Options.
-* synthesized methods, warning:          Warning Options.
-* sys_siglist:                           Config.
-* SYSTEM_INCLUDE_DIR:                    Driver.
-* t-TARGET:                              Target Fragment.
-* tablejump instruction pattern:         Standard Names.
-* tagging insns:                         Tagging Insns.
-* tail recursion optimization:           Passes.
-* target description macros:             Target Macros.
-* target machine, specifying:            Target Options.
-* target makefile fragment:              Target Fragment.
-* target options:                        Target Options.
-* target specifications:                 Run-time Target.
-* target-parameter-dependent code:       Passes.
-* TARGET_BELL:                           Type Layout.
-* TARGET_BS:                             Type Layout.
-* TARGET_CR:                             Type Layout.
-* TARGET_EDOM:                           Library Calls.
-* TARGET_FF:                             Type Layout.
-* TARGET_FLOAT_FORMAT:                   Storage Layout.
-* TARGET_MEM_FUNCTIONS:                  Library Calls.
-* TARGET_NEWLINE:                        Type Layout.
-* TARGET_OPTIONS:                        Run-time Target.
-* TARGET_SWITCHES:                       Run-time Target.
-* TARGET_TAB:                            Type Layout.
-* TARGET_VERSION:                        Run-time Target.
-* TARGET_VT:                             Type Layout.
-* TCmode:                                Machine Modes.
-* tcov:                                  Debugging Options.
-* template debugging:                    Warning Options.
-* template instantiation:                Template Instantiation.
-* temporaries, lifetime of:              Temporaries.
-* termination routines:                  Initialization.
-* text_section:                          Sections.
-* TEXT_SECTION_ASM_OP:                   Sections.
-* TFmode:                                Machine Modes.
-* threads, Objective C:                  Installation.
-* thunks:                                Nested Functions.
-* TImode:                                Machine Modes.
-* tiny data section on the H8/300H:      Function Attributes.
-* tm.h macros:                           Target Macros.
-* TMPDIR:                                Environment Variables.
-* top level of compiler:                 Passes.
-* traditional C language:                C Dialect Options.
-* TRADITIONAL_RETURN_FLOAT:              Scalar Return.
-* TRAMPOLINE_ALIGNMENT:                  Trampolines.
-* TRAMPOLINE_SECTION:                    Trampolines.
-* TRAMPOLINE_SIZE:                       Trampolines.
-* TRAMPOLINE_TEMPLATE:                   Trampolines.
-* trampolines for nested functions:      Trampolines.
-* TRANSFER_FROM_TRAMPOLINE:              Trampolines.
-* TRULY_NOOP_TRUNCATION:                 Misc.
-* truncate:                              Conversions.
-* truncMN2 instruction pattern:          Standard Names.
-* tstM instruction pattern:              Standard Names.
-* type abstraction, C++:                 C++ Signatures.
-* type alignment:                        Alignment.
-* type attributes:                       Type Attributes.
-* typedef names as function parameters:  Incompatibilities.
-* typeof:                                Typeof.
-* udiv:                                  Arithmetic.
-* UDIVDI3_LIBCALL:                       Library Calls.
-* udivM3 instruction pattern:            Standard Names.
-* udivmodM4 instruction pattern:         Standard Names.
-* UDIVSI3_LIBCALL:                       Library Calls.
-* Ultrix calling convention:             Interoperation.
-* umax:                                  Arithmetic.
-* umaxM3 instruction pattern:            Standard Names.
-* umin:                                  Arithmetic.
-* uminM3 instruction pattern:            Standard Names.
-* umod:                                  Arithmetic.
-* UMODDI3_LIBCALL:                       Library Calls.
-* umodM3 instruction pattern:            Standard Names.
-* UMODSI3_LIBCALL:                       Library Calls.
-* umulhisi3 instruction pattern:         Standard Names.
-* umulM3_highpart instruction pattern:   Standard Names.
-* umulqihi3 instruction pattern:         Standard Names.
-* umulsidi3 instruction pattern:         Standard Names.
-* unchanging:                            Flags.
-* unchanging, in call_insn:              Flags.
-* unchanging, in insn:                   Flags.
-* unchanging, in reg and mem:            Flags.
-* unchanging, in subreg:                 Flags.
-* unchanging, in symbol_ref:             Flags.
-* undefined behavior:                    Bug Criteria.
-* undefined function value:              Bug Criteria.
-* underscores in variables in macros:    Naming Types.
-* underscores, avoiding (88k):           M88K Options.
-* union, casting to a:                   Cast to Union.
-* unions:                                Incompatibilities.
-* unions, returning:                     Interface.
-* UNIQUE_SECTION:                        Sections.
-* UNIQUE_SECTION_P:                      Sections.
-* UNITS_PER_WORD:                        Storage Layout.
-* UNKNOWN_FLOAT_FORMAT:                  Storage Layout.
-* unreachable code:                      Passes.
-* unresolved references and -nodefaultlibs: Link Options.
-* unresolved references and -nostdlib:   Link Options.
-* unshare_all_rtl:                       Sharing.
-* unsigned division:                     Arithmetic.
-* unsigned greater than:                 Comparisons.
-* unsigned less than:                    Comparisons.
-* unsigned minimum and maximum:          Arithmetic.
-* unsigned_fix:                          Conversions.
-* unsigned_float:                        Conversions.
-* unspec:                                Side Effects.
-* unspec_volatile:                       Side Effects.
-* untyped_call instruction pattern:      Standard Names.
-* untyped_return instruction pattern:    Standard Names.
-* use:                                   Side Effects.
-* USE_C_ALLOCA:                          Config.
-* USE_PROTOTYPES:                        Config.
-* used:                                  Flags.
-* used, in symbol_ref:                   Flags.
-* USER_LABEL_PREFIX:                     Instruction Output.
-* USG:                                   Config.
-* V in constraint:                       Simple Constraints.
-* V850 Options:                          V850 Options.
-* VALID_MACHINE_DECL_ATTRIBUTE:          Misc.
-* VALID_MACHINE_TYPE_ATTRIBUTE:          Misc.
-* value after longjmp:                   Global Reg Vars.
-* values, returned by functions:         Scalar Return.
-* varargs implementation:                Varargs.
-* varargs.h and RT PC:                   RT Options.
-* variable addressability on the M32R/D: Variable Attributes.
-* variable alignment:                    Alignment.
-* variable attributes:                   Variable Attributes.
-* variable number of arguments:          Macro Varargs.
-* variable-length array scope:           Variable Length.
-* variable-length arrays:                Variable Length.
-* variables in specified registers:      Explicit Reg Vars.
-* variables, local, in macros:           Naming Types.
-* Vax calling convention:                Interoperation.
-* VAX options:                           VAX Options.
-* VAX_FLOAT_FORMAT:                      Storage Layout.
-* VAXCRTL:                               VMS Misc.
-* VIRTUAL_INCOMING_ARGS_REGNUM:          Regs and Memory.
-* VIRTUAL_OUTGOING_ARGS_REGNUM:          Regs and Memory.
-* VIRTUAL_STACK_DYNAMIC_REGNUM:          Regs and Memory.
-* VIRTUAL_STACK_VARS_REGNUM:             Regs and Memory.
-* VMS:                                   Config.
-* VMS and case sensitivity:              VMS Misc.
-* VMS and include files:                 Include Files and VMS.
-* VMS installation:                      VMS Install.
-* void pointers, arithmetic:             Pointer Arith.
-* void, size of pointer to:              Pointer Arith.
-* VOIDmode:                              Machine Modes.
-* volatil:                               Flags.
-* volatil, in insn:                      Flags.
-* volatil, in mem:                       Flags.
-* volatil, in reg:                       Flags.
-* volatil, in symbol_ref:                Flags.
-* volatile applied to function:          Function Attributes.
-* volatile memory references:            Flags.
-* voting between constraint alternatives: Class Preferences.
-* vprintf:                               Config.
-* warning for comparison of signed and unsigned values: Warning Options.
-* warning for overloaded virtual fn:     Warning Options.
-* warning for reordering of member initializers: Warning Options.
-* warning for synthesized methods:       Warning Options.
-* warning messages:                      Warning Options.
-* warnings vs errors:                    Warnings and Errors.
-* WCHAR_TYPE:                            Type Layout.
-* WCHAR_TYPE_SIZE:                       Type Layout.
-* weak attribute:                        Function Attributes.
-* which_alternative:                     Output Statement.
-* whitespace:                            Incompatibilities.
-* WIDEST_HARDWARE_FP_SIZE:               Type Layout.
-* word_mode:                             Machine Modes.
-* WORD_REGISTER_OPERATIONS:              Misc.
-* WORD_SWITCH_TAKES_ARG:                 Driver.
-* WORDS_BIG_ENDIAN:                      Storage Layout.
-* WORDS_BIG_ENDIAN, effect on subreg:    Regs and Memory.
-* X in constraint:                       Simple Constraints.
-* x-HOST:                                Host Fragment.
-* XCmode:                                Machine Modes.
-* XCOFF_DEBUGGING_INFO:                  DBX Options.
-* XEXP:                                  Accessors.
-* XFmode:                                Machine Modes.
-* XINT:                                  Accessors.
-* xm-MACHINE.h:                          Config.
-* xor:                                   Arithmetic.
-* xor, canonicalization of:              Insn Canonicalizations.
-* xorM3 instruction pattern:             Standard Names.
-* XSTR:                                  Accessors.
-* XVEC:                                  Accessors.
-* XVECEXP:                               Accessors.
-* XVECLEN:                               Accessors.
-* XWINT:                                 Accessors.
-* zero division on 88k:                  M88K Options.
-* zero-length arrays:                    Zero Length.
-* zero_extend:                           Conversions.
-* zero_extendMN2 instruction pattern:    Standard Names.
-* zero_extract:                          Bit Fields.
-* zero_extract, canonicalization of:     Insn Canonicalizations.
-
-
diff --git a/gcc/gcc.info-3 b/gcc/gcc.info-3
deleted file mode 100644 (file)
index d60f813..0000000
+++ /dev/null
@@ -1,1198 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Preprocessor Options,  Next: Assembler Options,  Prev: Optimize Options,  Up: Invoking GCC
-
-Options Controlling the Preprocessor
-====================================
-
-   These options control the C preprocessor, which is run on each C
-source file before actual compilation.
-
-   If you use the `-E' option, nothing is done except preprocessing.
-Some of these options make sense only together with `-E' because they
-cause the preprocessor output to be unsuitable for actual compilation.
-
-`-include FILE'
-     Process FILE as input before processing the regular input file.
-     In effect, the contents of FILE are compiled first.  Any `-D' and
-     `-U' options on the command line are always processed before
-     `-include FILE', regardless of the order in which they are
-     written.  All the `-include' and `-imacros' options are processed
-     in the order in which they are written.
-
-`-imacros FILE'
-     Process FILE as input, discarding the resulting output, before
-     processing the regular input file.  Because the output generated
-     from FILE is discarded, the only effect of `-imacros FILE' is to
-     make the macros defined in FILE available for use in the main
-     input.
-
-     Any `-D' and `-U' options on the command line are always processed
-     before `-imacros FILE', regardless of the order in which they are
-     written.  All the `-include' and `-imacros' options are processed
-     in the order in which they are written.
-
-`-idirafter DIR'
-     Add the directory DIR to the second include path.  The directories
-     on the second include path are searched when a header file is not
-     found in any of the directories in the main include path (the one
-     that `-I' adds to).
-
-`-iprefix PREFIX'
-     Specify PREFIX as the prefix for subsequent `-iwithprefix' options.
-
-`-iwithprefix DIR'
-     Add a directory to the second include path.  The directory's name
-     is made by concatenating PREFIX and DIR, where PREFIX was
-     specified previously with `-iprefix'.  If you have not specified a
-     prefix yet, the directory containing the installed passes of the
-     compiler is used as the default.
-
-`-iwithprefixbefore DIR'
-     Add a directory to the main include path.  The directory's name is
-     made by concatenating PREFIX and DIR, as in the case of
-     `-iwithprefix'.
-
-`-isystem DIR'
-     Add a directory to the beginning of the second include path,
-     marking it as a system directory, so that it gets the same special
-     treatment as is applied to the standard system directories.
-
-`-nostdinc'
-     Do not search the standard system directories for header files.
-     Only the directories you have specified with `-I' options (and the
-     current directory, if appropriate) are searched.  *Note Directory
-     Options::, for information on `-I'.
-
-     By using both `-nostdinc' and `-I-', you can limit the include-file
-     search path to only those directories you specify explicitly.
-
-`-undef'
-     Do not predefine any nonstandard macros.  (Including architecture
-     flags).
-
-`-E'
-     Run only the C preprocessor.  Preprocess all the C source files
-     specified and output the results to standard output or to the
-     specified output file.
-
-`-C'
-     Tell the preprocessor not to discard comments.  Used with the `-E'
-     option.
-
-`-P'
-     Tell the preprocessor not to generate `#line' directives.  Used
-     with the `-E' option.
-
-`-M'
-     Tell the preprocessor to output a rule suitable for `make'
-     describing the dependencies of each object file.  For each source
-     file, the preprocessor outputs one `make'-rule whose target is the
-     object file name for that source file and whose dependencies are
-     all the `#include' header files it uses.  This rule may be a
-     single line or may be continued with `\'-newline if it is long.
-     The list of rules is printed on standard output instead of the
-     preprocessed C program.
-
-     `-M' implies `-E'.
-
-     Another way to specify output of a `make' rule is by setting the
-     environment variable `DEPENDENCIES_OUTPUT' (*note Environment
-     Variables::.).
-
-`-MM'
-     Like `-M' but the output mentions only the user header files
-     included with `#include "FILE"'.  System header files included
-     with `#include <FILE>' are omitted.
-
-`-MD'
-     Like `-M' but the dependency information is written to a file made
-     by replacing ".c" with ".d" at the end of the input file names.
-     This is in addition to compiling the file as specified--`-MD' does
-     not inhibit ordinary compilation the way `-M' does.
-
-     In Mach, you can use the utility `md' to merge multiple dependency
-     files into a single dependency file suitable for using with the
-     `make' command.
-
-`-MMD'
-     Like `-MD' except mention only user header files, not system
-     header files.
-
-`-MG'
-     Treat missing header files as generated files and assume they live
-     in the same directory as the source file.  If you specify `-MG',
-     you must also specify either `-M' or `-MM'.  `-MG' is not
-     supported with `-MD' or `-MMD'.
-
-`-H'
-     Print the name of each header file used, in addition to other
-     normal activities.
-
-`-AQUESTION(ANSWER)'
-     Assert the answer ANSWER for QUESTION, in case it is tested with a
-     preprocessing conditional such as `#if #QUESTION(ANSWER)'.  `-A-'
-     disables the standard assertions that normally describe the target
-     machine.
-
-`-DMACRO'
-     Define macro MACRO with the string `1' as its definition.
-
-`-DMACRO=DEFN'
-     Define macro MACRO as DEFN.  All instances of `-D' on the command
-     line are processed before any `-U' options.
-
-`-UMACRO'
-     Undefine macro MACRO.  `-U' options are evaluated after all `-D'
-     options, but before any `-include' and `-imacros' options.
-
-`-dM'
-     Tell the preprocessor to output only a list of the macro
-     definitions that are in effect at the end of preprocessing.  Used
-     with the `-E' option.
-
-`-dD'
-     Tell the preprocessing to pass all macro definitions into the
-     output, in their proper sequence in the rest of the output.
-
-`-dN'
-     Like `-dD' except that the macro arguments and contents are
-     omitted.  Only `#define NAME' is included in the output.
-
-`-trigraphs'
-     Support ANSI C trigraphs.  The `-ansi' option also has this effect.
-
-`-Wp,OPTION'
-     Pass OPTION as an option to the preprocessor.  If OPTION contains
-     commas, it is split into multiple options at the commas.
-
-\1f
-File: gcc.info,  Node: Assembler Options,  Next: Link Options,  Prev: Preprocessor Options,  Up: Invoking GCC
-
-Passing Options to the Assembler
-================================
-
-   You can pass options to the assembler.
-
-`-Wa,OPTION'
-     Pass OPTION as an option to the assembler.  If OPTION contains
-     commas, it is split into multiple options at the commas.
-
-\1f
-File: gcc.info,  Node: Link Options,  Next: Directory Options,  Prev: Assembler Options,  Up: Invoking GCC
-
-Options for Linking
-===================
-
-   These options come into play when the compiler links object files
-into an executable output file.  They are meaningless if the compiler is
-not doing a link step.
-
-`OBJECT-FILE-NAME'
-     A file name that does not end in a special recognized suffix is
-     considered to name an object file or library.  (Object files are
-     distinguished from libraries by the linker according to the file
-     contents.)  If linking is done, these object files are used as
-     input to the linker.
-
-`-c'
-`-S'
-`-E'
-     If any of these options is used, then the linker is not run, and
-     object file names should not be used as arguments.  *Note Overall
-     Options::.
-
-`-lLIBRARY'
-     Search the library named LIBRARY when linking.
-
-     It makes a difference where in the command you write this option;
-     the linker searches processes libraries and object files in the
-     order they are specified.  Thus, `foo.o -lz bar.o' searches
-     library `z' after file `foo.o' but before `bar.o'.  If `bar.o'
-     refers to functions in `z', those functions may not be loaded.
-
-     The linker searches a standard list of directories for the library,
-     which is actually a file named `libLIBRARY.a'.  The linker then
-     uses this file as if it had been specified precisely by name.
-
-     The directories searched include several standard system
-     directories plus any that you specify with `-L'.
-
-     Normally the files found this way are library files--archive files
-     whose members are object files.  The linker handles an archive
-     file by scanning through it for members which define symbols that
-     have so far been referenced but not defined.  But if the file that
-     is found is an ordinary object file, it is linked in the usual
-     fashion.  The only difference between using an `-l' option and
-     specifying a file name is that `-l' surrounds LIBRARY with `lib'
-     and `.a' and searches several directories.
-
-`-lobjc'
-     You need this special case of the `-l' option in order to link an
-     Objective C program.
-
-`-nostartfiles'
-     Do not use the standard system startup files when linking.  The
-     standard system libraries are used normally, unless `-nostdlib' or
-     `-nodefaultlibs' is used.
-
-`-nodefaultlibs'
-     Do not use the standard system libraries when linking.  Only the
-     libraries you specify will be passed to the linker.  The standard
-     startup files are used normally, unless `-nostartfiles' is used.
-
-`-nostdlib'
-     Do not use the standard system startup files or libraries when
-     linking.  No startup files and only the libraries you specify will
-     be passed to the linker.
-
-     One of the standard libraries bypassed by `-nostdlib' and
-     `-nodefaultlibs' is `libgcc.a', a library of internal subroutines
-     that GNU CC uses to overcome shortcomings of particular machines,
-     or special needs for some languages.  (*Note Interfacing to GNU CC
-     Output: Interface, for more discussion of `libgcc.a'.)  In most
-     cases, you need `libgcc.a' even when you want to avoid other
-     standard libraries.  In other words, when you specify `-nostdlib'
-     or `-nodefaultlibs' you should usually specify `-lgcc' as well.
-     This ensures that you have no unresolved references to internal
-     GNU CC library subroutines.  (For example, `__main', used to
-     ensure C++ constructors will be called; *note `collect2':
-     Collect2..)
-
-`-s'
-     Remove all symbol table and relocation information from the
-     executable.
-
-`-static'
-     On systems that support dynamic linking, this prevents linking
-     with the shared libraries.  On other systems, this option has no
-     effect.
-
-`-shared'
-     Produce a shared object which can then be linked with other
-     objects to form an executable.  Not all systems support this
-     option.  You must also specify `-fpic' or `-fPIC' on some systems
-     when you specify this option.
-
-`-symbolic'
-     Bind references to global symbols when building a shared object.
-     Warn about any unresolved references (unless overridden by the
-     link editor option `-Xlinker -z -Xlinker defs').  Only a few
-     systems support this option.
-
-`-Xlinker OPTION'
-     Pass OPTION as an option to the linker.  You can use this to
-     supply system-specific linker options which GNU CC does not know
-     how to recognize.
-
-     If you want to pass an option that takes an argument, you must use
-     `-Xlinker' twice, once for the option and once for the argument.
-     For example, to pass `-assert definitions', you must write
-     `-Xlinker -assert -Xlinker definitions'.  It does not work to write
-     `-Xlinker "-assert definitions"', because this passes the entire
-     string as a single argument, which is not what the linker expects.
-
-`-Wl,OPTION'
-     Pass OPTION as an option to the linker.  If OPTION contains
-     commas, it is split into multiple options at the commas.
-
-`-u SYMBOL'
-     Pretend the symbol SYMBOL is undefined, to force linking of
-     library modules to define it.  You can use `-u' multiple times with
-     different symbols to force loading of additional library modules.
-
-\1f
-File: gcc.info,  Node: Directory Options,  Next: Target Options,  Prev: Link Options,  Up: Invoking GCC
-
-Options for Directory Search
-============================
-
-   These options specify directories to search for header files, for
-libraries and for parts of the compiler:
-
-`-IDIR'
-     Add the directory DIR to the head of the list of directories to be
-     searched for header files.  This can be used to override a system
-     header file, substituting your own version, since these
-     directories are searched before the system header file
-     directories.  If you use more than one `-I' option, the
-     directories are scanned in left-to-right order; the standard
-     system directories come after.
-
-`-I-'
-     Any directories you specify with `-I' options before the `-I-'
-     option are searched only for the case of `#include "FILE"'; they
-     are not searched for `#include <FILE>'.
-
-     If additional directories are specified with `-I' options after
-     the `-I-', these directories are searched for all `#include'
-     directives.  (Ordinarily *all* `-I' directories are used this way.)
-
-     In addition, the `-I-' option inhibits the use of the current
-     directory (where the current input file came from) as the first
-     search directory for `#include "FILE"'.  There is no way to
-     override this effect of `-I-'.  With `-I.' you can specify
-     searching the directory which was current when the compiler was
-     invoked.  That is not exactly the same as what the preprocessor
-     does by default, but it is often satisfactory.
-
-     `-I-' does not inhibit the use of the standard system directories
-     for header files.  Thus, `-I-' and `-nostdinc' are independent.
-
-`-LDIR'
-     Add directory DIR to the list of directories to be searched for
-     `-l'.
-
-`-BPREFIX'
-     This option specifies where to find the executables, libraries,
-     include files, and data files of the compiler itself.
-
-     The compiler driver program runs one or more of the subprograms
-     `cpp', `cc1', `as' and `ld'.  It tries PREFIX as a prefix for each
-     program it tries to run, both with and without `MACHINE/VERSION/'
-     (*note Target Options::.).
-
-     For each subprogram to be run, the compiler driver first tries the
-     `-B' prefix, if any.  If that name is not found, or if `-B' was
-     not specified, the driver tries two standard prefixes, which are
-     `/usr/lib/gcc/' and `/usr/local/lib/gcc-lib/'.  If neither of
-     those results in a file name that is found, the unmodified program
-     name is searched for using the directories specified in your
-     `PATH' environment variable.
-
-     `-B' prefixes that effectively specify directory names also apply
-     to libraries in the linker, because the compiler translates these
-     options into `-L' options for the linker.  They also apply to
-     includes files in the preprocessor, because the compiler
-     translates these options into `-isystem' options for the
-     preprocessor.  In this case, the compiler appends `include' to the
-     prefix.
-
-     The run-time support file `libgcc.a' can also be searched for using
-     the `-B' prefix, if needed.  If it is not found there, the two
-     standard prefixes above are tried, and that is all.  The file is
-     left out of the link if it is not found by those means.
-
-     Another way to specify a prefix much like the `-B' prefix is to use
-     the environment variable `GCC_EXEC_PREFIX'.  *Note Environment
-     Variables::.
-
-`-specs=FILE'
-     Process FILE after the compiler reads in the standard `specs'
-     file, in order to override the defaults that the `gcc' driver
-     program uses when determining what switches to pass to `cc1',
-     `cc1plus', `as', `ld', etc.  More than one `-specs='FILE can be
-     specified on the command line, and they are processed in order,
-     from left to right.
-
-\1f
-File: gcc.info,  Node: Target Options,  Next: Submodel Options,  Prev: Directory Options,  Up: Invoking GCC
-
-Specifying Target Machine and Compiler Version
-==============================================
-
-   By default, GNU CC compiles code for the same type of machine that
-you are using.  However, it can also be installed as a cross-compiler,
-to compile for some other type of machine.  In fact, several different
-configurations of GNU CC, for different target machines, can be
-installed side by side.  Then you specify which one to use with the
-`-b' option.
-
-   In addition, older and newer versions of GNU CC can be installed side
-by side.  One of them (probably the newest) will be the default, but
-you may sometimes wish to use another.
-
-`-b MACHINE'
-     The argument MACHINE specifies the target machine for compilation.
-     This is useful when you have installed GNU CC as a cross-compiler.
-
-     The value to use for MACHINE is the same as was specified as the
-     machine type when configuring GNU CC as a cross-compiler.  For
-     example, if a cross-compiler was configured with `configure
-     i386v', meaning to compile for an 80386 running System V, then you
-     would specify `-b i386v' to run that cross compiler.
-
-     When you do not specify `-b', it normally means to compile for the
-     same type of machine that you are using.
-
-`-V VERSION'
-     The argument VERSION specifies which version of GNU CC to run.
-     This is useful when multiple versions are installed.  For example,
-     VERSION might be `2.0', meaning to run GNU CC version 2.0.
-
-     The default version, when you do not specify `-V', is the last
-     version of GNU CC that you installed.
-
-   The `-b' and `-V' options actually work by controlling part of the
-file name used for the executable files and libraries used for
-compilation.  A given version of GNU CC, for a given target machine, is
-normally kept in the directory `/usr/local/lib/gcc-lib/MACHINE/VERSION'.
-
-   Thus, sites can customize the effect of `-b' or `-V' either by
-changing the names of these directories or adding alternate names (or
-symbolic links).  If in directory `/usr/local/lib/gcc-lib/' the file
-`80386' is a link to the file `i386v', then `-b 80386' becomes an alias
-for `-b i386v'.
-
-   In one respect, the `-b' or `-V' do not completely change to a
-different compiler: the top-level driver program `gcc' that you
-originally invoked continues to run and invoke the other executables
-(preprocessor, compiler per se, assembler and linker) that do the real
-work.  However, since no real work is done in the driver program, it
-usually does not matter that the driver program in use is not the one
-for the specified target and version.
-
-   The only way that the driver program depends on the target machine is
-in the parsing and handling of special machine-specific options.
-However, this is controlled by a file which is found, along with the
-other executables, in the directory for the specified version and
-target machine.  As a result, a single installed driver program adapts
-to any specified target machine and compiler version.
-
-   The driver program executable does control one significant thing,
-however: the default version and target machine.  Therefore, you can
-install different instances of the driver program, compiled for
-different targets or versions, under different names.
-
-   For example, if the driver for version 2.0 is installed as `ogcc'
-and that for version 2.1 is installed as `gcc', then the command `gcc'
-will use version 2.1 by default, while `ogcc' will use 2.0 by default.
-However, you can choose either version with either command with the
-`-V' option.
-
-\1f
-File: gcc.info,  Node: Submodel Options,  Next: Code Gen Options,  Prev: Target Options,  Up: Invoking GCC
-
-Hardware Models and Configurations
-==================================
-
-   Earlier we discussed the standard option `-b' which chooses among
-different installed compilers for completely different target machines,
-such as Vax vs. 68000 vs. 80386.
-
-   In addition, each of these target machine types can have its own
-special options, starting with `-m', to choose among various hardware
-models or configurations--for example, 68010 vs 68020, floating
-coprocessor or none.  A single installed version of the compiler can
-compile for any model or configuration, according to the options
-specified.
-
-   Some configurations of the compiler also support additional special
-options, usually for compatibility with other compilers on the same
-platform.
-
-   These options are defined by the macro `TARGET_SWITCHES' in the
-machine description.  The default for the options is also defined by
-that macro, which enables you to change the defaults.
-
-* Menu:
-
-* M680x0 Options::
-* VAX Options::
-* SPARC Options::
-* Convex Options::
-* AMD29K Options::
-* ARM Options::
-* M32R/D Options::
-* M88K Options::
-* RS/6000 and PowerPC Options::
-* RT Options::
-* MIPS Options::
-* i386 Options::
-* HPPA Options::
-* Intel 960 Options::
-* DEC Alpha Options::
-* Clipper Options::
-* H8/300 Options::
-* SH Options::
-* System V Options::
-* V850 Options::
-
-\1f
-File: gcc.info,  Node: M680x0 Options,  Next: VAX Options,  Up: Submodel Options
-
-M680x0 Options
---------------
-
-   These are the `-m' options defined for the 68000 series.  The default
-values for these options depends on which style of 68000 was selected
-when the compiler was configured; the defaults for the most common
-choices are given below.
-
-`-m68000'
-`-mc68000'
-     Generate output for a 68000.  This is the default when the
-     compiler is configured for 68000-based systems.
-
-`-m68020'
-`-mc68020'
-     Generate output for a 68020.  This is the default when the
-     compiler is configured for 68020-based systems.
-
-`-m68881'
-     Generate output containing 68881 instructions for floating point.
-     This is the default for most 68020 systems unless `-nfp' was
-     specified when the compiler was configured.
-
-`-m68030'
-     Generate output for a 68030.  This is the default when the
-     compiler is configured for 68030-based systems.
-
-`-m68040'
-     Generate output for a 68040.  This is the default when the
-     compiler is configured for 68040-based systems.
-
-     This option inhibits the use of 68881/68882 instructions that have
-     to be emulated by software on the 68040.  If your 68040 does not
-     have code to emulate those instructions, use `-m68040'.
-
-`-m68060'
-     Generate output for a 68060.  This is the default when the
-     compiler is configured for 68060-based systems.
-
-     This option inhibits the use of 68020 and 68881/68882 instructions
-     that have to be emulated by software on the 68060.  If your 68060
-     does not have code to emulate those instructions, use `-m68060'.
-
-`-m5200'
-     Generate output for a 520X "coldfire" family cpu.  This is the
-     default when the compiler is configured for 520X-based systems.
-
-`-m68020-40'
-     Generate output for a 68040, without using any of the new
-     instructions.  This results in code which can run relatively
-     efficiently on either a 68020/68881 or a 68030 or a 68040.  The
-     generated code does use the 68881 instructions that are emulated
-     on the 68040.
-
-`-m68020-60'
-     Generate output for a 68060, without using any of the new
-     instructions.  This results in code which can run relatively
-     efficiently on either a 68020/68881 or a 68030 or a 68040.  The
-     generated code does use the 68881 instructions that are emulated
-     on the 68060.
-
-`-mfpa'
-     Generate output containing Sun FPA instructions for floating point.
-
-`-msoft-float'
-     Generate output containing library calls for floating point.
-     *Warning:* the requisite libraries are not available for all m68k
-     targets.  Normally the facilities of the machine's usual C
-     compiler are used, but this can't be done directly in
-     cross-compilation.  You must make your own arrangements to provide
-     suitable library functions for cross-compilation.  The embedded
-     targets `m68k-*-aout' and `m68k-*-coff' do provide software
-     floating point support.
-
-`-mshort'
-     Consider type `int' to be 16 bits wide, like `short int'.
-
-`-mnobitfield'
-     Do not use the bit-field instructions.  The `-m68000' option
-     implies `-mnobitfield'.
-
-`-mbitfield'
-     Do use the bit-field instructions.  The `-m68020' option implies
-     `-mbitfield'.  This is the default if you use a configuration
-     designed for a 68020.
-
-`-mrtd'
-     Use a different function-calling convention, in which functions
-     that take a fixed number of arguments return with the `rtd'
-     instruction, which pops their arguments while returning.  This
-     saves one instruction in the caller since there is no need to pop
-     the arguments there.
-
-     This calling convention is incompatible with the one normally used
-     on Unix, so you cannot use it if you need to call libraries
-     compiled with the Unix compiler.
-
-     Also, you must provide function prototypes for all functions that
-     take variable numbers of arguments (including `printf'); otherwise
-     incorrect code will be generated for calls to those functions.
-
-     In addition, seriously incorrect code will result if you call a
-     function with too many arguments.  (Normally, extra arguments are
-     harmlessly ignored.)
-
-     The `rtd' instruction is supported by the 68010, 68020, 68030,
-     68040, and 68060 processors, but not by the 68000 or 5200.
-
-`-malign-int'
-`-mno-align-int'
-     Control whether GNU CC aligns `int', `long', `long long', `float',
-     `double', and `long double' variables on a 32-bit boundary
-     (`-malign-int') or a 16-bit boundary (`-mno-align-int').  Aligning
-     variables on 32-bit boundaries produces code that runs somewhat
-     faster on processors with 32-bit busses at the expense of more
-     memory.
-
-     *Warning:* if you use the `-malign-int' switch, GNU CC will align
-     structures containing the above types  differently than most
-     published application binary interface specifications for the m68k.
-
-\1f
-File: gcc.info,  Node: VAX Options,  Next: SPARC Options,  Prev: M680x0 Options,  Up: Submodel Options
-
-VAX Options
------------
-
-   These `-m' options are defined for the Vax:
-
-`-munix'
-     Do not output certain jump instructions (`aobleq' and so on) that
-     the Unix assembler for the Vax cannot handle across long ranges.
-
-`-mgnu'
-     Do output those jump instructions, on the assumption that you will
-     assemble with the GNU assembler.
-
-`-mg'
-     Output code for g-format floating point numbers instead of
-     d-format.
-
-\1f
-File: gcc.info,  Node: SPARC Options,  Next: Convex Options,  Prev: VAX Options,  Up: Submodel Options
-
-SPARC Options
--------------
-
-   These `-m' switches are supported on the SPARC:
-
-`-mno-app-regs'
-`-mapp-regs'
-     Specify `-mapp-regs' to generate output using the global registers
-     2 through 4, which the SPARC SVR4 ABI reserves for applications.
-     This is the default.
-
-     To be fully SVR4 ABI compliant at the cost of some performance
-     loss, specify `-mno-app-regs'.  You should compile libraries and
-     system software with this option.
-
-`-mfpu'
-`-mhard-float'
-     Generate output containing floating point instructions.  This is
-     the default.
-
-`-mno-fpu'
-`-msoft-float'
-     Generate output containing library calls for floating point.
-     *Warning:* the requisite libraries are not available for all SPARC
-     targets.  Normally the facilities of the machine's usual C
-     compiler are used, but this cannot be done directly in
-     cross-compilation.  You must make your own arrangements to provide
-     suitable library functions for cross-compilation.  The embedded
-     targets `sparc-*-aout' and `sparclite-*-*' do provide software
-     floating point support.
-
-     `-msoft-float' changes the calling convention in the output file;
-     therefore, it is only useful if you compile *all* of a program with
-     this option.  In particular, you need to compile `libgcc.a', the
-     library that comes with GNU CC, with `-msoft-float' in order for
-     this to work.
-
-`-mhard-quad-float'
-     Generate output containing quad-word (long double) floating point
-     instructions.
-
-`-msoft-quad-float'
-     Generate output containing library calls for quad-word (long
-     double) floating point instructions.  The functions called are
-     those specified in the SPARC ABI.  This is the default.
-
-     As of this writing, there are no sparc implementations that have
-     hardware support for the quad-word floating point instructions.
-     They all invoke a trap handler for one of these instructions, and
-     then the trap handler emulates the effect of the instruction.
-     Because of the trap handler overhead, this is much slower than
-     calling the ABI library routines.  Thus the `-msoft-quad-float'
-     option is the default.
-
-`-mno-epilogue'
-`-mepilogue'
-     With `-mepilogue' (the default), the compiler always emits code for
-     function exit at the end of each function.  Any function exit in
-     the middle of the function (such as a return statement in C) will
-     generate a jump to the exit code at the end of the function.
-
-     With `-mno-epilogue', the compiler tries to emit exit code inline
-     at every function exit.
-
-`-mno-flat'
-`-mflat'
-     With `-mflat', the compiler does not generate save/restore
-     instructions and will use a "flat" or single register window
-     calling convention.  This model uses %i7 as the frame pointer and
-     is compatible with the normal register window model.  Code from
-     either may be intermixed.  The local registers and the input
-     registers (0-5) are still treated as "call saved" registers and
-     will be saved on the stack as necessary.
-
-     With `-mno-flat' (the default), the compiler emits save/restore
-     instructions (except for leaf functions) and is the normal mode of
-     operation.
-
-`-mno-unaligned-doubles'
-`-munaligned-doubles'
-     Assume that doubles have 8 byte alignment.  This is the default.
-
-     With `-munaligned-doubles', GNU CC assumes that doubles have 8 byte
-     alignment only if they are contained in another type, or if they
-     have an absolute address.  Otherwise, it assumes they have 4 byte
-     alignment.  Specifying this option avoids some rare compatibility
-     problems with code generated by other compilers.  It is not the
-     default because it results in a performance loss, especially for
-     floating point code.
-
-`-mv8'
-`-msparclite'
-     These two options select variations on the SPARC architecture.
-
-     By default (unless specifically configured for the Fujitsu
-     SPARClite), GCC generates code for the v7 variant of the SPARC
-     architecture.
-
-     `-mv8' will give you SPARC v8 code.  The only difference from v7
-     code is that the compiler emits the integer multiply and integer
-     divide instructions which exist in SPARC v8 but not in SPARC v7.
-
-     `-msparclite' will give you SPARClite code.  This adds the integer
-     multiply, integer divide step and scan (`ffs') instructions which
-     exist in SPARClite but not in SPARC v7.
-
-     These options are deprecated and will be deleted in GNU CC 2.9.
-     They have been replaced with `-mcpu=xxx'.
-
-`-mcypress'
-`-msupersparc'
-     These two options select the processor for which the code is
-     optimised.
-
-     With `-mcypress' (the default), the compiler optimizes code for the
-     Cypress CY7C602 chip, as used in the SparcStation/SparcServer 3xx
-     series.  This is also appropriate for the older SparcStation 1, 2,
-     IPX etc.
-
-     With `-msupersparc' the compiler optimizes code for the SuperSparc
-     cpu, as used in the SparcStation 10, 1000 and 2000 series. This
-     flag also enables use of the full SPARC v8 instruction set.
-
-     These options are deprecated and will be deleted in GNU CC 2.9.
-     They have been replaced with `-mcpu=xxx'.
-
-`-mcpu=CPU_TYPE'
-     Set architecture type and instruction scheduling parameters for
-     machine type CPU_TYPE.  Supported values for CPU_TYPE are `v7',
-     `cypress', `v8', `supersparc', `sparclite', `f930', `f934',
-     `sparclet', `tsc701', `v8plus', `v9', and `ultrasparc'.
-
-`-mtune=CPU_TYPE'
-     Set the instruction scheduling parameters for machine type
-     CPU_TYPE, but do not set the architecture type as the option
-     `-mcpu='CPU_TYPE would.  The same values for `-mcpu='CPU_TYPE are
-     used for `-mtune='CPU_TYPE.
-
-`-malign-loops=NUM'
-     Align loops to a 2 raised to a NUM byte boundary.  If
-     `-malign-loops' is not specified, the default is 2.
-
-`-malign-jumps=NUM'
-     Align instructions that are only jumped to to a 2 raised to a NUM
-     byte boundary.  If `-malign-jumps' is not specified, the default
-     is 2.
-
-`-malign-functions=NUM'
-     Align the start of functions to a 2 raised to NUM byte boundary.
-     If `-malign-functions' is not specified, the default is 2 if
-     compiling for 32 bit sparc, and 5 if compiling for 64 bit sparc.
-
-   These `-m' switches are supported in addition to the above on the
-SPARCLET processor.
-
-`-mlittle-endian'
-     Generate code for a processor running in little-endian mode.
-
-`-mlive-g0'
-     Treat register `%g0' as a normal register.  GCC will continue to
-     clobber it as necessary but will not assume it always reads as 0.
-
-`-mbroken-saverestore'
-     Generate code that does not use non-trivial forms of the `save' and
-     `restore' instructions.  Early versions of the SPARCLET processor
-     do not correctly handle `save' and `restore' instructions used with
-     arguments.  They correctly handle them used without arguments.  A
-     `save' instruction used without arguments increments the current
-     window pointer but does not allocate a new stack frame.  It is
-     assumed that the window overflow trap handler will properly handle
-     this case as will interrupt handlers.
-
-   These `-m' switches are supported in addition to the above on SPARC
-V9 processors in 64 bit environments.
-
-`-mlittle-endian'
-     Generate code for a processor running in little-endian mode.
-
-`-m32'
-`-m64'
-     Generate code for a 32 bit or 64 bit environment.  The 32 bit
-     environment sets int, long and pointer to 32 bits.  The 64 bit
-     environment sets int to 32 bits and long and pointer to 64 bits.
-
-`-mcmodel=medlow'
-     Generate code for the Medium/Low code model: the program must be
-     linked in the low 32 bits of the address space.  Pointers are 64
-     bits.  Programs can be statically or dynamically linked.
-
-`-mcmodel=medmid'
-     Generate code for the Medium/Middle code model: the program must
-     be linked in the low 44 bits of the address space, the text
-     segment must be less than 2G bytes, and data segment must be
-     within 2G of the text segment.  Pointers are 64 bits.
-
-`-mcmodel=medany'
-     Generate code for the Medium/Anywhere code model: the program may
-     be linked anywhere in the address space, the text segment must be
-     less than 2G bytes, and data segment must be within 2G of the text
-     segment.  Pointers are 64 bits.
-
-`-mcmodel=embmedany'
-     Generate code for the Medium/Anywhere code model for embedded
-     systems: assume a 32 bit text and a 32 bit data segment, both
-     starting anywhere (determined at link time).  Register %g4 points
-     to the base of the data segment.  Pointers still 64 bits.
-     Programs are statically linked, PIC is not supported.
-
-`-mstack-bias'
-`-mno-stack-bias'
-     With `-mstack-bias', GNU CC assumes that the stack pointer, and
-     frame pointer if present, are offset by -2047 which must be added
-     back when making stack frame references.  Otherwise, assume no
-     such offset is present.
-
-\1f
-File: gcc.info,  Node: Convex Options,  Next: AMD29K Options,  Prev: SPARC Options,  Up: Submodel Options
-
-Convex Options
---------------
-
-   These `-m' options are defined for Convex:
-
-`-mc1'
-     Generate output for C1.  The code will run on any Convex machine.
-     The preprocessor symbol `__convex__c1__' is defined.
-
-`-mc2'
-     Generate output for C2.  Uses instructions not available on C1.
-     Scheduling and other optimizations are chosen for max performance
-     on C2.  The preprocessor symbol `__convex_c2__' is defined.
-
-`-mc32'
-     Generate output for C32xx.  Uses instructions not available on C1.
-     Scheduling and other optimizations are chosen for max performance
-     on C32.  The preprocessor symbol `__convex_c32__' is defined.
-
-`-mc34'
-     Generate output for C34xx.  Uses instructions not available on C1.
-     Scheduling and other optimizations are chosen for max performance
-     on C34.  The preprocessor symbol `__convex_c34__' is defined.
-
-`-mc38'
-     Generate output for C38xx.  Uses instructions not available on C1.
-     Scheduling and other optimizations are chosen for max performance
-     on C38.  The preprocessor symbol `__convex_c38__' is defined.
-
-`-margcount'
-     Generate code which puts an argument count in the word preceding
-     each argument list.  This is compatible with regular CC, and a few
-     programs may need the argument count word.  GDB and other
-     source-level debuggers do not need it; this info is in the symbol
-     table.
-
-`-mnoargcount'
-     Omit the argument count word.  This is the default.
-
-`-mvolatile-cache'
-     Allow volatile references to be cached.  This is the default.
-
-`-mvolatile-nocache'
-     Volatile references bypass the data cache, going all the way to
-     memory.  This is only needed for multi-processor code that does
-     not use standard synchronization instructions.  Making
-     non-volatile references to volatile locations will not necessarily
-     work.
-
-`-mlong32'
-     Type long is 32 bits, the same as type int.  This is the default.
-
-`-mlong64'
-     Type long is 64 bits, the same as type long long.  This option is
-     useless, because no library support exists for it.
-
-\1f
-File: gcc.info,  Node: AMD29K Options,  Next: ARM Options,  Prev: Convex Options,  Up: Submodel Options
-
-AMD29K Options
---------------
-
-   These `-m' options are defined for the AMD Am29000:
-
-`-mdw'
-     Generate code that assumes the `DW' bit is set, i.e., that byte and
-     halfword operations are directly supported by the hardware.  This
-     is the default.
-
-`-mndw'
-     Generate code that assumes the `DW' bit is not set.
-
-`-mbw'
-     Generate code that assumes the system supports byte and halfword
-     write operations.  This is the default.
-
-`-mnbw'
-     Generate code that assumes the systems does not support byte and
-     halfword write operations.  `-mnbw' implies `-mndw'.
-
-`-msmall'
-     Use a small memory model that assumes that all function addresses
-     are either within a single 256 KB segment or at an absolute
-     address of less than 256k.  This allows the `call' instruction to
-     be used instead of a `const', `consth', `calli' sequence.
-
-`-mnormal'
-     Use the normal memory model: Generate `call' instructions only when
-     calling functions in the same file and `calli' instructions
-     otherwise.  This works if each file occupies less than 256 KB but
-     allows the entire executable to be larger than 256 KB.  This is
-     the default.
-
-`-mlarge'
-     Always use `calli' instructions.  Specify this option if you expect
-     a single file to compile into more than 256 KB of code.
-
-`-m29050'
-     Generate code for the Am29050.
-
-`-m29000'
-     Generate code for the Am29000.  This is the default.
-
-`-mkernel-registers'
-     Generate references to registers `gr64-gr95' instead of to
-     registers `gr96-gr127'.  This option can be used when compiling
-     kernel code that wants a set of global registers disjoint from
-     that used by user-mode code.
-
-     Note that when this option is used, register names in `-f' flags
-     must use the normal, user-mode, names.
-
-`-muser-registers'
-     Use the normal set of global registers, `gr96-gr127'.  This is the
-     default.
-
-`-mstack-check'
-`-mno-stack-check'
-     Insert (or do not insert) a call to `__msp_check' after each stack
-     adjustment.  This is often used for kernel code.
-
-`-mstorem-bug'
-`-mno-storem-bug'
-     `-mstorem-bug' handles 29k processors which cannot handle the
-     separation of a mtsrim insn and a storem instruction (most 29000
-     chips to date, but not the 29050).
-
-`-mno-reuse-arg-regs'
-`-mreuse-arg-regs'
-     `-mno-reuse-arg-regs' tells the compiler to only use incoming
-     argument registers for copying out arguments.  This helps detect
-     calling a function with fewer arguments than it was declared with.
-
-`-mno-impure-text'
-`-mimpure-text'
-     `-mimpure-text', used in addition to `-shared', tells the compiler
-     to not pass `-assert pure-text' to the linker when linking a
-     shared object.
-
-`-msoft-float'
-     Generate output containing library calls for floating point.
-     *Warning:* the requisite libraries are not part of GNU CC.
-     Normally the facilities of the machine's usual C compiler are
-     used, but this can't be done directly in cross-compilation.  You
-     must make your own arrangements to provide suitable library
-     functions for cross-compilation.
-
-\1f
-File: gcc.info,  Node: ARM Options,  Next: M32R/D Options,  Prev: AMD29K Options,  Up: Submodel Options
-
-ARM Options
------------
-
-   These `-m' options are defined for Advanced RISC Machines (ARM)
-architectures:
-
-`-mapcs-frame'
-     Generate a stack frame that is compliant with the ARM Procedure
-     Call Standard for all functions, even if this is not strictly
-     necessary for correct execution of the code.
-
-`-mapcs-26'
-     Generate code for a processor running with a 26-bit program
-     counter, and conforming to the function calling standards for the
-     APCS 26-bit option.  This option replaces the `-m2' and `-m3'
-     options of previous releases of the compiler.
-
-`-mapcs-32'
-     Generate code for a processor running with a 32-bit program
-     counter, and conforming to the function calling standards for the
-     APCS 32-bit option.  This option replaces the `-m6' option of
-     previous releases of the compiler.
-
-`-mhard-float'
-     Generate output containing floating point instructions.  This is
-     the default.
-
-`-msoft-float'
-     Generate output containing library calls for floating point.
-     *Warning:* the requisite libraries are not available for all ARM
-     targets.  Normally the facilities of the machine's usual C
-     compiler are used, but this cannot be done directly in
-     cross-compilation.  You must make your own arrangements to provide
-     suitable library functions for cross-compilation.
-
-     `-msoft-float' changes the calling convention in the output file;
-     therefore, it is only useful if you compile *all* of a program with
-     this option.  In particular, you need to compile `libgcc.a', the
-     library that comes with GNU CC, with `-msoft-float' in order for
-     this to work.
-
-`-mlittle-endian'
-     Generate code for a processor running in little-endian mode.  This
-     is the default for all standard configurations.
-
-`-mbig-endian'
-     Generate code for a processor running in big-endian mode; the
-     default is to compile code for a little-endian processor.
-
-`-mwords-little-endian'
-     This option only applies when generating code for big-endian
-     processors.  Generate code for a little-endian word order but a
-     big-endian byte order.  That is, a byte order of the form
-     `32107654'.  Note: this option should only be used if you require
-     compatibility with code for big-endian ARM processors generated by
-     versions of the compiler prior to 2.8.
-
-`-mshort-load-bytes'
-     Do not try to load half-words (eg `short's) by loading a word from
-     an unaligned address.  For some targets the MMU is configured to
-     trap unaligned loads; use this option to generate code that is
-     safe in these environments.
-
-`-mno-short-load-bytes'
-     Use unaligned word loads to load half-words (eg `short's).  This
-     option produces more efficient code, but the MMU is sometimes
-     configured to trap these instructions.
-
-`-mbsd'
-     This option only applies to RISC iX.  Emulate the native BSD-mode
-     compiler.  This is the default if `-ansi' is not specified.
-
-`-mxopen'
-     This option only applies to RISC iX.  Emulate the native
-     X/Open-mode compiler.
-
-`-mno-symrename'
-     This option only applies to RISC iX.  Do not run the assembler
-     post-processor, `symrename', after code has been assembled.
-     Normally it is necessary to modify some of the standard symbols in
-     preparation for linking with the RISC iX C library; this option
-     suppresses this pass.  The post-processor is never run when the
-     compiler is built for cross-compilation.
-
-\1f
-File: gcc.info,  Node: M32R/D Options,  Next: M88K Options,  Prev: ARM Options,  Up: Submodel Options
-
-M32R/D Options
---------------
-
-   These `-m' options are defined for Mitsubishi M32R/D architectures:
-
-`-mcode-model=small'
-     Assume all objects live in the lower 16MB of memory (so that their
-     addresses can be loaded with the `ld24' instruction), and assume
-     all subroutines are reachable with the `bl' instruction.  This is
-     the default.
-
-     The addressability of a particular object can be set with the
-     `model' attribute.
-
-`-mcode-model=medium'
-     Assume objects may be anywhere in the 32 bit address space (the
-     compiler will generate `seth/add3' instructions to load their
-     addresses), and assume all subroutines are reachable with the `bl'
-     instruction.
-
-`-mcode-model=large'
-     Assume objects may be anywhere in the 32 bit address space (the
-     compiler will generate `seth/add3' instructions to load their
-     addresses), and assume subroutines may not be reachable with the
-     `bl' instruction (the compiler will generate the much slower
-     `seth/add3/jl' instruction sequence).
-
-`-msdata=none'
-     Disable use of the small data area.  Variables will be put into
-     one of `.data', `bss', or `.rodata' (unless the `section'
-     attribute has been specified).  This is the default.
-
-     The small data area consists of sections `.sdata' and `.sbss'.
-     Objects may be explicitly put in the small data area with the
-     `section' attribute using one of these sections.
-
-`-msdata=sdata'
-     Put small global and static data in the small data area, but do not
-     generate special code to reference them.
-
-`-msdata=use'
-     Put small global and static data in the small data area, and
-     generate special instructions to reference them.
-
-`-G NUM'
-     Put global and static objects less than or equal to NUM bytes into
-     the small data or bss sections instead of the normal data or bss
-     sections.  The default value of NUM is 8.  The `-msdata' option
-     must be set to one of `sdata' or `use' for this option to have any
-     effect.
-
-     All modules should be compiled with the same `-G NUM' value.
-     Compiling with different values of NUM may or may not work; if it
-     doesn't the linker will give an error message - incorrect code
-     will not be generated.
-
diff --git a/gcc/gcc.info-4 b/gcc/gcc.info-4
deleted file mode 100644 (file)
index 8a3d1fb..0000000
+++ /dev/null
@@ -1,1171 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: M88K Options,  Next: RS/6000 and PowerPC Options,  Prev: M32R/D Options,  Up: Submodel Options
-
-M88K Options
-------------
-
-   These `-m' options are defined for Motorola 88k architectures:
-
-`-m88000'
-     Generate code that works well on both the m88100 and the m88110.
-
-`-m88100'
-     Generate code that works best for the m88100, but that also runs
-     on the m88110.
-
-`-m88110'
-     Generate code that works best for the m88110, and may not run on
-     the m88100.
-
-`-mbig-pic'
-     Obsolete option to be removed from the next revision.  Use `-fPIC'.
-
-`-midentify-revision'
-     Include an `ident' directive in the assembler output recording the
-     source file name, compiler name and version, timestamp, and
-     compilation flags used.
-
-`-mno-underscores'
-     In assembler output, emit symbol names without adding an underscore
-     character at the beginning of each name.  The default is to use an
-     underscore as prefix on each name.
-
-`-mocs-debug-info'
-`-mno-ocs-debug-info'
-     Include (or omit) additional debugging information (about
-     registers used in each stack frame) as specified in the 88open
-     Object Compatibility Standard, "OCS".  This extra information
-     allows debugging of code that has had the frame pointer
-     eliminated.  The default for DG/UX, SVr4, and Delta 88 SVr3.2 is
-     to include this information; other 88k configurations omit this
-     information by default.
-
-`-mocs-frame-position'
-     When emitting COFF debugging information for automatic variables
-     and parameters stored on the stack, use the offset from the
-     canonical frame address, which is the stack pointer (register 31)
-     on entry to the function.  The DG/UX, SVr4, Delta88 SVr3.2, and
-     BCS configurations use `-mocs-frame-position'; other 88k
-     configurations have the default `-mno-ocs-frame-position'.
-
-`-mno-ocs-frame-position'
-     When emitting COFF debugging information for automatic variables
-     and parameters stored on the stack, use the offset from the frame
-     pointer register (register 30).  When this option is in effect,
-     the frame pointer is not eliminated when debugging information is
-     selected by the -g switch.
-
-`-moptimize-arg-area'
-`-mno-optimize-arg-area'
-     Control how function arguments are stored in stack frames.
-     `-moptimize-arg-area' saves space by optimizing them, but this
-     conflicts with the 88open specifications.  The opposite
-     alternative, `-mno-optimize-arg-area', agrees with 88open
-     standards.  By default GNU CC does not optimize the argument area.
-
-`-mshort-data-NUM'
-     Generate smaller data references by making them relative to `r0',
-     which allows loading a value using a single instruction (rather
-     than the usual two).  You control which data references are
-     affected by specifying NUM with this option.  For example, if you
-     specify `-mshort-data-512', then the data references affected are
-     those involving displacements of less than 512 bytes.
-     `-mshort-data-NUM' is not effective for NUM greater than 64k.
-
-`-mserialize-volatile'
-`-mno-serialize-volatile'
-     Do, or don't, generate code to guarantee sequential consistency of
-     volatile memory references.  By default, consistency is guaranteed.
-
-     The order of memory references made by the MC88110 processor does
-     not always match the order of the instructions requesting those
-     references.  In particular, a load instruction may execute before
-     a preceding store instruction.  Such reordering violates
-     sequential consistency of volatile memory references, when there
-     are multiple processors.   When consistency must be guaranteed,
-     GNU C generates special instructions, as needed, to force
-     execution in the proper order.
-
-     The MC88100 processor does not reorder memory references and so
-     always provides sequential consistency.  However, by default, GNU
-     C generates the special instructions to guarantee consistency even
-     when you use `-m88100', so that the code may be run on an MC88110
-     processor.  If you intend to run your code only on the MC88100
-     processor, you may use `-mno-serialize-volatile'.
-
-     The extra code generated to guarantee consistency may affect the
-     performance of your application.  If you know that you can safely
-     forgo this guarantee, you may use `-mno-serialize-volatile'.
-
-`-msvr4'
-`-msvr3'
-     Turn on (`-msvr4') or off (`-msvr3') compiler extensions related
-     to System V release 4 (SVr4).  This controls the following:
-
-       1. Which variant of the assembler syntax to emit.
-
-       2. `-msvr4' makes the C preprocessor recognize `#pragma weak'
-          that is used on System V release 4.
-
-       3. `-msvr4' makes GNU CC issue additional declaration directives
-          used in SVr4.
-
-     `-msvr4' is the default for the m88k-motorola-sysv4 and
-     m88k-dg-dgux m88k configurations. `-msvr3' is the default for all
-     other m88k configurations.
-
-`-mversion-03.00'
-     This option is obsolete, and is ignored.
-
-`-mno-check-zero-division'
-`-mcheck-zero-division'
-     Do, or don't, generate code to guarantee that integer division by
-     zero will be detected.  By default, detection is guaranteed.
-
-     Some models of the MC88100 processor fail to trap upon integer
-     division by zero under certain conditions.  By default, when
-     compiling code that might be run on such a processor, GNU C
-     generates code that explicitly checks for zero-valued divisors and
-     traps with exception number 503 when one is detected.  Use of
-     mno-check-zero-division suppresses such checking for code
-     generated to run on an MC88100 processor.
-
-     GNU C assumes that the MC88110 processor correctly detects all
-     instances of integer division by zero.  When `-m88110' is
-     specified, both `-mcheck-zero-division' and
-     `-mno-check-zero-division' are ignored, and no explicit checks for
-     zero-valued divisors are generated.
-
-`-muse-div-instruction'
-     Use the div instruction for signed integer division on the MC88100
-     processor.  By default, the div instruction is not used.
-
-     On the MC88100 processor the signed integer division instruction
-     div) traps to the operating system on a negative operand.  The
-     operating system transparently completes the operation, but at a
-     large cost in execution time.  By default, when compiling code
-     that might be run on an MC88100 processor, GNU C emulates signed
-     integer division using the unsigned integer division instruction
-     divu), thereby avoiding the large penalty of a trap to the
-     operating system.  Such emulation has its own, smaller, execution
-     cost in both time and space.  To the extent that your code's
-     important signed integer division operations are performed on two
-     nonnegative operands, it may be desirable to use the div
-     instruction directly.
-
-     On the MC88110 processor the div instruction (also known as the
-     divs instruction) processes negative operands without trapping to
-     the operating system.  When `-m88110' is specified,
-     `-muse-div-instruction' is ignored, and the div instruction is used
-     for signed integer division.
-
-     Note that the result of dividing INT_MIN by -1 is undefined.  In
-     particular, the behavior of such a division with and without
-     `-muse-div-instruction'  may differ.
-
-`-mtrap-large-shift'
-`-mhandle-large-shift'
-     Include code to detect bit-shifts of more than 31 bits;
-     respectively, trap such shifts or emit code to handle them
-     properly.  By default GNU CC makes no special provision for large
-     bit shifts.
-
-`-mwarn-passed-structs'
-     Warn when a function passes a struct as an argument or result.
-     Structure-passing conventions have changed during the evolution of
-     the C language, and are often the source of portability problems.
-     By default, GNU CC issues no such warning.
-
-\1f
-File: gcc.info,  Node: RS/6000 and PowerPC Options,  Next: RT Options,  Prev: M88K Options,  Up: Submodel Options
-
-IBM RS/6000 and PowerPC Options
--------------------------------
-
-   These `-m' options are defined for the IBM RS/6000 and PowerPC:
-`-mpower'
-`-mno-power'
-`-mpower2'
-`-mno-power2'
-`-mpowerpc'
-`-mno-powerpc'
-`-mpowerpc-gpopt'
-`-mno-powerpc-gpopt'
-`-mpowerpc-gfxopt'
-`-mno-powerpc-gfxopt'
-     GNU CC supports two related instruction set architectures for the
-     RS/6000 and PowerPC.  The "POWER" instruction set are those
-     instructions supported by the `rios' chip set used in the original
-     RS/6000 systems and the "PowerPC" instruction set is the
-     architecture of the Motorola MPC5xx, MPC6xx, MPC8xx
-     microprocessors, and the IBM 4xx microprocessors.
-
-     Neither architecture is a subset of the other.  However there is a
-     large common subset of instructions supported by both.  An MQ
-     register is included in processors supporting the POWER
-     architecture.
-
-     You use these options to specify which instructions are available
-     on the processor you are using.  The default value of these
-     options is determined when configuring GNU CC.  Specifying the
-     `-mcpu=CPU_TYPE' overrides the specification of these options.  We
-     recommend you use the `-mcpu=CPU_TYPE' option rather than the
-     options listed above.
-
-     The `-mpower' option allows GNU CC to generate instructions that
-     are found only in the POWER architecture and to use the MQ
-     register.  Specifying `-mpower2' implies `-power' and also allows
-     GNU CC to generate instructions that are present in the POWER2
-     architecture but not the original POWER architecture.
-
-     The `-mpowerpc' option allows GNU CC to generate instructions that
-     are found only in the 32-bit subset of the PowerPC architecture.
-     Specifying `-mpowerpc-gpopt' implies `-mpowerpc' and also allows
-     GNU CC to use the optional PowerPC architecture instructions in the
-     General Purpose group, including floating-point square root.
-     Specifying `-mpowerpc-gfxopt' implies `-mpowerpc' and also allows
-     GNU CC to use the optional PowerPC architecture instructions in
-     the Graphics group, including floating-point select.
-
-     If you specify both `-mno-power' and `-mno-powerpc', GNU CC will
-     use only the instructions in the common subset of both
-     architectures plus some special AIX common-mode calls, and will
-     not use the MQ register.  Specifying both `-mpower' and `-mpowerpc'
-     permits GNU CC to use any instruction from either architecture and
-     to allow use of the MQ register; specify this for the Motorola
-     MPC601.
-
-`-mnew-mnemonics'
-`-mold-mnemonics'
-     Select which mnemonics to use in the generated assembler code.
-     `-mnew-mnemonics' requests output that uses the assembler mnemonics
-     defined for the PowerPC architecture, while `-mold-mnemonics'
-     requests the assembler mnemonics defined for the POWER
-     architecture.  Instructions defined in only one architecture have
-     only one mnemonic; GNU CC uses that mnemonic irrespective of which
-     of these options is specified.
-
-     PowerPC assemblers support both the old and new mnemonics, as will
-     later POWER assemblers.  Current POWER assemblers only support the
-     old mnemonics.  Specify `-mnew-mnemonics' if you have an assembler
-     that supports them, otherwise specify `-mold-mnemonics'.
-
-     The default value of these options depends on how GNU CC was
-     configured.  Specifying `-mcpu=CPU_TYPE' sometimes overrides the
-     value of these option.  Unless you are building a cross-compiler,
-     you should normally not specify either `-mnew-mnemonics' or
-     `-mold-mnemonics', but should instead accept the default.
-
-`-mcpu=CPU_TYPE'
-     Set architecture type, register usage, choice of mnemonics, and
-     instruction scheduling parameters for machine type CPU_TYPE.
-     Supported values for CPU_TYPE are `rs6000', `rios1', `rios2',
-     `rsc', `601', `602', `603', `603e', `604', `604e', `620', `power',
-     `power2', `powerpc', `403', `505', `801', `821', `823', and `860'
-     and `common'.  `-mcpu=power', `-mcpu=power2', and `-mcpu=powerpc'
-     specify generic POWER, POWER2 and pure PowerPC (i.e., not MPC601)
-     architecture machine types, with an appropriate, generic processor
-     model assumed for scheduling purposes.
-
-     Specifying any of the following options: `-mcpu=rios1',
-     `-mcpu=rios2', `-mcpu=rsc', `-mcpu=power', or `-mcpu=power2'
-     enables the `-mpower' option and disables the `-mpowerpc' option;
-     `-mcpu=601' enables both the `-mpower' and `-mpowerpc' options.
-     All of `-mcpu=602', `-mcpu=603', `-mcpu=603e', `-mcpu=604',
-     `-mcpu=620', enable the `-mpowerpc' option and disable the
-     `-mpower' option.  Exactly similarly, all of `-mcpu=403',
-     `-mcpu=505', `-mcpu=821', `-mcpu=860' and `-mcpu=powerpc' enable
-     the `-mpowerpc' option and disable the `-mpower' option.
-     `-mcpu=common' disables both the `-mpower' and `-mpowerpc' options.
-
-     AIX versions 4 or greater selects `-mcpu=common' by default, so
-     that code will operate on all members of the RS/6000 and PowerPC
-     families.  In that case, GNU CC will use only the instructions in
-     the common subset of both architectures plus some special AIX
-     common-mode calls, and will not use the MQ register.  GNU CC
-     assumes a generic processor model for scheduling purposes.
-
-     Specifying any of the options `-mcpu=rios1', `-mcpu=rios2',
-     `-mcpu=rsc', `-mcpu=power', or `-mcpu=power2' also disables the
-     `new-mnemonics' option.  Specifying `-mcpu=601', `-mcpu=602',
-     `-mcpu=603', `-mcpu=603e', `-mcpu=604', `620', `403', or
-     `-mcpu=powerpc' also enables the `new-mnemonics' option.
-
-     Specifying `-mcpu=403', `-mcpu=821', or `-mcpu=860' also enables
-     the `-msoft-float' option.
-
-`-mtune=CPU_TYPE'
-     Set the instruction scheduling parameters for machine type
-     CPU_TYPE, but do not set the architecture type, register usage,
-     choice of mnemonics like `-mcpu='CPU_TYPE would.  The same values
-     for CPU_TYPE are used for `-mtune='CPU_TYPE as for
-     `-mcpu='CPU_TYPE.  The `-mtune='CPU_TYPE option overrides the
-     `-mcpu='CPU_TYPE option in terms of instruction scheduling
-     parameters.
-
-`-mfull-toc'
-`-mno-fp-in-toc'
-`-mno-sum-in-toc'
-`-mminimal-toc'
-     Modify generation of the TOC (Table Of Contents), which is created
-     for every executable file.  The `-mfull-toc' option is selected by
-     default.  In that case, GNU CC will allocate at least one TOC
-     entry for each unique non-automatic variable reference in your
-     program.  GNU CC will also place floating-point constants in the
-     TOC.  However, only 16,384 entries are available in the TOC.
-
-     If you receive a linker error message that saying you have
-     overflowed the available TOC space, you can reduce the amount of
-     TOC space used with the `-mno-fp-in-toc' and `-mno-sum-in-toc'
-     options.  `-mno-fp-in-toc' prevents GNU CC from putting
-     floating-point constants in the TOC and `-mno-sum-in-toc' forces
-     GNU CC to generate code to calculate the sum of an address and a
-     constant at run-time instead of putting that sum into the TOC.
-     You may specify one or both of these options.  Each causes GNU CC
-     to produce very slightly slower and larger code at the expense of
-     conserving TOC space.
-
-     If you still run out of space in the TOC even when you specify
-     both of these options, specify `-mminimal-toc' instead.  This
-     option causes GNU CC to make only one TOC entry for every file.
-     When you specify this option, GNU CC will produce code that is
-     slower and larger but which uses extremely little TOC space.  You
-     may wish to use this option only on files that contain less
-     frequently executed code.
-
-`-mxl-call'
-`-mno-xl-call'
-     On AIX, pass floating-point arguments to prototyped functions
-     beyond the register save area (RSA) on the stack in addition to
-     argument FPRs.  The AIX calling convention was extended but not
-     initially documented to handle an obscure K&R C case of calling a
-     function that takes the address of its arguments with fewer
-     arguments than declared.  AIX XL compilers assume that floating
-     point arguments which do not fit in the RSA are on the stack when
-     they compile a subroutine without optimization.  Because always
-     storing floating-point arguments on the stack is inefficient and
-     rarely needed, this option is not enabled by default and only is
-     necessary when calling subroutines compiled by AIX XL compilers
-     without optimization.
-
-`-mthreads'
-     Support "AIX Threads".  Link an application written to use
-     "pthreads" with special libraries and startup code to enable the
-     application to run.
-
-`-mpe'
-     Support "IBM RS/6000 SP" "Parallel Environment" (PE).  Link an
-     application written to use message passing with special startup
-     code to enable the application to run.  The system must have PE
-     installed in the standard location (`/usr/lpp/ppe.poe/'), or the
-     `specs' file must be overridden with the `-specs=' option to
-     specify the appropriate directory location.  The Parallel
-     Environment does not support threads, so the `-mpe' option and the
-     `-mthreads' option are incompatible.
-
-`-msoft-float'
-`-mhard-float'
-     Generate code that does not use (uses) the floating-point register
-     set.  Software floating point emulation is provided if you use the
-     `-msoft-float' option, and pass the option to GNU CC when linking.
-
-`-mmultiple'
-`-mno-multiple'
-     Generate code that uses (does not use) the load multiple word
-     instructions and the store multiple word instructions.  These
-     instructions are generated by default on POWER systems, and not
-     generated on PowerPC systems.  Do not use `-mmultiple' on little
-     endian PowerPC systems, since those instructions do not work when
-     the processor is in little endian mode.
-
-`-mstring'
-`-mno-string'
-     Generate code that uses (does not use) the load string
-     instructions and the store string word instructions to save
-     multiple registers and do small block moves.  These instructions
-     are generated by default on POWER systems, and not generated on
-     PowerPC systems.  Do not use `-mstring' on little endian PowerPC
-     systems, since those instructions do not work when the processor
-     is in little endian mode.
-
-`-mupdate'
-`-mno-update'
-     Generate code that uses (does not use) the load or store
-     instructions that update the base register to the address of the
-     calculated memory location.  These instructions are generated by
-     default.  If you use `-mno-update', there is a small window
-     between the time that the stack pointer is updated and the address
-     of the previous frame is stored, which means code that walks the
-     stack frame across interrupts or signals may get corrupted data.
-
-`-mfused-madd'
-`-mno-fused-madd'
-     Generate code that uses (does not use) the floating point multiply
-     and accumulate instructions.  These instructions are generated by
-     default if hardware floating is used.
-
-`-mno-bit-align'
-`-mbit-align'
-     On System V.4 and embedded PowerPC systems do not (do) force
-     structures and unions that contain bit fields to be aligned to the
-     base type of the bit field.
-
-     For example, by default a structure containing nothing but 8
-     `unsigned' bitfields of length 1 would be aligned to a 4 byte
-     boundary and have a size of 4 bytes.  By using `-mno-bit-align',
-     the structure would be aligned to a 1 byte boundary and be one
-     byte in size.
-
-`-mno-strict-align'
-`-mstrict-align'
-     On System V.4 and embedded PowerPC systems do not (do) assume that
-     unaligned memory references will be handled by the system.
-
-`-mrelocatable'
-`-mno-relocatable'
-     On embedded PowerPC systems generate code that allows (does not
-     allow) the program to be relocated to a different address at
-     runtime.  If you use `-mrelocatable' on any module, all objects
-     linked together must be compiled with `-mrelocatable' or
-     `-mrelocatable-lib'.
-
-`-mrelocatable-lib'
-`-mno-relocatable-lib'
-     On embedded PowerPC systems generate code that allows (does not
-     allow) the program to be relocated to a different address at
-     runtime.  Modules compiled with `-mreloctable-lib' can be linked
-     with either modules compiled without `-mrelocatable' and
-     `-mrelocatable-lib' or with modules compiled with the
-     `-mrelocatable' options.
-
-`-mno-toc'
-`-mtoc'
-     On System V.4 and embedded PowerPC systems do not (do) assume that
-     register 2 contains a pointer to a global area pointing to the
-     addresses used in the program.
-
-`-mno-traceback'
-`-mtraceback'
-     On embedded PowerPC systems do not (do) generate a traceback tag
-     before the start of the function.  This tag can be used by the
-     debugger to identify where the start of a function is.
-
-`-mlittle'
-`-mlittle-endian'
-     On System V.4 and embedded PowerPC systems compile code for the
-     processor in little endian mode.  The `-mlittle-endian' option is
-     the same as `-mlittle'.
-
-`-mbig'
-`-mbig-endian'
-     On System V.4 and embedded PowerPC systems compile code for the
-     processor in big endian mode.  The `-mbig-endian' option is the
-     same as `-mbig'.
-
-`-mcall-sysv'
-     On System V.4 and embedded PowerPC systems compile code using
-     calling conventions that adheres to the March 1995 draft of the
-     System V Application Binary Interface, PowerPC processor
-     supplement.  This is the default unless you configured GCC using
-     `powerpc-*-eabiaix'.
-
-`-mcall-sysv-eabi'
-     Specify both `-mcall-sysv' and `-meabi' options.
-
-`-mcall-sysv-noeabi'
-     Specify both `-mcall-sysv' and `-mno-eabi' options.
-
-`-mcall-aix'
-     On System V.4 and embedded PowerPC systems compile code using
-     calling conventions that are similar to those used on AIX.  This
-     is the default if you configured GCC using `powerpc-*-eabiaix'.
-
-`-mcall-solaris'
-     On System V.4 and embedded PowerPC systems compile code for the
-     Solaris operating system.
-
-`-mcall-linux'
-     On System V.4 and embedded PowerPC systems compile code for the
-     Linux-based GNU system.
-
-`-mprototype'
-`-mno-prototype'
-     On System V.4 and embedded PowerPC systems assume that all calls to
-     variable argument functions are properly prototyped.  Otherwise,
-     the compiler must insert an instruction before every non
-     prototyped call to set or clear bit 6 of the condition code
-     register (CR) to indicate whether floating point values were
-     passed in the floating point registers in case the function takes
-     a variable arguments.  With `-mprototype', only calls to
-     prototyped variable argument functions will set or clear the bit.
-
-`-msim'
-     On embedded PowerPC systems, assume that the startup module is
-     called `sim-crt0.o' and that the standard C libraries are
-     `libsim.a' and `libc.a'.  This is the default for
-     `powerpc-*-eabisim'.  configurations.
-
-`-mmvme'
-     On embedded PowerPC systems, assume that the startup module is
-     called `crt0.o' and the standard C libraries are `libmvme.a' and
-     `libc.a'.
-
-`-mads'
-     On embedded PowerPC systems, assume that the startup module is
-     called `crt0.o' and the standard C libraries are `libads.a' and
-     `libc.a'.
-
-`-myellowknife'
-     On embedded PowerPC systems, assume that the startup module is
-     called `crt0.o' and the standard C libraries are `libyk.a' and
-     `libc.a'.
-
-`-memb'
-     On embedded PowerPC systems, set the PPC_EMB bit in the ELF flags
-     header to indicate that `eabi' extended relocations are used.
-
-`-meabi'
-`-mno-eabi'
-     On System V.4 and embedded PowerPC systems do (do not) adhere to
-     the Embedded Applications Binary Interface (eabi) which is a set of
-     modifications to the System V.4 specifications.  Selecting `-meabi'
-     means that the stack is aligned to an 8 byte boundary, a function
-     `__eabi' is called to from `main' to set up the eabi environment,
-     and the `-msdata' option can use both `r2' and `r13' to point to
-     two separate small data areas.  Selecting `-mno-eabi' means that
-     the stack is aligned to a 16 byte boundary, do not call an
-     initialization function from `main', and the `-msdata' option will
-     only use `r13' to point to a single small data area.  The `-meabi'
-     option is on by default if you configured GCC using one of the
-     `powerpc*-*-eabi*' options.
-
-`-msdata=eabi'
-     On System V.4 and embedded PowerPC systems, put small initialized
-     `const' global and static data in the `.sdata2' section, which is
-     pointed to by register `r2'.  Put small initialized non-`const'
-     global and static data in the `.sdata' section, which is pointed
-     to by register `r13'.  Put small uninitialized global and static
-     data in the `.sbss' section, which is adjacent to the `.sdata'
-     section.  The `-msdata=eabi' option is incompatible with the
-     `-mrelocatable' option.  The `-msdata=eabi' option also sets the
-     `-memb' option.
-
-`-msdata=sysv'
-     On System V.4 and embedded PowerPC systems, put small global and
-     static data in the `.sdata' section, which is pointed to by
-     register `r13'.  Put small uninitialized global and static data in
-     the `.sbss' section, which is adjacent to the `.sdata' section.
-     The `-msdata=sysv' option is incompatible with the `-mrelocatable'
-     option.
-
-`-msdata=default'
-`-msdata'
-     On System V.4 and embedded PowerPC systems, if `-meabi' is used,
-     compile code the same as `-msdata=eabi', otherwise compile code the
-     same as `-msdata=sysv'.
-
-`-msdata-data'
-     On System V.4 and embedded PowerPC systems, put small global and
-     static data in the `.sdata' section.  Put small uninitialized
-     global and static data in the `.sbss' section.  Do not use
-     register `r13' to address small data however.  This is the default
-     behavior unless other `-msdata' options are used.
-
-`-msdata=none'
-`-mno-sdata'
-     On embedded PowerPC systems, put all initialized global and static
-     data in the `.data' section, and all uninitialized data in the
-     `.bss' section.
-
-`-G NUM'
-     On embbeded PowerPC systems, put global and static items less than
-     or equal to NUM bytes into the small data or bss sections instead
-     of the normal data or bss section.  By default, NUM is 8.  The `-G
-     NUM' switch is also passed to the linker.  All modules should be
-     compiled with the same `-G NUM' value.
-
-`-mregnames'
-`-mno-regnames'
-     On System V.4 and embedded PowerPC systems do (do not) emit
-     register names in the assembly language output using symbolic
-     forms.
-
-\1f
-File: gcc.info,  Node: RT Options,  Next: MIPS Options,  Prev: RS/6000 and PowerPC Options,  Up: Submodel Options
-
-IBM RT Options
---------------
-
-   These `-m' options are defined for the IBM RT PC:
-
-`-min-line-mul'
-     Use an in-line code sequence for integer multiplies.  This is the
-     default.
-
-`-mcall-lib-mul'
-     Call `lmul$$' for integer multiples.
-
-`-mfull-fp-blocks'
-     Generate full-size floating point data blocks, including the
-     minimum amount of scratch space recommended by IBM.  This is the
-     default.
-
-`-mminimum-fp-blocks'
-     Do not include extra scratch space in floating point data blocks.
-     This results in smaller code, but slower execution, since scratch
-     space must be allocated dynamically.
-
-`-mfp-arg-in-fpregs'
-     Use a calling sequence incompatible with the IBM calling
-     convention in which floating point arguments are passed in
-     floating point registers.  Note that `varargs.h' and `stdargs.h'
-     will not work with floating point operands if this option is
-     specified.
-
-`-mfp-arg-in-gregs'
-     Use the normal calling convention for floating point arguments.
-     This is the default.
-
-`-mhc-struct-return'
-     Return structures of more than one word in memory, rather than in a
-     register.  This provides compatibility with the MetaWare HighC (hc)
-     compiler.  Use the option `-fpcc-struct-return' for compatibility
-     with the Portable C Compiler (pcc).
-
-`-mnohc-struct-return'
-     Return some structures of more than one word in registers, when
-     convenient.  This is the default.  For compatibility with the
-     IBM-supplied compilers, use the option `-fpcc-struct-return' or the
-     option `-mhc-struct-return'.
-
-\1f
-File: gcc.info,  Node: MIPS Options,  Next: i386 Options,  Prev: RT Options,  Up: Submodel Options
-
-MIPS Options
-------------
-
-   These `-m' options are defined for the MIPS family of computers:
-
-`-mcpu=CPU TYPE'
-     Assume the defaults for the machine type CPU TYPE when scheduling
-     instructions.  The choices for CPU TYPE are `r2000', `r3000',
-     `r4000', `r4400', `r4600', and `r6000'.  While picking a specific
-     CPU TYPE will schedule things appropriately for that particular
-     chip, the compiler will not generate any code that does not meet
-     level 1 of the MIPS ISA (instruction set architecture) without the
-     `-mips2' or `-mips3' switches being used.
-
-`-mips1'
-     Issue instructions from level 1 of the MIPS ISA.  This is the
-     default.  `r3000' is the default CPU TYPE at this ISA level.
-
-`-mips2'
-     Issue instructions from level 2 of the MIPS ISA (branch likely,
-     square root instructions).  `r6000' is the default CPU TYPE at this
-     ISA level.
-
-`-mips3'
-     Issue instructions from level 3 of the MIPS ISA (64 bit
-     instructions).  `r4000' is the default CPU TYPE at this ISA level.
-     This option does not change the sizes of any of the C data types.
-
-`-mfp32'
-     Assume that 32 32-bit floating point registers are available.
-     This is the default.
-
-`-mfp64'
-     Assume that 32 64-bit floating point registers are available.
-     This is the default when the `-mips3' option is used.
-
-`-mgp32'
-     Assume that 32 32-bit general purpose registers are available.
-     This is the default.
-
-`-mgp64'
-     Assume that 32 64-bit general purpose registers are available.
-     This is the default when the `-mips3' option is used.
-
-`-mint64'
-     Types long, int, and pointer are 64 bits.  This works only if
-     `-mips3' is also specified.
-
-`-mlong64'
-     Types long and pointer are 64 bits, and type int is 32 bits.  This
-     works only if `-mips3' is also specified.
-
-`-mmips-as'
-     Generate code for the MIPS assembler, and invoke `mips-tfile' to
-     add normal debug information.  This is the default for all
-     platforms except for the OSF/1 reference platform, using the
-     OSF/rose object format.  If the either of the `-gstabs' or
-     `-gstabs+' switches are used, the `mips-tfile' program will
-     encapsulate the stabs within MIPS ECOFF.
-
-`-mgas'
-     Generate code for the GNU assembler.  This is the default on the
-     OSF/1 reference platform, using the OSF/rose object format.  Also,
-     this is the default if the configure option `--with-gnu-as' is
-     used.
-
-`-msplit-addresses'
-`-mno-split-addresses'
-     Generate code to load the high and low parts of address constants
-     separately.  This allows `gcc' to optimize away redundant loads of
-     the high order bits of addresses.  This optimization requires GNU
-     as and GNU ld.  This optimization is enabled by default for some
-     embedded targets where GNU as and GNU ld are standard.
-
-`-mrnames'
-`-mno-rnames'
-     The `-mrnames' switch says to output code using the MIPS software
-     names for the registers, instead of the hardware names (ie, A0
-     instead of $4).  The only known assembler that supports this option
-     is the Algorithmics assembler.
-
-`-mgpopt'
-`-mno-gpopt'
-     The `-mgpopt' switch says to write all of the data declarations
-     before the instructions in the text section, this allows the MIPS
-     assembler to generate one word memory references instead of using
-     two words for short global or static data items.  This is on by
-     default if optimization is selected.
-
-`-mstats'
-`-mno-stats'
-     For each non-inline function processed, the `-mstats' switch
-     causes the compiler to emit one line to the standard error file to
-     print statistics about the program (number of registers saved,
-     stack size, etc.).
-
-`-mmemcpy'
-`-mno-memcpy'
-     The `-mmemcpy' switch makes all block moves call the appropriate
-     string function (`memcpy' or `bcopy') instead of possibly
-     generating inline code.
-
-`-mmips-tfile'
-`-mno-mips-tfile'
-     The `-mno-mips-tfile' switch causes the compiler not postprocess
-     the object file with the `mips-tfile' program, after the MIPS
-     assembler has generated it to add debug support.  If `mips-tfile'
-     is not run, then no local variables will be available to the
-     debugger.  In addition, `stage2' and `stage3' objects will have
-     the temporary file names passed to the assembler embedded in the
-     object file, which means the objects will not compare the same.
-     The `-mno-mips-tfile' switch should only be used when there are
-     bugs in the `mips-tfile' program that prevents compilation.
-
-`-msoft-float'
-     Generate output containing library calls for floating point.
-     *Warning:* the requisite libraries are not part of GNU CC.
-     Normally the facilities of the machine's usual C compiler are
-     used, but this can't be done directly in cross-compilation.  You
-     must make your own arrangements to provide suitable library
-     functions for cross-compilation.
-
-`-mhard-float'
-     Generate output containing floating point instructions.  This is
-     the default if you use the unmodified sources.
-
-`-mabicalls'
-`-mno-abicalls'
-     Emit (or do not emit) the pseudo operations `.abicalls',
-     `.cpload', and `.cprestore' that some System V.4 ports use for
-     position independent code.
-
-`-mlong-calls'
-`-mno-long-calls'
-     Do all calls with the `JALR' instruction, which requires loading
-     up a function's address into a register before the call.  You need
-     to use this switch, if you call outside of the current 512
-     megabyte segment to functions that are not through pointers.
-
-`-mhalf-pic'
-`-mno-half-pic'
-     Put pointers to extern references into the data section and load
-     them up, rather than put the references in the text section.
-
-`-membedded-pic'
-`-mno-embedded-pic'
-     Generate PIC code suitable for some embedded systems.  All calls
-     are made using PC relative address, and all data is addressed
-     using the $gp register.  This requires GNU as and GNU ld which do
-     most of the work.
-
-`-membedded-data'
-`-mno-embedded-data'
-     Allocate variables to the read-only data section first if
-     possible, then next in the small data section if possible,
-     otherwise in data.  This gives slightly slower code than the
-     default, but reduces the amount of RAM required when executing,
-     and thus may be preferred for some embedded systems.
-
-`-msingle-float'
-`-mdouble-float'
-     The `-msingle-float' switch tells gcc to assume that the floating
-     point coprocessor only supports single precision operations, as on
-     the `r4650' chip.  The `-mdouble-float' switch permits gcc to use
-     double precision operations.  This is the default.
-
-`-mmad'
-`-mno-mad'
-     Permit use of the `mad', `madu' and `mul' instructions, as on the
-     `r4650' chip.
-
-`-m4650'
-     Turns on `-msingle-float', `-mmad', and, at least for now,
-     `-mcpu=r4650'.
-
-`-EL'
-     Compile code for the processor in little endian mode.  The
-     requisite libraries are assumed to exist.
-
-`-EB'
-     Compile code for the processor in big endian mode.  The requisite
-     libraries are assumed to exist.
-
-`-G NUM'
-     Put global and static items less than or equal to NUM bytes into
-     the small data or bss sections instead of the normal data or bss
-     section.  This allows the assembler to emit one word memory
-     reference instructions based on the global pointer (GP or $28),
-     instead of the normal two words used.  By default, NUM is 8 when
-     the MIPS assembler is used, and 0 when the GNU assembler is used.
-     The `-G NUM' switch is also passed to the assembler and linker.
-     All modules should be compiled with the same `-G NUM' value.
-
-`-nocpp'
-     Tell the MIPS assembler to not run it's preprocessor over user
-     assembler files (with a `.s' suffix) when assembling them.
-
-   These options are defined by the macro `TARGET_SWITCHES' in the
-machine description.  The default for the options is also defined by
-that macro, which enables you to change the defaults.
-
-\1f
-File: gcc.info,  Node: i386 Options,  Next: HPPA Options,  Prev: MIPS Options,  Up: Submodel Options
-
-Intel 386 Options
------------------
-
-   These `-m' options are defined for the i386 family of computers:
-
-`-m486'
-`-m386'
-     Control whether or not code is optimized for a 486 instead of an
-     386.  Code generated for an 486 will run on a 386 and vice versa.
-
-`-mieee-fp'
-`-mno-ieee-fp'
-     Control whether or not the compiler uses IEEE floating point
-     comparisons.  These handle correctly the case where the result of a
-     comparison is unordered.
-
-`-msoft-float'
-     Generate output containing library calls for floating point.
-     *Warning:* the requisite libraries are not part of GNU CC.
-     Normally the facilities of the machine's usual C compiler are
-     used, but this can't be done directly in cross-compilation.  You
-     must make your own arrangements to provide suitable library
-     functions for cross-compilation.
-
-     On machines where a function returns floating point results in the
-     80387 register stack, some floating point opcodes may be emitted
-     even if `-msoft-float' is used.
-
-`-mno-fp-ret-in-387'
-     Do not use the FPU registers for return values of functions.
-
-     The usual calling convention has functions return values of types
-     `float' and `double' in an FPU register, even if there is no FPU.
-     The idea is that the operating system should emulate an FPU.
-
-     The option `-mno-fp-ret-in-387' causes such values to be returned
-     in ordinary CPU registers instead.
-
-`-mno-fancy-math-387'
-     Some 387 emulators do not support the `sin', `cos' and `sqrt'
-     instructions for the 387.  Specify this option to avoid generating
-     those instructions. This option is the default on FreeBSD.  As of
-     revision 2.6.1, these instructions are not generated unless you
-     also use the `-ffast-math' switch.
-
-`-malign-double'
-`-mno-align-double'
-     Control whether GNU CC aligns `double', `long double', and `long
-     long' variables on a two word boundary or a one word boundary.
-     Aligning `double' variables on a two word boundary will produce
-     code that runs somewhat faster on a `Pentium' at the expense of
-     more memory.
-
-     *Warning:* if you use the `-malign-double' switch, structures
-     containing the above types will be aligned differently than the
-     published application binary interface specifications for the 386.
-
-`-msvr3-shlib'
-`-mno-svr3-shlib'
-     Control whether GNU CC places uninitialized locals into `bss' or
-     `data'.  `-msvr3-shlib' places these locals into `bss'.  These
-     options are meaningful only on System V Release 3.
-
-`-mno-wide-multiply'
-`-mwide-multiply'
-     Control whether GNU CC uses the `mul' and `imul' that produce 64
-     bit results in `eax:edx' from 32 bit operands to do `long long'
-     multiplies and 32-bit division by constants.
-
-`-mrtd'
-     Use a different function-calling convention, in which functions
-     that take a fixed number of arguments return with the `ret' NUM
-     instruction, which pops their arguments while returning.  This
-     saves one instruction in the caller since there is no need to pop
-     the arguments there.
-
-     You can specify that an individual function is called with this
-     calling sequence with the function attribute `stdcall'.  You can
-     also override the `-mrtd' option by using the function attribute
-     `cdecl'. *Note Function Attributes::
-
-     *Warning:* this calling convention is incompatible with the one
-     normally used on Unix, so you cannot use it if you need to call
-     libraries compiled with the Unix compiler.
-
-     Also, you must provide function prototypes for all functions that
-     take variable numbers of arguments (including `printf'); otherwise
-     incorrect code will be generated for calls to those functions.
-
-     In addition, seriously incorrect code will result if you call a
-     function with too many arguments.  (Normally, extra arguments are
-     harmlessly ignored.)
-
-`-mreg-alloc=REGS'
-     Control the default allocation order of integer registers.  The
-     string REGS is a series of letters specifying a register.  The
-     supported letters are: `a' allocate EAX; `b' allocate EBX; `c'
-     allocate ECX; `d' allocate EDX; `S' allocate ESI; `D' allocate
-     EDI; `B' allocate EBP.
-
-`-mregparm=NUM'
-     Control how many registers are used to pass integer arguments.  By
-     default, no registers are used to pass arguments, and at most 3
-     registers can be used.  You can control this behavior for a
-     specific function by using the function attribute `regparm'.
-     *Note Function Attributes::
-
-     *Warning:* if you use this switch, and NUM is nonzero, then you
-     must build all modules with the same value, including any
-     libraries.  This includes the system libraries and startup modules.
-
-`-malign-loops=NUM'
-     Align loops to a 2 raised to a NUM byte boundary.  If
-     `-malign-loops' is not specified, the default is 2.
-
-`-malign-jumps=NUM'
-     Align instructions that are only jumped to to a 2 raised to a NUM
-     byte boundary.  If `-malign-jumps' is not specified, the default is
-     2 if optimizing for a 386, and 4 if optimizing for a 486.
-
-`-malign-functions=NUM'
-     Align the start of functions to a 2 raised to NUM byte boundary.
-     If `-malign-functions' is not specified, the default is 2 if
-     optimizing for a 386, and 4 if optimizing for a 486.
-
-\1f
-File: gcc.info,  Node: HPPA Options,  Next: Intel 960 Options,  Prev: i386 Options,  Up: Submodel Options
-
-HPPA Options
-------------
-
-   These `-m' options are defined for the HPPA family of computers:
-
-`-mpa-risc-1-0'
-     Generate code for a PA 1.0 processor.
-
-`-mpa-risc-1-1'
-     Generate code for a PA 1.1 processor.
-
-`-mbig-switch'
-     Generate code suitable for big switch tables.  Use this option
-     only if the assembler/linker complain about out of range branches
-     within a switch table.
-
-`-mjump-in-delay'
-     Fill delay slots of function calls with unconditional jump
-     instructions by modifying the return pointer for the function call
-     to be the target of the conditional jump.
-
-`-mdisable-fpregs'
-     Prevent floating point registers from being used in any manner.
-     This is necessary for compiling kernels which perform lazy context
-     switching of floating point registers.  If you use this option and
-     attempt to perform floating point operations, the compiler will
-     abort.
-
-`-mdisable-indexing'
-     Prevent the compiler from using indexing address modes.  This
-     avoids some rather obscure problems when compiling MIG generated
-     code under MACH.
-
-`-mno-space-regs'
-     Generate code that assumes the target has no space registers.
-     This allows GCC to generate faster indirect calls and use unscaled
-     index address modes.
-
-     Such code is suitable for level 0 PA systems and kernels.
-
-`-mfast-indirect-calls'
-     Generate code that assumes calls never cross space boundaries.
-     This allows GCC to emit code which performs faster indirect calls.
-
-     This option will not work in the presense of shared libraries or
-     nested functions.
-
-`-mspace'
-     Optimize for space rather than execution time.  Currently this only
-     enables out of line function prologues and epilogues.  This option
-     is incompatable with PIC code generation and profiling.
-
-`-mlong-load-store'
-     Generate 3-instruction load and store sequences as sometimes
-     required by the HP-UX 10 linker.  This is equivalent to the `+k'
-     option to the HP compilers.
-
-`-mportable-runtime'
-     Use the portable calling conventions proposed by HP for ELF
-     systems.
-
-`-mgas'
-     Enable the use of assembler directives only GAS understands.
-
-`-mschedule=CPU TYPE'
-     Schedule code according to the constraints for the machine type
-     CPU TYPE.  The choices for CPU TYPE are `700' for 7N0 machines,
-     `7100' for 7N5 machines, and `7100' for 7N2 machines.  `7100' is
-     the default for CPU TYPE.
-
-     Note the `7100LC' scheduling information is incomplete and using
-     `7100LC' often leads to bad schedules.  For now it's probably best
-     to use `7100' instead of `7100LC' for the 7N2 machines.
-
-`-mlinker-opt'
-     Enable the optimization pass in the HPUX linker.  Note this makes
-     symbolic debugging impossible.  It also triggers a bug in the HPUX
-     8 and HPUX 9 linkers in which they give bogus error messages when
-     linking some programs.
-
-`-msoft-float'
-     Generate output containing library calls for floating point.
-     *Warning:* the requisite libraries are not available for all HPPA
-     targets.  Normally the facilities of the machine's usual C
-     compiler are used, but this cannot be done directly in
-     cross-compilation.  You must make your own arrangements to provide
-     suitable library functions for cross-compilation.  The embedded
-     target `hppa1.1-*-pro' does provide software floating point
-     support.
-
-     `-msoft-float' changes the calling convention in the output file;
-     therefore, it is only useful if you compile *all* of a program with
-     this option.  In particular, you need to compile `libgcc.a', the
-     library that comes with GNU CC, with `-msoft-float' in order for
-     this to work.
-
-\1f
-File: gcc.info,  Node: Intel 960 Options,  Next: DEC Alpha Options,  Prev: HPPA Options,  Up: Submodel Options
-
-Intel 960 Options
------------------
-
-   These `-m' options are defined for the Intel 960 implementations:
-
-`-mCPU TYPE'
-     Assume the defaults for the machine type CPU TYPE for some of the
-     other options, including instruction scheduling, floating point
-     support, and addressing modes.  The choices for CPU TYPE are `ka',
-     `kb', `mc', `ca', `cf', `sa', and `sb'.  The default is `kb'.
-
-`-mnumerics'
-`-msoft-float'
-     The `-mnumerics' option indicates that the processor does support
-     floating-point instructions.  The `-msoft-float' option indicates
-     that floating-point support should not be assumed.
-
-`-mleaf-procedures'
-`-mno-leaf-procedures'
-     Do (or do not) attempt to alter leaf procedures to be callable
-     with the `bal' instruction as well as `call'.  This will result in
-     more efficient code for explicit calls when the `bal' instruction
-     can be substituted by the assembler or linker, but less efficient
-     code in other cases, such as calls via function pointers, or using
-     a linker that doesn't support this optimization.
-
-`-mtail-call'
-`-mno-tail-call'
-     Do (or do not) make additional attempts (beyond those of the
-     machine-independent portions of the compiler) to optimize
-     tail-recursive calls into branches.  You may not want to do this
-     because the detection of cases where this is not valid is not
-     totally complete.  The default is `-mno-tail-call'.
-
-`-mcomplex-addr'
-`-mno-complex-addr'
-     Assume (or do not assume) that the use of a complex addressing
-     mode is a win on this implementation of the i960.  Complex
-     addressing modes may not be worthwhile on the K-series, but they
-     definitely are on the C-series.  The default is currently
-     `-mcomplex-addr' for all processors except the CB and CC.
-
-`-mcode-align'
-`-mno-code-align'
-     Align code to 8-byte boundaries for faster fetching (or don't
-     bother).  Currently turned on by default for C-series
-     implementations only.
-
-`-mic-compat'
-`-mic2.0-compat'
-`-mic3.0-compat'
-     Enable compatibility with iC960 v2.0 or v3.0.
-
-`-masm-compat'
-`-mintel-asm'
-     Enable compatibility with the iC960 assembler.
-
-`-mstrict-align'
-`-mno-strict-align'
-     Do not permit (do permit) unaligned accesses.
-
-`-mold-align'
-     Enable structure-alignment compatibility with Intel's gcc release
-     version 1.3 (based on gcc 1.37).  This option implies
-     `-mstrict-align'.
-
diff --git a/gcc/gcc.info-5 b/gcc/gcc.info-5
deleted file mode 100644 (file)
index dcf6541..0000000
+++ /dev/null
@@ -1,836 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: DEC Alpha Options,  Next: Clipper Options,  Prev: Intel 960 Options,  Up: Submodel Options
-
-DEC Alpha Options
------------------
-
-   These `-m' options are defined for the DEC Alpha implementations:
-
-`-mno-soft-float'
-`-msoft-float'
-     Use (do not use) the hardware floating-point instructions for
-     floating-point operations.  When `-msoft-float' is specified,
-     functions in `libgcc1.c' will be used to perform floating-point
-     operations.  Unless they are replaced by routines that emulate the
-     floating-point operations, or compiled in such a way as to call
-     such emulations routines, these routines will issue floating-point
-     operations.   If you are compiling for an Alpha without
-     floating-point operations, you must ensure that the library is
-     built so as not to call them.
-
-     Note that Alpha implementations without floating-point operations
-     are required to have floating-point registers.
-
-`-mfp-reg'
-`-mno-fp-regs'
-     Generate code that uses (does not use) the floating-point register
-     set.  `-mno-fp-regs' implies `-msoft-float'.  If the floating-point
-     register set is not used, floating point operands are passed in
-     integer registers as if they were integers and floating-point
-     results are passed in $0 instead of $f0.  This is a non-standard
-     calling sequence, so any function with a floating-point argument
-     or return value called by code compiled with `-mno-fp-regs' must
-     also be compiled with that option.
-
-     A typical use of this option is building a kernel that does not
-     use, and hence need not save and restore, any floating-point
-     registers.
-
-`-mieee'
-     The Alpha architecture implements floating-point hardware
-     optimized for maximum performance.  It is mostly compliant with
-     the IEEE floating point standard.  However, for full compliance,
-     software assistance is required.  This option generates code fully
-     IEEE compliant code *except* that the INEXACT FLAG is not
-     maintained (see below).  If this option is turned on, the CPP
-     macro `_IEEE_FP' is defined during compilation.  The option is a
-     shorthand for: `-D_IEEE_FP -mfp-trap-mode=su -mtrap-precision=i
-     -mieee-conformant'.  The resulting code is less efficient but is
-     able to correctly support denormalized numbers and exceptional
-     IEEE values such as not-a-number and plus/minus infinity.  Other
-     Alpha compilers call this option `-ieee_with_no_inexact'.
-
-`-mieee-with-inexact'
-     This is like `-mieee' except the generated code also maintains the
-     IEEE INEXACT FLAG.  Turning on this option causes the generated
-     code to implement fully-compliant IEEE math.  The option is a
-     shorthand for `-D_IEEE_FP -D_IEEE_FP_INEXACT' plus the three
-     following: `-mieee-conformant', `-mfp-trap-mode=sui', and
-     `-mtrap-precision=i'.  On some Alpha implementations the resulting
-     code may execute significantly slower than the code generated by
-     default.  Since there is very little code that depends on the
-     INEXACT FLAG, you should normally not specify this option.  Other
-     Alpha compilers call this option `-ieee_with_inexact'.
-
-`-mfp-trap-mode=TRAP MODE'
-     This option controls what floating-point related traps are enabled.
-     Other Alpha compilers call this option `-fptm 'TRAP MODE.  The
-     trap mode can be set to one of four values:
-
-    `n'
-          This is the default (normal) setting.  The only traps that
-          are enabled are the ones that cannot be disabled in software
-          (e.g., division by zero trap).
-
-    `u'
-          In addition to the traps enabled by `n', underflow traps are
-          enabled as well.
-
-    `su'
-          Like `su', but the instructions are marked to be safe for
-          software completion (see Alpha architecture manual for
-          details).
-
-    `sui'
-          Like `su', but inexact traps are enabled as well.
-
-`-mfp-rounding-mode=ROUNDING MODE'
-     Selects the IEEE rounding mode.  Other Alpha compilers call this
-     option `-fprm 'ROUNDING MODE.  The ROUNDING MODE can be one of:
-
-    `n'
-          Normal IEEE rounding mode.  Floating point numbers are
-          rounded towards the nearest machine number or towards the
-          even machine number in case of a tie.
-
-    `m'
-          Round towards minus infinity.
-
-    `c'
-          Chopped rounding mode.  Floating point numbers are rounded
-          towards zero.
-
-    `d'
-          Dynamic rounding mode.  A field in the floating point control
-          register (FPCR, see Alpha architecture reference manual)
-          controls the rounding mode in effect.  The C library
-          initializes this register for rounding towards plus infinity.
-          Thus, unless your program modifies the FPCR, `d' corresponds
-          to round towards plus infinity.
-
-`-mtrap-precision=TRAP PRECISION'
-     In the Alpha architecture, floating point traps are imprecise.
-     This means without software assistance it is impossible to recover
-     from a floating trap and program execution normally needs to be
-     terminated.  GNU CC can generate code that can assist operating
-     system trap handlers in determining the exact location that caused
-     a floating point trap.  Depending on the requirements of an
-     application, different levels of precisions can be selected:
-
-    `p'
-          Program precision.  This option is the default and means a
-          trap handler can only identify which program caused a
-          floating point exception.
-
-    `f'
-          Function precision.  The trap handler can determine the
-          function that caused a floating point exception.
-
-    `i'
-          Instruction precision.  The trap handler can determine the
-          exact instruction that caused a floating point exception.
-
-     Other Alpha compilers provide the equivalent options called
-     `-scope_safe' and `-resumption_safe'.
-
-`-mieee-conformant'
-     This option marks the generated code as IEEE conformant.  You must
-     not use this option unless you also specify `-mtrap-precision=i'
-     and either `-mfp-trap-mode=su' or `-mfp-trap-mode=sui'.  Its only
-     effect is to emit the line `.eflag 48' in the function prologue of
-     the generated assembly file.  Under DEC Unix, this has the effect
-     that IEEE-conformant math library routines will be linked in.
-
-`-mbuild-constants'
-     Normally GNU CC examines a 32- or 64-bit integer constant to see
-     if it can construct it from smaller constants in two or three
-     instructions.  If it cannot, it will output the constant as a
-     literal and generate code to load it from the data segement at
-     runtime.
-
-     Use this option to require GNU CC to construct *all* integer
-     constants using code, even if it takes more instructions (the
-     maximum is six).
-
-     You would typically use this option to build a shared library
-     dynamic loader.  Itself a shared library, it must relocate itself
-     in memory before it can find the variables and constants in its
-     own data segment.
-
-\1f
-File: gcc.info,  Node: Clipper Options,  Next: H8/300 Options,  Prev: DEC Alpha Options,  Up: Submodel Options
-
-Clipper Options
----------------
-
-   These `-m' options are defined for the Clipper implementations:
-
-`-mc300'
-     Produce code for a C300 Clipper processor. This is the default.
-
-`-mc400'
-     Produce code for a C400 Clipper processor i.e. use floating point
-     registers f8..f15.
-
-\1f
-File: gcc.info,  Node: H8/300 Options,  Next: SH Options,  Prev: Clipper Options,  Up: Submodel Options
-
-H8/300 Options
---------------
-
-   These `-m' options are defined for the H8/300 implementations:
-
-`-mrelax'
-     Shorten some address references at link time, when possible; uses
-     the linker option `-relax'.  *Note `ld' and the H8/300:
-     (ld.info)H8/300, for a fuller description.
-
-`-mh'
-     Generate code for the H8/300H.
-
-`-ms'
-     Generate code for the H8/S.
-
-`-mint32'
-     Make `int' data 32 bits by default.
-
-`-malign-300'
-     On the h8/300h, use the same alignment rules as for the h8/300.
-     The default for the h8/300h is to align longs and floats on 4 byte
-     boundaries.  `-malign-300' causes them to be aligned on 2 byte
-     boundaries.  This option has no effect on the h8/300.
-
-\1f
-File: gcc.info,  Node: SH Options,  Next: System V Options,  Prev: H8/300 Options,  Up: Submodel Options
-
-SH Options
-----------
-
-   These `-m' options are defined for the SH implementations:
-
-`-m1'
-     Generate code for the SH1.
-
-`-m2'
-     Generate code for the SH2.
-
-`-m3'
-     Generate code for the SH3.
-
-`-m3e'
-     Generate code for the SH3e.
-
-`-mb'
-     Compile code for the processor in big endian mode.
-
-`-ml'
-     Compile code for the processor in little endian mode.
-
-`-mrelax'
-     Shorten some address references at link time, when possible; uses
-     the linker option `-relax'.
-
-\1f
-File: gcc.info,  Node: System V Options,  Next: V850 Options,  Prev: SH Options,  Up: Submodel Options
-
-Options for System V
---------------------
-
-   These additional options are available on System V Release 4 for
-compatibility with other compilers on those systems:
-
-`-G'
-     Create a shared object.  It is recommended that `-symbolic' or
-     `-shared' be used instead.
-
-`-Qy'
-     Identify the versions of each tool used by the compiler, in a
-     `.ident' assembler directive in the output.
-
-`-Qn'
-     Refrain from adding `.ident' directives to the output file (this is
-     the default).
-
-`-YP,DIRS'
-     Search the directories DIRS, and no others, for libraries
-     specified with `-l'.
-
-`-Ym,DIR'
-     Look in the directory DIR to find the M4 preprocessor.  The
-     assembler uses this option.
-
-\1f
-File: gcc.info,  Node: V850 Options,  Prev: System V Options,  Up: Submodel Options
-
-V850 Options
-------------
-
-   These `-m' options are defined for V850 implementations:
-
-`-mlong-calls'
-`-mno-long-calls'
-     Treat all calls as being far away (near).  If calls are assumed to
-     be far away, the compiler will always load the functions address
-     up into a register, and call indirect through the pointer.
-
-`-mno-ep'
-
-`-mep'
-     Do not optimize (do optimize) basic blocks that use the same index
-     pointer 4 or more times to copy pointer into the `ep' register, and
-     use the shorter `sld' and `sst' instructions.  The `-mep' option
-     is on by default if you optimize.
-
-`-mno-prolog-function'
-`-mprolog-function'
-     Do not use (do use) external functions to save and restore
-     registers at the prolog and epilog of a function.  The external
-     functions are slower, but use less code space if more than one
-     function saves the same number of registers.  The
-     `-mprolog-function' option is on by default if you optimize.
-
-`-mspace'
-     Try to make the code as small as possible.  At present, this just
-     turns on the `-mep' and `-mprolog-function' options.
-
-`-mtda=N'
-     Put static or global variables whose size is N bytes or less into
-     the tiny data area that register `ep' points to.  The tiny data
-     area can hold up to 256 bytes in total (128 bytes for byte
-     references).
-
-`-msda=N'
-     Put static or global variables whose size is N bytes or less into
-     the small data area that register `gp' points to.  The small data
-     area can hold up to 64 kilobytes.
-
-`-mzda=N'
-     Put static or global variables whose size is N bytes or less into
-     the first 32 kilobytes of memory.
-
-`-mv850'
-     Specify that the target processor is the V850.
-
-`-mbig-switch'
-     Generate code suitable for big switch tables.  Use this option
-     only if the assembler/linker complain about out of range branches
-     within a switch table.
-
-\1f
-File: gcc.info,  Node: Code Gen Options,  Next: Environment Variables,  Prev: Submodel Options,  Up: Invoking GCC
-
-Options for Code Generation Conventions
-=======================================
-
-   These machine-independent options control the interface conventions
-used in code generation.
-
-   Most of them have both positive and negative forms; the negative form
-of `-ffoo' would be `-fno-foo'.  In the table below, only one of the
-forms is listed--the one which is not the default.  You can figure out
-the other form by either removing `no-' or adding it.
-
-`-fpcc-struct-return'
-     Return "short" `struct' and `union' values in memory like longer
-     ones, rather than in registers.  This convention is less
-     efficient, but it has the advantage of allowing intercallability
-     between GNU CC-compiled files and files compiled with other
-     compilers.
-
-     The precise convention for returning structures in memory depends
-     on the target configuration macros.
-
-     Short structures and unions are those whose size and alignment
-     match that of some integer type.
-
-`-freg-struct-return'
-     Use the convention that `struct' and `union' values are returned
-     in registers when possible.  This is more efficient for small
-     structures than `-fpcc-struct-return'.
-
-     If you specify neither `-fpcc-struct-return' nor its contrary
-     `-freg-struct-return', GNU CC defaults to whichever convention is
-     standard for the target.  If there is no standard convention, GNU
-     CC defaults to `-fpcc-struct-return', except on targets where GNU
-     CC is the principal compiler.  In those cases, we can choose the
-     standard, and we chose the more efficient register return
-     alternative.
-
-`-fshort-enums'
-     Allocate to an `enum' type only as many bytes as it needs for the
-     declared range of possible values.  Specifically, the `enum' type
-     will be equivalent to the smallest integer type which has enough
-     room.
-
-`-fshort-double'
-     Use the same size for `double' as for `float'.
-
-`-fshared-data'
-     Requests that the data and non-`const' variables of this
-     compilation be shared data rather than private data.  The
-     distinction makes sense only on certain operating systems, where
-     shared data is shared between processes running the same program,
-     while private data exists in one copy per process.
-
-`-fno-common'
-     Allocate even uninitialized global variables in the bss section of
-     the object file, rather than generating them as common blocks.
-     This has the effect that if the same variable is declared (without
-     `extern') in two different compilations, you will get an error
-     when you link them.  The only reason this might be useful is if
-     you wish to verify that the program will work on other systems
-     which always work this way.
-
-`-fno-ident'
-     Ignore the `#ident' directive.
-
-`-fno-gnu-linker'
-     Do not output global initializations (such as C++ constructors and
-     destructors) in the form used by the GNU linker (on systems where
-     the GNU linker is the standard method of handling them).  Use this
-     option when you want to use a non-GNU linker, which also requires
-     using the `collect2' program to make sure the system linker
-     includes constructors and destructors.  (`collect2' is included in
-     the GNU CC distribution.)  For systems which *must* use
-     `collect2', the compiler driver `gcc' is configured to do this
-     automatically.
-
-`-finhibit-size-directive'
-     Don't output a `.size' assembler directive, or anything else that
-     would cause trouble if the function is split in the middle, and the
-     two halves are placed at locations far apart in memory.  This
-     option is used when compiling `crtstuff.c'; you should not need to
-     use it for anything else.
-
-`-fverbose-asm'
-     Put extra commentary information in the generated assembly code to
-     make it more readable.  This option is generally only of use to
-     those who actually need to read the generated assembly code
-     (perhaps while debugging the compiler itself).
-
-     `-fverbose-asm' is the default.  `-fno-verbose-asm' causes the
-     extra information to be omitted and is useful when comparing two
-     assembler files.
-
-`-fvolatile'
-     Consider all memory references through pointers to be volatile.
-
-`-fvolatile-global'
-     Consider all memory references to extern and global data items to
-     be volatile.
-
-`-fpic'
-     Generate position-independent code (PIC) suitable for use in a
-     shared library, if supported for the target machine.  Such code
-     accesses all constant addresses through a global offset table
-     (GOT).  The dynamic loader resolves the GOT entries when the
-     program starts (the dynamic loader is not part of GNU CC; it is
-     part of the operating system).  If the GOT size for the linked
-     executable exceeds a machine-specific maximum size, you get an
-     error message from the linker indicating that `-fpic' does not
-     work; in that case, recompile with `-fPIC' instead.  (These
-     maximums are 16k on the m88k, 8k on the Sparc, and 32k on the m68k
-     and RS/6000.  The 386 has no such limit.)
-
-     Position-independent code requires special support, and therefore
-     works only on certain machines.  For the 386, GNU CC supports PIC
-     for System V but not for the Sun 386i.  Code generated for the IBM
-     RS/6000 is always position-independent.
-
-`-fPIC'
-     If supported for the target machine, emit position-independent
-     code, suitable for dynamic linking and avoiding any limit on the
-     size of the global offset table.  This option makes a difference
-     on the m68k, m88k, and the Sparc.
-
-     Position-independent code requires special support, and therefore
-     works only on certain machines.
-
-`-ffixed-REG'
-     Treat the register named REG as a fixed register; generated code
-     should never refer to it (except perhaps as a stack pointer, frame
-     pointer or in some other fixed role).
-
-     REG must be the name of a register.  The register names accepted
-     are machine-specific and are defined in the `REGISTER_NAMES' macro
-     in the machine description macro file.
-
-     This flag does not have a negative form, because it specifies a
-     three-way choice.
-
-`-fcall-used-REG'
-     Treat the register named REG as an allocatable register that is
-     clobbered by function calls.  It may be allocated for temporaries
-     or variables that do not live across a call.  Functions compiled
-     this way will not save and restore the register REG.
-
-     Use of this flag for a register that has a fixed pervasive role in
-     the machine's execution model, such as the stack pointer or frame
-     pointer, will produce disastrous results.
-
-     This flag does not have a negative form, because it specifies a
-     three-way choice.
-
-`-fcall-saved-REG'
-     Treat the register named REG as an allocatable register saved by
-     functions.  It may be allocated even for temporaries or variables
-     that live across a call.  Functions compiled this way will save
-     and restore the register REG if they use it.
-
-     Use of this flag for a register that has a fixed pervasive role in
-     the machine's execution model, such as the stack pointer or frame
-     pointer, will produce disastrous results.
-
-     A different sort of disaster will result from the use of this flag
-     for a register in which function values may be returned.
-
-     This flag does not have a negative form, because it specifies a
-     three-way choice.
-
-`-fpack-struct'
-     Pack all structure members together without holes.  Usually you
-     would not want to use this option, since it makes the code
-     suboptimal, and the offsets of structure members won't agree with
-     system libraries.
-
-`-fcheck-memory-usage'
-     Generate extra code to check each memory access.  GNU CC will
-     generate code that is suitable for a detector of bad memory
-     accesses such as `Checker'.  If you specify this option, you can
-     not use the `asm' or `__asm__' keywords.
-
-     You must also specify this option when you compile functions you
-     call that have side effects.  If you do not, you may get erronous
-     messages from the detector.  Normally,  you should compile all
-     your code with this option.  If you use functions from a library
-     that have side-effects (such as `read'), you may not be able to
-     recompile the library and specify this option.  In that case, you
-     can enable the `-fprefix-function-name' option, which requests GNU
-     CC to encapsulate your code and make other functions look as if
-     they were compiled with `-fcheck-memory-usage'.  This is done by
-     calling "stubs", which are provided by the detector.  If you
-     cannot find or build stubs for every function you call, you may
-     have to specify `-fcheck-memory-usage' without
-     `-fprefix-function-name'.
-
-`-fprefix-function-name'
-     Request GNU CC to add a prefix to the symbols generated for
-     function names.  GNU CC adds a prefix to the names of functions
-     defined as well as functions called.  Code compiled with this
-     option and code compiled without the option can't be linked
-     together, unless or stubs are used.
-
-     If you compile the following code with `-fprefix-function-name'
-          extern void bar (int);
-          void
-          foo (int a)
-          {
-            return bar (a + 5);
-          
-          }
-
-     GNU CC will compile the code as if it was written:
-          extern void prefix_bar (int);
-          void
-          prefix_foo (int a)
-          {
-            return prefix_bar (a + 5);
-          }
-     This option is designed to be used with `-fcheck-memory-usage'.
-
-`-fstack-check'
-     Generate code to verify that you do not go beyond the boundary of
-     the stack.  You should specify this flag if you are running in an
-     environment with multiple threads, but only rarely need to specify
-     it in a single-threaded environment since stack overflow is
-     automatically detected on nearly all systems if there is only one
-     stack.
-
-`+e0'
-`+e1'
-     Control whether virtual function definitions in classes are used to
-     generate code, or only to define interfaces for their callers.
-     (C++ only).
-
-     These options are provided for compatibility with `cfront' 1.x
-     usage; the recommended alternative GNU C++ usage is in flux.
-     *Note Declarations and Definitions in One Header: C++ Interface.
-
-     With `+e0', virtual function definitions in classes are declared
-     `extern'; the declaration is used only as an interface
-     specification, not to generate code for the virtual functions (in
-     this compilation).
-
-     With `+e1', G++ actually generates the code implementing virtual
-     functions defined in the code, and makes them publicly visible.
-
-\1f
-File: gcc.info,  Node: Environment Variables,  Next: Running Protoize,  Prev: Code Gen Options,  Up: Invoking GCC
-
-Environment Variables Affecting GNU CC
-======================================
-
-   This section describes several environment variables that affect how
-GNU CC operates.  They work by specifying directories or prefixes to use
-when searching for various kinds of files.
-
-   Note that you can also specify places to search using options such as
-`-B', `-I' and `-L' (*note Directory Options::.).  These take
-precedence over places specified using environment variables, which in
-turn take precedence over those specified by the configuration of GNU
-CC.  *Note Driver::.
-
-`TMPDIR'
-     If `TMPDIR' is set, it specifies the directory to use for temporary
-     files.  GNU CC uses temporary files to hold the output of one
-     stage of compilation which is to be used as input to the next
-     stage: for example, the output of the preprocessor, which is the
-     input to the compiler proper.
-
-`GCC_EXEC_PREFIX'
-     If `GCC_EXEC_PREFIX' is set, it specifies a prefix to use in the
-     names of the subprograms executed by the compiler.  No slash is
-     added when this prefix is combined with the name of a subprogram,
-     but you can specify a prefix that ends with a slash if you wish.
-
-     If GNU CC cannot find the subprogram using the specified prefix, it
-     tries looking in the usual places for the subprogram.
-
-     The default value of `GCC_EXEC_PREFIX' is `PREFIX/lib/gcc-lib/'
-     where PREFIX is the value of `prefix' when you ran the `configure'
-     script.
-
-     Other prefixes specified with `-B' take precedence over this
-     prefix.
-
-     This prefix is also used for finding files such as `crt0.o' that
-     are used for linking.
-
-     In addition, the prefix is used in an unusual way in finding the
-     directories to search for header files.  For each of the standard
-     directories whose name normally begins with
-     `/usr/local/lib/gcc-lib' (more precisely, with the value of
-     `GCC_INCLUDE_DIR'), GNU CC tries replacing that beginning with the
-     specified prefix to produce an alternate directory name.  Thus,
-     with `-Bfoo/', GNU CC will search `foo/bar' where it would
-     normally search `/usr/local/lib/bar'.  These alternate directories
-     are searched first; the standard directories come next.
-
-`COMPILER_PATH'
-     The value of `COMPILER_PATH' is a colon-separated list of
-     directories, much like `PATH'.  GNU CC tries the directories thus
-     specified when searching for subprograms, if it can't find the
-     subprograms using `GCC_EXEC_PREFIX'.
-
-`LIBRARY_PATH'
-     The value of `LIBRARY_PATH' is a colon-separated list of
-     directories, much like `PATH'.  When configured as a native
-     compiler, GNU CC tries the directories thus specified when
-     searching for special linker files, if it can't find them using
-     `GCC_EXEC_PREFIX'.  Linking using GNU CC also uses these
-     directories when searching for ordinary libraries for the `-l'
-     option (but directories specified with `-L' come first).
-
-`C_INCLUDE_PATH'
-`CPLUS_INCLUDE_PATH'
-`OBJC_INCLUDE_PATH'
-     These environment variables pertain to particular languages.  Each
-     variable's value is a colon-separated list of directories, much
-     like `PATH'.  When GNU CC searches for header files, it tries the
-     directories listed in the variable for the language you are using,
-     after the directories specified with `-I' but before the standard
-     header file directories.
-
-`DEPENDENCIES_OUTPUT'
-     If this variable is set, its value specifies how to output
-     dependencies for Make based on the header files processed by the
-     compiler.  This output looks much like the output from the `-M'
-     option (*note Preprocessor Options::.), but it goes to a separate
-     file, and is in addition to the usual results of compilation.
-
-     The value of `DEPENDENCIES_OUTPUT' can be just a file name, in
-     which case the Make rules are written to that file, guessing the
-     target name from the source file name.  Or the value can have the
-     form `FILE TARGET', in which case the rules are written to file
-     FILE using TARGET as the target name.
-
-\1f
-File: gcc.info,  Node: Running Protoize,  Prev: Environment Variables,  Up: Invoking GCC
-
-Running Protoize
-================
-
-   The program `protoize' is an optional part of GNU C.  You can use it
-to add prototypes to a program, thus converting the program to ANSI C
-in one respect.  The companion program `unprotoize' does the reverse:
-it removes argument types from any prototypes that are found.
-
-   When you run these programs, you must specify a set of source files
-as command line arguments.  The conversion programs start out by
-compiling these files to see what functions they define.  The
-information gathered about a file FOO is saved in a file named `FOO.X'.
-
-   After scanning comes actual conversion.  The specified files are all
-eligible to be converted; any files they include (whether sources or
-just headers) are eligible as well.
-
-   But not all the eligible files are converted.  By default,
-`protoize' and `unprotoize' convert only source and header files in the
-current directory.  You can specify additional directories whose files
-should be converted with the `-d DIRECTORY' option.  You can also
-specify particular files to exclude with the `-x FILE' option.  A file
-is converted if it is eligible, its directory name matches one of the
-specified directory names, and its name within the directory has not
-been excluded.
-
-   Basic conversion with `protoize' consists of rewriting most function
-definitions and function declarations to specify the types of the
-arguments.  The only ones not rewritten are those for varargs functions.
-
-   `protoize' optionally inserts prototype declarations at the
-beginning of the source file, to make them available for any calls that
-precede the function's definition.  Or it can insert prototype
-declarations with block scope in the blocks where undeclared functions
-are called.
-
-   Basic conversion with `unprotoize' consists of rewriting most
-function declarations to remove any argument types, and rewriting
-function definitions to the old-style pre-ANSI form.
-
-   Both conversion programs print a warning for any function
-declaration or definition that they can't convert.  You can suppress
-these warnings with `-q'.
-
-   The output from `protoize' or `unprotoize' replaces the original
-source file.  The original file is renamed to a name ending with
-`.save'.  If the `.save' file already exists, then the source file is
-simply discarded.
-
-   `protoize' and `unprotoize' both depend on GNU CC itself to scan the
-program and collect information about the functions it uses.  So
-neither of these programs will work until GNU CC is installed.
-
-   Here is a table of the options you can use with `protoize' and
-`unprotoize'.  Each option works with both programs unless otherwise
-stated.
-
-`-B DIRECTORY'
-     Look for the file `SYSCALLS.c.X' in DIRECTORY, instead of the
-     usual directory (normally `/usr/local/lib').  This file contains
-     prototype information about standard system functions.  This option
-     applies only to `protoize'.
-
-`-c COMPILATION-OPTIONS'
-     Use  COMPILATION-OPTIONS as the options when running `gcc' to
-     produce the `.X' files.  The special option `-aux-info' is always
-     passed in addition, to tell `gcc' to write a `.X' file.
-
-     Note that the compilation options must be given as a single
-     argument to `protoize' or `unprotoize'.  If you want to specify
-     several `gcc' options, you must quote the entire set of
-     compilation options to make them a single word in the shell.
-
-     There are certain `gcc' arguments that you cannot use, because they
-     would produce the wrong kind of output.  These include `-g', `-O',
-     `-c', `-S', and `-o' If you include these in the
-     COMPILATION-OPTIONS, they are ignored.
-
-`-C'
-     Rename files to end in `.C' instead of `.c'.  This is convenient
-     if you are converting a C program to C++.  This option applies
-     only to `protoize'.
-
-`-g'
-     Add explicit global declarations.  This means inserting explicit
-     declarations at the beginning of each source file for each function
-     that is called in the file and was not declared.  These
-     declarations precede the first function definition that contains a
-     call to an undeclared function.  This option applies only to
-     `protoize'.
-
-`-i STRING'
-     Indent old-style parameter declarations with the string STRING.
-     This option applies only to `protoize'.
-
-     `unprotoize' converts prototyped function definitions to old-style
-     function definitions, where the arguments are declared between the
-     argument list and the initial `{'.  By default, `unprotoize' uses
-     five spaces as the indentation.  If you want to indent with just
-     one space instead, use `-i " "'.
-
-`-k'
-     Keep the `.X' files.  Normally, they are deleted after conversion
-     is finished.
-
-`-l'
-     Add explicit local declarations.  `protoize' with `-l' inserts a
-     prototype declaration for each function in each block which calls
-     the function without any declaration.  This option applies only to
-     `protoize'.
-
-`-n'
-     Make no real changes.  This mode just prints information about the
-     conversions that would have been done without `-n'.
-
-`-N'
-     Make no `.save' files.  The original files are simply deleted.
-     Use this option with caution.
-
-`-p PROGRAM'
-     Use the program PROGRAM as the compiler.  Normally, the name `gcc'
-     is used.
-
-`-q'
-     Work quietly.  Most warnings are suppressed.
-
-`-v'
-     Print the version number, just like `-v' for `gcc'.
-
-   If you need special compiler options to compile one of your program's
-source files, then you should generate that file's `.X' file specially,
-by running `gcc' on that source file with the appropriate options and
-the option `-aux-info'.  Then run `protoize' on the entire set of
-files.  `protoize' will use the existing `.X' file because it is newer
-than the source file.  For example:
-
-     gcc -Dfoo=bar file1.c -aux-info
-     protoize *.c
-
-You need to include the special files along with the rest in the
-`protoize' command, even though their `.X' files already exist, because
-otherwise they won't get converted.
-
-   *Note Protoize Caveats::, for more information on how to use
-`protoize' successfully.
-
diff --git a/gcc/gcc.info-6 b/gcc/gcc.info-6
deleted file mode 100644 (file)
index e8e3919..0000000
+++ /dev/null
@@ -1,537 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Installation,  Next: C Extensions,  Prev: Invoking GCC,  Up: Top
-
-Installing GNU CC
-*****************
-
-* Menu:
-
-* Configurations::    Configurations Supported by GNU CC.
-* Other Dir::     Compiling in a separate directory (not where the source is).
-* Cross-Compiler::   Building and installing a cross-compiler.
-* Sun Install::   See below for installation on the Sun.
-* VMS Install::   See below for installation on VMS.
-* Collect2::     How `collect2' works; how it finds `ld'.
-* Header Dirs::   Understanding the standard header file directories.
-
-   Here is the procedure for installing GNU CC on a Unix system.  See
-*Note VMS Install::, for VMS systems.  In this section we assume you
-compile in the same directory that contains the source files; see *Note
-Other Dir::, to find out how to compile in a separate directory on Unix
-systems.
-
-   You cannot install GNU C by itself on MSDOS; it will not compile
-under any MSDOS compiler except itself.  You need to get the complete
-compilation package DJGPP, which includes binaries as well as sources,
-and includes all the necessary compilation tools and libraries.
-
-  1. If you have built GNU CC previously in the same directory for a
-     different target machine, do `make distclean' to delete all files
-     that might be invalid.  One of the files this deletes is
-     `Makefile'; if `make distclean' complains that `Makefile' does not
-     exist, it probably means that the directory is already suitably
-     clean.
-
-  2. On a System V release 4 system, make sure `/usr/bin' precedes
-     `/usr/ucb' in `PATH'.  The `cc' command in `/usr/ucb' uses
-     libraries which have bugs.
-
-  3. Specify the host, build and target machine configurations.  You do
-     this by running the file `configure'.
-
-     The "build" machine is the system which you are using, the "host"
-     machine is the system where you want to run the resulting compiler
-     (normally the build machine), and the "target" machine is the
-     system for which you want the compiler to generate code.
-
-     If you are building a compiler to produce code for the machine it
-     runs on (a native compiler), you normally do not need to specify
-     any operands to `configure'; it will try to guess the type of
-     machine you are on and use that as the build, host and target
-     machines.  So you don't need to specify a configuration when
-     building a native compiler unless `configure' cannot figure out
-     what your configuration is or guesses wrong.
-
-     In those cases, specify the build machine's "configuration name"
-     with the `--build' option; the host and target will default to be
-     the same as the build machine.  (If you are building a
-     cross-compiler, see *Note Cross-Compiler::.)
-
-     Here is an example:
-
-          ./configure --build=sparc-sun-sunos4.1
-
-     A configuration name may be canonical or it may be more or less
-     abbreviated.
-
-     A canonical configuration name has three parts, separated by
-     dashes.  It looks like this: `CPU-COMPANY-SYSTEM'.  (The three
-     parts may themselves contain dashes; `configure' can figure out
-     which dashes serve which purpose.)  For example,
-     `m68k-sun-sunos4.1' specifies a Sun 3.
-
-     You can also replace parts of the configuration by nicknames or
-     aliases.  For example, `sun3' stands for `m68k-sun', so
-     `sun3-sunos4.1' is another way to specify a Sun 3.  You can also
-     use simply `sun3-sunos', since the version of SunOS is assumed by
-     default to be version 4.
-
-     You can specify a version number after any of the system types,
-     and some of the CPU types.  In most cases, the version is
-     irrelevant, and will be ignored.  So you might as well specify the
-     version if you know it.
-
-     See *Note Configurations::, for a list of supported configuration
-     names and notes on many of the configurations.  You should check
-     the notes in that section before proceeding any further with the
-     installation of GNU CC.
-
-     There are four additional options you can specify independently to
-     describe variant hardware and software configurations.  These are
-     `--with-gnu-as', `--with-gnu-ld', `--with-stabs' and `--nfp'.
-
-    `--with-gnu-as'
-          If you will use GNU CC with the GNU assembler (GAS), you
-          should declare this by using the `--with-gnu-as' option when
-          you run `configure'.
-
-          Using this option does not install GAS.  It only modifies the
-          output of GNU CC to work with GAS.  Building and installing
-          GAS is up to you.
-
-          Conversely, if you *do not* wish to use GAS and do not specify
-          `--with-gnu-as' when building GNU CC, it is up to you to make
-          sure that GAS is not installed.  GNU CC searches for a
-          program named `as' in various directories; if the program it
-          finds is GAS, then it runs GAS.  If you are not sure where
-          GNU CC finds the assembler it is using, try specifying `-v'
-          when you run it.
-
-          The systems where it makes a difference whether you use GAS
-          are
-          `hppa1.0-ANY-ANY', `hppa1.1-ANY-ANY', `i386-ANY-sysv',
-          `i386-ANY-isc',
-          `i860-ANY-bsd', `m68k-bull-sysv',
-          `m68k-hp-hpux', `m68k-sony-bsd',
-          `m68k-altos-sysv', `m68000-hp-hpux',
-          `m68000-att-sysv', `ANY-lynx-lynxos', and `mips-ANY').  On
-          any other system, `--with-gnu-as' has no effect.
-
-          On the systems listed above (except for the HP-PA, for ISC on
-          the 386, and for `mips-sgi-irix5.*'), if you use GAS, you
-          should also use the GNU linker (and specify `--with-gnu-ld').
-
-    `--with-gnu-ld'
-          Specify the option `--with-gnu-ld' if you plan to use the GNU
-          linker with GNU CC.
-
-          This option does not cause the GNU linker to be installed; it
-          just modifies the behavior of GNU CC to work with the GNU
-          linker.  Specifically, it inhibits the installation of
-          `collect2', a program which otherwise serves as a front-end
-          for the system's linker on most configurations.
-
-    `--with-stabs'
-          On MIPS based systems and on Alphas, you must specify whether
-          you want GNU CC to create the normal ECOFF debugging format,
-          or to use BSD-style stabs passed through the ECOFF symbol
-          table.  The normal ECOFF debug format cannot fully handle
-          languages other than C.  BSD stabs format can handle other
-          languages, but it only works with the GNU debugger GDB.
-
-          Normally, GNU CC uses the ECOFF debugging format by default;
-          if you prefer BSD stabs, specify `--with-stabs' when you
-          configure GNU CC.
-
-          No matter which default you choose when you configure GNU CC,
-          the user can use the `-gcoff' and `-gstabs+' options to
-          specify explicitly the debug format for a particular
-          compilation.
-
-          `--with-stabs' is meaningful on the ISC system on the 386,
-          also, if `--with-gas' is used.  It selects use of stabs
-          debugging information embedded in COFF output.  This kind of
-          debugging information supports C++ well; ordinary COFF
-          debugging information does not.
-
-          `--with-stabs' is also meaningful on 386 systems running
-          SVR4.  It selects use of stabs debugging information embedded
-          in ELF output.  The C++ compiler currently (2.6.0) does not
-          support the DWARF debugging information normally used on 386
-          SVR4 platforms; stabs provide a workable alternative.  This
-          requires gas and gdb, as the normal SVR4 tools can not
-          generate or interpret stabs.
-
-    `--nfp'
-          On certain systems, you must specify whether the machine has
-          a floating point unit.  These systems include
-          `m68k-sun-sunosN' and `m68k-isi-bsd'.  On any other system,
-          `--nfp' currently has no effect, though perhaps there are
-          other systems where it could usefully make a difference.
-
-    `--enable-objcthreads=TYPE'
-          Certain systems, notably Linux-based GNU systems, can't be
-          relied on to supply a threads facility for the Objective C
-          runtime and so will default to single-threaded runtime.  They
-          may, however, have a library threads implementation
-          available, in which case threads can be enabled with this
-          option by supplying a suitable TYPE, probably `posix'.  The
-          possibilities for TYPE are `single', `posix', `win32',
-          `solaris', `irix' and `mach'.
-
-     The `configure' script searches subdirectories of the source
-     directory for other compilers that are to be integrated into GNU
-     CC.  The GNU compiler for C++, called G++ is in a subdirectory
-     named `cp'.  `configure' inserts rules into `Makefile' to build
-     all of those compilers.
-
-     Here we spell out what files will be set up by `configure'.
-     Normally you need not be concerned with these files.
-
-        * A file named `config.h' is created that contains a `#include'
-          of the top-level config file for the machine you will run the
-          compiler on (*note Config::.).  This file is responsible for
-          defining information about the host machine.  It includes
-          `tm.h'.
-
-          The top-level config file is located in the subdirectory
-          `config'.  Its name is always `xm-SOMETHING.h'; usually
-          `xm-MACHINE.h', but there are some exceptions.
-
-          If your system does not support symbolic links, you might
-          want to set up `config.h' to contain a `#include' command
-          which refers to the appropriate file.
-
-        * A file named `tconfig.h' is created which includes the
-          top-level config file for your target machine.  This is used
-          for compiling certain programs to run on that machine.
-
-        * A file named `tm.h' is created which includes the
-          machine-description macro file for your target machine.  It
-          should be in the subdirectory `config' and its name is often
-          `MACHINE.h'.
-
-        * The command file `configure' also constructs the file
-          `Makefile' by adding some text to the template file
-          `Makefile.in'.  The additional text comes from files in the
-          `config' directory, named `t-TARGET' and `x-HOST'.  If these
-          files do not exist, it means nothing needs to be added for a
-          given target or host.
-
-  4. The standard directory for installing GNU CC is `/usr/local/lib'.
-     If you want to install its files somewhere else, specify
-     `--prefix=DIR' when you run `configure'.  Here DIR is a directory
-     name to use instead of `/usr/local' for all purposes with one
-     exception: the directory `/usr/local/include' is searched for
-     header files no matter where you install the compiler.  To override
-     this name, use the `--local-prefix' option below.
-
-  5. Specify `--local-prefix=DIR' if you want the compiler to search
-     directory `DIR/include' for locally installed header files
-     *instead* of `/usr/local/include'.
-
-     You should specify `--local-prefix' *only* if your site has a
-     different convention (not `/usr/local') for where to put
-     site-specific files.
-
-     The default value for `--local-prefix' is `/usr/local' regardless
-     of the value of `--prefix'.  Specifying `--prefix' has no effect
-     on which directory GNU CC searches for local header files.  This
-     may seem counterintuitive, but actually it is logical.
-
-     The purpose of `--prefix' is to specify where to *install GNU CC*.
-     The local header files in `/usr/local/include'--if you put any in
-     that directory--are not part of GNU CC.  They are part of other
-     programs--perhaps many others.  (GNU CC installs its own header
-     files in another directory which is based on the `--prefix' value.)
-
-     *Do not* specify `/usr' as the `--local-prefix'!  The directory
-     you use for `--local-prefix' *must not* contain any of the
-     system's standard header files.  If it did contain them, certain
-     programs would be miscompiled (including GNU Emacs, on certain
-     targets), because this would override and nullify the header file
-     corrections made by the `fixincludes' script.
-
-     Indications are that people who use this option use it based on
-     mistaken ideas of what it is for.  People use it as if it specified
-     where to install part of GNU CC.  Perhaps they make this assumption
-     because installing GNU CC creates the directory.
-
-  6. Make sure the Bison parser generator is installed.  (This is
-     unnecessary if the Bison output files `c-parse.c' and `cexp.c' are
-     more recent than `c-parse.y' and `cexp.y' and you do not plan to
-     change the `.y' files.)
-
-     Bison versions older than Sept 8, 1988 will produce incorrect
-     output for `c-parse.c'.
-
-  7. If you have chosen a configuration for GNU CC which requires other
-     GNU tools (such as GAS or the GNU linker) instead of the standard
-     system tools, install the required tools in the build directory
-     under the names `as', `ld' or whatever is appropriate.  This will
-     enable the compiler to find the proper tools for compilation of
-     the program `enquire'.
-
-     Alternatively, you can do subsequent compilation using a value of
-     the `PATH' environment variable such that the necessary GNU tools
-     come before the standard system tools.
-
-  8. Build the compiler.  Just type `make LANGUAGES=c' in the compiler
-     directory.
-
-     `LANGUAGES=c' specifies that only the C compiler should be
-     compiled.  The makefile normally builds compilers for all the
-     supported languages; currently, C, C++ and Objective C.  However,
-     C is the only language that is sure to work when you build with
-     other non-GNU C compilers.  In addition, building anything but C
-     at this stage is a waste of time.
-
-     In general, you can specify the languages to build by typing the
-     argument `LANGUAGES="LIST"', where LIST is one or more words from
-     the list `c', `c++', and `objective-c'.  If you have any
-     additional GNU compilers as subdirectories of the GNU CC source
-     directory, you may also specify their names in this list.
-
-     Ignore any warnings you may see about "statement not reached" in
-     `insn-emit.c'; they are normal.  Also, warnings about "unknown
-     escape sequence" are normal in `genopinit.c' and perhaps some
-     other files.  Likewise, you should ignore warnings about "constant
-     is so large that it is unsigned" in `insn-emit.c' and
-     `insn-recog.c' and a warning about a comparison always being zero
-     in `enquire.o'.  Any other compilation errors may represent bugs in
-     the port to your machine or operating system, and should be
-     investigated and reported (*note Bugs::.).
-
-     Some commercial compilers fail to compile GNU CC because they have
-     bugs or limitations.  For example, the Microsoft compiler is said
-     to run out of macro space.  Some Ultrix compilers run out of
-     expression space; then you need to break up the statement where
-     the problem happens.
-
-  9. If you are building a cross-compiler, stop here.  *Note
-     Cross-Compiler::.
-
- 10. Move the first-stage object files and executables into a
-     subdirectory with this command:
-
-          make stage1
-
-     The files are moved into a subdirectory named `stage1'.  Once
-     installation is complete, you may wish to delete these files with
-     `rm -r stage1'.
-
- 11. If you have chosen a configuration for GNU CC which requires other
-     GNU tools (such as GAS or the GNU linker) instead of the standard
-     system tools, install the required tools in the `stage1'
-     subdirectory under the names `as', `ld' or whatever is
-     appropriate.  This will enable the stage 1 compiler to find the
-     proper tools in the following stage.
-
-     Alternatively, you can do subsequent compilation using a value of
-     the `PATH' environment variable such that the necessary GNU tools
-     come before the standard system tools.
-
- 12. Recompile the compiler with itself, with this command:
-
-          make CC="stage1/xgcc -Bstage1/" CFLAGS="-g -O2"
-
-     This is called making the stage 2 compiler.
-
-     The command shown above builds compilers for all the supported
-     languages.  If you don't want them all, you can specify the
-     languages to build by typing the argument `LANGUAGES="LIST"'.  LIST
-     should contain one or more words from the list `c', `c++',
-     `objective-c', and `proto'.  Separate the words with spaces.
-     `proto' stands for the programs `protoize' and `unprotoize'; they
-     are not a separate language, but you use `LANGUAGES' to enable or
-     disable their installation.
-
-     If you are going to build the stage 3 compiler, then you might
-     want to build only the C language in stage 2.
-
-     Once you have built the stage 2 compiler, if you are short of disk
-     space, you can delete the subdirectory `stage1'.
-
-     On a 68000 or 68020 system lacking floating point hardware, unless
-     you have selected a `tm.h' file that expects by default that there
-     is no such hardware, do this instead:
-
-          make CC="stage1/xgcc -Bstage1/" CFLAGS="-g -O2 -msoft-float"
-
- 13. If you wish to test the compiler by compiling it with itself one
-     more time, install any other necessary GNU tools (such as GAS or
-     the GNU linker) in the `stage2' subdirectory as you did in the
-     `stage1' subdirectory, then do this:
-
-          make stage2
-          make CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O2"
-
-     This is called making the stage 3 compiler.  Aside from the `-B'
-     option, the compiler options should be the same as when you made
-     the stage 2 compiler.  But the `LANGUAGES' option need not be the
-     same.  The command shown above builds compilers for all the
-     supported languages; if you don't want them all, you can specify
-     the languages to build by typing the argument `LANGUAGES="LIST"',
-     as described above.
-
-     If you do not have to install any additional GNU tools, you may
-     use the command
-
-          make bootstrap LANGUAGES=LANGUAGE-LIST BOOT_CFLAGS=OPTION-LIST
-
-     instead of making `stage1', `stage2', and performing the two
-     compiler builds.
-
- 14. Then compare the latest object files with the stage 2 object
-     files--they ought to be identical, aside from time stamps (if any).
-
-     On some systems, meaningful comparison of object files is
-     impossible; they always appear "different."  This is currently
-     true on Solaris and some systems that use ELF object file format.
-     On some versions of Irix on SGI machines and DEC Unix (OSF/1) on
-     Alpha systems, you will not be able to compare the files without
-     specifying `-save-temps'; see the description of individual
-     systems above to see if you get comparison failures.  You may have
-     similar problems on other systems.
-
-     Use this command to compare the files:
-
-          make compare
-
-     This will mention any object files that differ between stage 2 and
-     stage 3.  Any difference, no matter how innocuous, indicates that
-     the stage 2 compiler has compiled GNU CC incorrectly, and is
-     therefore a potentially serious bug which you should investigate
-     and report (*note Bugs::.).
-
-     If your system does not put time stamps in the object files, then
-     this is a faster way to compare them (using the Bourne shell):
-
-          for file in *.o; do
-          cmp $file stage2/$file
-          done
-
-     If you have built the compiler with the `-mno-mips-tfile' option on
-     MIPS machines, you will not be able to compare the files.
-
- 15. Install the compiler driver, the compiler's passes and run-time
-     support with `make install'.  Use the same value for `CC',
-     `CFLAGS' and `LANGUAGES' that you used when compiling the files
-     that are being installed.  One reason this is necessary is that
-     some versions of Make have bugs and recompile files gratuitously
-     when you do this step.  If you use the same variable values, those
-     files will be recompiled properly.
-
-     For example, if you have built the stage 2 compiler, you can use
-     the following command:
-
-          make install CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O" LANGUAGES="LIST"
-
-     This copies the files `cc1', `cpp' and `libgcc.a' to files `cc1',
-     `cpp' and `libgcc.a' in the directory
-     `/usr/local/lib/gcc-lib/TARGET/VERSION', which is where the
-     compiler driver program looks for them.  Here TARGET is the target
-     machine type specified when you ran `configure', and VERSION is
-     the version number of GNU CC.  This naming scheme permits various
-     versions and/or cross-compilers to coexist.  It also copies the
-     executables for compilers for other languages (e.g., `cc1plus' for
-     C++) to the same directory.
-
-     This also copies the driver program `xgcc' into
-     `/usr/local/bin/gcc', so that it appears in typical execution
-     search paths.  It also copies `gcc.1' into `/usr/local/man/man1'
-     and info pages into `/usr/local/info'.
-
-     On some systems, this command causes recompilation of some files.
-     This is usually due to bugs in `make'.  You should either ignore
-     this problem, or use GNU Make.
-
-     *Warning: there is a bug in `alloca' in the Sun library.  To avoid
-     this bug, be sure to install the executables of GNU CC that were
-     compiled by GNU CC.  (That is, the executables from stage 2 or 3,
-     not stage 1.)  They use `alloca' as a built-in function and never
-     the one in the library.*
-
-     (It is usually better to install GNU CC executables from stage 2
-     or 3, since they usually run faster than the ones compiled with
-     some other compiler.)
-
- 16. If you're going to use C++, it's likely that you need to also
-     install the libg++ distribution.  It should be available from the
-     same place where you got the GNU C distribution.  Just as GNU C
-     does not distribute a C runtime library, it also does not include
-     a C++ run-time library.  All I/O functionality, special class
-     libraries, etc., are available in the libg++ distribution.
-
- 17. GNU CC includes a runtime library for Objective-C because it is an
-     integral part of the language.  You can find the files associated
-     with the library in the subdirectory `objc'.  The GNU Objective-C
-     Runtime Library requires header files for the target's C library in
-     order to be compiled,and also requires the header files for the
-     target's thread library if you want thread support.  *Note
-     Cross-Compilers and Header Files: Cross Headers, for discussion
-     about header files issues for cross-compilation.
-
-     When you run `configure', it picks the appropriate Objective-C
-     thread implementation file for the target platform.  In some
-     situations, you may wish to choose a different back-end as some
-     platforms support multiple thread implementations or you may wish
-     to disable thread support completely.  You do this by specifying a
-     value for the OBJC_THREAD_FILE makefile variable on the command
-     line when you run make, for example:
-
-          make CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O2" OBJC_THREAD_FILE=thr-single
-
-     Below is a list of the currently available back-ends.
-
-        * thr-single Disable thread support, should work for all
-          platforms.
-
-        * thr-decosf1 DEC OSF/1 thread support.
-
-        * thr-irix SGI IRIX thread support.
-
-        * thr-mach Generic MACH thread support, known to work on
-          NEXTSTEP.
-
-        * thr-os2 IBM OS/2 thread support.
-
-        * thr-posix Generix POSIX thread support.
-
-        * thr-pthreads PCThreads on Linux-based GNU systems.
-
-        * thr-solaris SUN Solaris thread support.
-
-        * thr-win32 Microsoft Win32 API thread support.
-
diff --git a/gcc/gcc.info-7 b/gcc/gcc.info-7
deleted file mode 100644 (file)
index 35bf202..0000000
+++ /dev/null
@@ -1,1100 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Configurations,  Next: Other Dir,  Up: Installation
-
-Configurations Supported by GNU CC
-==================================
-
-   Here are the possible CPU types:
-
-     1750a, a29k, alpha, arm, cN, clipper, dsp16xx, elxsi, h8300,
-     hppa1.0, hppa1.1, i370, i386, i486, i586, i860, i960, m32r,
-     m68000, m68k, m88k, mips, mipsel, mips64, mips64el, ns32k,
-     powerpc, powerpcle, pyramid, romp, rs6000, sh, sparc, sparclite,
-     sparc64, vax, we32k.
-
-   Here are the recognized company names.  As you can see, customary
-abbreviations are used rather than the longer official names.
-
-     acorn, alliant, altos, apollo, apple, att, bull, cbm, convergent,
-     convex, crds, dec, dg, dolphin, elxsi, encore, harris, hitachi,
-     hp, ibm, intergraph, isi, mips, motorola, ncr, next, ns, omron,
-     plexus, sequent, sgi, sony, sun, tti, unicom, wrs.
-
-   The company name is meaningful only to disambiguate when the rest of
-the information supplied is insufficient.  You can omit it, writing
-just `CPU-SYSTEM', if it is not needed.  For example, `vax-ultrix4.2'
-is equivalent to `vax-dec-ultrix4.2'.
-
-   Here is a list of system types:
-
-     386bsd, aix, acis, amigaos, aos, aout, aux, bosx, bsd, clix, coff,
-     ctix, cxux, dgux, dynix, ebmon, ecoff, elf, esix, freebsd, hms,
-     genix, gnu, linux-gnu, hiux, hpux, iris, irix, isc, luna, lynxos,
-     mach, minix, msdos, mvs, netbsd, newsos, nindy, ns, osf, osfrose,
-     ptx, riscix, riscos, rtu, sco, sim, solaris, sunos, sym, sysv,
-     udi, ultrix, unicos, uniplus, unos, vms, vsta, vxworks, winnt,
-     xenix.
-
-You can omit the system type; then `configure' guesses the operating
-system from the CPU and company.
-
-   You can add a version number to the system type; this may or may not
-make a difference.  For example, you can write `bsd4.3' or `bsd4.4' to
-distinguish versions of BSD.  In practice, the version number is most
-needed for `sysv3' and `sysv4', which are often treated differently.
-
-   If you specify an impossible combination such as `i860-dg-vms', then
-you may get an error message from `configure', or it may ignore part of
-the information and do the best it can with the rest.  `configure'
-always prints the canonical name for the alternative that it used.  GNU
-CC does not support all possible alternatives.
-
-   Often a particular model of machine has a name.  Many machine names
-are recognized as aliases for CPU/company combinations.  Thus, the
-machine name `sun3', mentioned above, is an alias for `m68k-sun'.
-Sometimes we accept a company name as a machine name, when the name is
-popularly used for a particular machine.  Here is a table of the known
-machine names:
-
-     3300, 3b1, 3bN, 7300, altos3068, altos, apollo68, att-7300,
-     balance, convex-cN, crds, decstation-3100, decstation, delta,
-     encore, fx2800, gmicro, hp7NN, hp8NN, hp9k2NN, hp9k3NN, hp9k7NN,
-     hp9k8NN, iris4d, iris, isi68, m3230, magnum, merlin, miniframe,
-     mmax, news-3600, news800, news, next, pbd, pc532, pmax, powerpc,
-     powerpcle, ps2, risc-news, rtpc, sun2, sun386i, sun386, sun3,
-     sun4, symmetry, tower-32, tower.
-
-Remember that a machine name specifies both the cpu type and the company
-name.  If you want to install your own homemade configuration files,
-you can use `local' as the company name to access them.  If you use
-configuration `CPU-local', the configuration name without the cpu prefix
-is used to form the configuration file names.
-
-   Thus, if you specify `m68k-local', configuration uses files
-`m68k.md', `local.h', `m68k.c', `xm-local.h', `t-local', and `x-local',
-all in the directory `config/m68k'.
-
-   Here is a list of configurations that have special treatment or
-special things you must know:
-
-`1750a-*-*'
-     MIL-STD-1750A processors.
-
-     The MIL-STD-1750A cross configuration produces output for
-     `as1750', an assembler/linker available under the GNU Public
-     License for the 1750A. `as1750' can be obtained at
-     *ftp://ftp.fta-berlin.de/pub/crossgcc/1750gals/*.  A similarly
-     licensed simulator for the 1750A is available from same address.
-
-     You should ignore a fatal error during the building of libgcc
-     (libgcc is not yet implemented for the 1750A.)
-
-     The `as1750' assembler requires the file `ms1750.inc', which is
-     found in the directory `config/1750a'.
-
-     GNU CC produced the same sections as the Fairchild F9450 C
-     Compiler, namely:
-
-    `Normal'
-          The program code section.
-
-    `Static'
-          The read/write (RAM) data section.
-
-    `Konst'
-          The read-only (ROM) constants section.
-
-    `Init'
-          Initialization section (code to copy KREL to SREL).
-
-     The smallest addressable unit is 16 bits (BITS_PER_UNIT is 16).
-     This means that type `char' is represented with a 16-bit word per
-     character.  The 1750A's "Load/Store Upper/Lower Byte" instructions
-     are not used by GNU CC.
-
-`alpha-*-osf1'
-     Systems using processors that implement the DEC Alpha architecture
-     and are running the DEC Unix (OSF/1) operating system, for example
-     the DEC Alpha AXP systems.  (VMS on the Alpha is not currently
-     supported by GNU CC.)
-
-     GNU CC writes a `.verstamp' directive to the assembler output file
-     unless it is built as a cross-compiler.  It gets the version to
-     use from the system header file `/usr/include/stamp.h'.  If you
-     install a new version of DEC Unix, you should rebuild GCC to pick
-     up the new version stamp.
-
-     Note that since the Alpha is a 64-bit architecture,
-     cross-compilers from 32-bit machines will not generate code as
-     efficient as that generated when the compiler is running on a
-     64-bit machine because many optimizations that depend on being
-     able to represent a word on the target in an integral value on the
-     host cannot be performed.  Building cross-compilers on the Alpha
-     for 32-bit machines has only been tested in a few cases and may
-     not work properly.
-
-     `make compare' may fail on old versions of DEC Unix unless you add
-     `-save-temps' to `CFLAGS'.  On these systems, the name of the
-     assembler input file is stored in the object file, and that makes
-     comparison fail if it differs between the `stage1' and `stage2'
-     compilations.  The option `-save-temps' forces a fixed name to be
-     used for the assembler input file, instead of a randomly chosen
-     name in `/tmp'.  Do not add `-save-temps' unless the comparisons
-     fail without that option.  If you add `-save-temps', you will have
-     to manually delete the `.i' and `.s' files after each series of
-     compilations.
-
-     GNU CC now supports both the native (ECOFF) debugging format used
-     by DBX and GDB and an encapsulated STABS format for use only with
-     GDB.  See the discussion of the `--with-stabs' option of
-     `configure' above for more information on these formats and how to
-     select them.
-
-     There is a bug in DEC's assembler that produces incorrect line
-     numbers for ECOFF format when the `.align' directive is used.  To
-     work around this problem, GNU CC will not emit such alignment
-     directives while writing ECOFF format debugging information even
-     if optimization is being performed.  Unfortunately, this has the
-     very undesirable side-effect that code addresses when `-O' is
-     specified are different depending on whether or not `-g' is also
-     specified.
-
-     To avoid this behavior, specify `-gstabs+' and use GDB instead of
-     DBX.  DEC is now aware of this problem with the assembler and
-     hopes to provide a fix shortly.
-
-`arc-*-elf'
-     Argonaut ARC processor.  This configuration is intended for
-     embedded systems.
-
-`arm-*-aout'
-     Advanced RISC Machines ARM-family processors.  These are often
-     used in embedded applications.  There are no standard Unix
-     configurations.  This configuration corresponds to the basic
-     instruction sequences and will produce `a.out' format object
-     modules.
-
-     You may need to make a variant of the file `arm.h' for your
-     particular configuration.
-
-`arm-*-linuxaout'
-     Any of the ARM family processors running the Linux-based GNU
-     system with the `a.out' binary format (ELF is not yet supported).
-     You must use version 2.8.1.0.7 or later of the Linux binutils,
-     which you can download from `sunsite.unc.edu:/pub/Linux/GCC' and
-     other mirror sites for Linux-based GNU systems.
-
-`arm-*-riscix'
-     The ARM2 or ARM3 processor running RISC iX, Acorn's port of BSD
-     Unix.  If you are running a version of RISC iX prior to 1.2 then
-     you must specify the version number during configuration.  Note
-     that the assembler shipped with RISC iX does not support stabs
-     debugging information; a new version of the assembler, with stabs
-     support included, is now available from Acorn.
-
-`a29k'
-     AMD Am29k-family processors.  These are normally used in embedded
-     applications.  There are no standard Unix configurations.  This
-     configuration corresponds to AMD's standard calling sequence and
-     binary interface and is compatible with other 29k tools.
-
-     You may need to make a variant of the file `a29k.h' for your
-     particular configuration.
-
-`a29k-*-bsd'
-     AMD Am29050 used in a system running a variant of BSD Unix.
-
-`decstation-*'
-     DECstations can support three different personalities: Ultrix, DEC
-     OSF/1, and OSF/rose.  To configure GCC for these platforms use the
-     following configurations:
-
-    `decstation-ultrix'
-          Ultrix configuration.
-
-    `decstation-osf1'
-          Dec's version of OSF/1.
-
-    `decstation-osfrose'
-          Open Software Foundation reference port of OSF/1 which uses
-          the OSF/rose object file format instead of ECOFF.  Normally,
-          you would not select this configuration.
-
-     The MIPS C compiler needs to be told to increase its table size
-     for switch statements with the `-Wf,-XNg1500' option in order to
-     compile `cp/parse.c'.  If you use the `-O2' optimization option,
-     you also need to use `-Olimit 3000'.  Both of these options are
-     automatically generated in the `Makefile' that the shell script
-     `configure' builds.  If you override the `CC' make variable and
-     use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit
-     3000'.
-
-`elxsi-elxsi-bsd'
-     The Elxsi's C compiler has known limitations that prevent it from
-     compiling GNU C.  Please contact `mrs@cygnus.com' for more details.
-
-`dsp16xx'
-     A port to the AT&T DSP1610 family of processors.
-
-`h8300-*-*'
-     Hitachi H8/300 series of processors.
-
-     The calling convention and structure layout has changed in release
-     2.6.  All code must be recompiled.  The calling convention now
-     passes the first three arguments in function calls in registers.
-     Structures are no longer a multiple of 2 bytes.
-
-`hppa*-*-*'
-     There are several variants of the HP-PA processor which run a
-     variety of operating systems.  GNU CC must be configured to use
-     the correct processor type and operating system, or GNU CC will
-     not function correctly.  The easiest way to handle this problem is
-     to *not* specify a target when configuring GNU CC, the `configure'
-     script will try to automatically determine the right processor
-     type and operating system.
-
-     `-g' does not work on HP-UX, since that system uses a peculiar
-     debugging format which GNU CC does not know about.  However, `-g'
-     will work if you also use GAS and GDB in conjunction with GCC.  We
-     highly recommend using GAS for all HP-PA configurations.
-
-     You should be using GAS-2.6 (or later) along with GDB-4.16 (or
-     later).  These can be retrieved from all the traditional GNU ftp
-     archive sites.
-
-     GAS will need to be installed into a directory before `/bin',
-     `/usr/bin', and `/usr/ccs/bin' in your search path.  You should
-     install GAS before you build GNU CC.
-
-     To enable debugging, you must configure GNU CC with the
-     `--with-gnu-as' option before building.
-
-`i370-*-*'
-     This port is very preliminary and has many known bugs.  We hope to
-     have a higher-quality port for this machine soon.
-
-`i386-*-linux-gnuoldld'
-     Use this configuration to generate `a.out' binaries on Linux-based
-     GNU systems if you do not have gas/binutils version 2.5.2 or later
-     installed. This is an obsolete configuration.
-
-`i386-*-linux-gnuaout'
-     Use this configuration to generate `a.out' binaries on Linux-based
-     GNU systems. This configuration is being superseded. You must use
-     gas/binutils version 2.5.2 or later.
-
-`i386-*-linux-gnu'
-     Use this configuration to generate ELF binaries on Linux-based GNU
-     systems.  You must use gas/binutils version 2.5.2 or later.
-
-`i386-*-sco'
-     Compilation with RCC is recommended.  Also, it may be a good idea
-     to link with GNU malloc instead of the malloc that comes with the
-     system.
-
-`i386-*-sco3.2v4'
-     Use this configuration for SCO release 3.2 version 4.
-
-`i386-*-sco3.2v5*'
-     Use this for the SCO OpenServer Release family including 5.0.0,
-     5.0.2, 5.0.4, Internet FastStart 1.0, and Internet FastStart 1.1.
-
-     GNU CC can generate ELF binaries (if you specify `-melf') or COFF
-     binaries (the default).  If you are going to build your compiler
-     in ELF mode (once you have bootstrapped the first stage compiler)
-     you *must* specify `-melf' as part of `CC', *not* `CFLAGS', for
-     example as `CC="stage1/xgcc -melf -Bstage1/" '.  If you do not do
-     this, the bootstrap will generate incorrect versions of `libgcc.a'.
-
-     You must have TLS597 (from ftp.sco.com/TLS) installed for ELF
-     binaries to work correctly. Note that Open Server 5.0.2 *does*
-     need TLS597 installed.
-
-     *NOTE:* You must follow the instructions about invoking `make
-     bootstrap' because the native OpenServer compiler builds a
-     `cc1plus' that will not correctly parse many valid C++ programs.
-     You must do a `make bootstrap' if you are building with the native
-     compiler.
-
-`i386-*-isc'
-     It may be a good idea to link with GNU malloc instead of the
-     malloc that comes with the system.
-
-     In ISC version 4.1, `sed' core dumps when building `deduced.h'.
-     Use the version of `sed' from version 4.0.
-
-`i386-*-esix'
-     It may be good idea to link with GNU malloc instead of the malloc
-     that comes with the system.
-
-`i386-ibm-aix'
-     You need to use GAS version 2.1 or later, and LD from GNU binutils
-     version 2.2 or later.
-
-`i386-sequent-bsd'
-     Go to the Berkeley universe before compiling.  In addition, you
-     probably need to create a file named `string.h' containing just
-     one line: `#include <strings.h>'.
-
-`i386-sequent-ptx1*'
-     Sequent DYNIX/ptx 1.x.
-
-`i386-sequent-ptx2*'
-     Sequent DYNIX/ptx 2.x.
-
-`i386-sun-sunos4'
-     You may find that you need another version of GNU CC to begin
-     bootstrapping with, since the current version when built with the
-     system's own compiler seems to get an infinite loop compiling part
-     of `libgcc2.c'.  GNU CC version 2 compiled with GNU CC (any
-     version) seems not to have this problem.
-
-     See *Note Sun Install::, for information on installing GNU CC on
-     Sun systems.
-
-`i[345]86-*-winnt3.5'
-     This version requires a GAS that has not yet been released.  Until
-     it is, you can get a prebuilt binary version via anonymous ftp from
-     `cs.washington.edu:pub/gnat' or `cs.nyu.edu:pub/gnat'. You must
-     also use the Microsoft header files from the Windows NT 3.5 SDK.
-     Find these on the CDROM in the `/mstools/h' directory dated
-     9/4/94.  You must use a fixed version of Microsoft linker made
-     especially for NT 3.5, which is also is available on the NT 3.5
-     SDK CDROM.  If you do not have this linker, can you also use the
-     linker from Visual C/C++ 1.0 or 2.0.
-
-     Installing GNU CC for NT builds a wrapper linker, called `ld.exe',
-     which mimics the behaviour of Unix `ld' in the specification of
-     libraries (`-L' and `-l').  `ld.exe' looks for both Unix and
-     Microsoft named libraries.  For example, if you specify `-lfoo',
-     `ld.exe' will look first for `libfoo.a' and then for `foo.lib'.
-
-     You may install GNU CC for Windows NT in one of two ways,
-     depending on whether or not you have a Unix-like shell and various
-     Unix-like utilities.
-
-       1. If you do not have a Unix-like shell and few Unix-like
-          utilities, you will use a DOS style batch script called
-          `configure.bat'.  Invoke it as `configure winnt' from an
-          MSDOS console window or from the program manager dialog box.
-          `configure.bat' assumes you have already installed and have
-          in your path a Unix-like `sed' program which is used to
-          create a working `Makefile' from `Makefile.in'.
-
-          `Makefile' uses the Microsoft Nmake program maintenance
-          utility and the Visual C/C++ V8.00 compiler to build GNU CC.
-          You need only have the utilities `sed' and `touch' to use
-          this installation method, which only automatically builds the
-          compiler itself.  You must then examine what `fixinc.winnt'
-          does, edit the header files by hand and build `libgcc.a'
-          manually.
-
-       2. The second type of installation assumes you are running a
-          Unix-like shell, have a complete suite of Unix-like utilities
-          in your path, and have a previous version of GNU CC already
-          installed, either through building it via the above
-          installation method or acquiring a pre-built binary.  In this
-          case, use the `configure' script in the normal fashion.
-
-`i860-intel-osf1'
-     This is the Paragon.  If you have version 1.0 of the operating
-     system, see *Note Installation Problems::, for special things you
-     need to do to compensate for peculiarities in the system.
-
-`*-lynx-lynxos'
-     LynxOS 2.2 and earlier comes with GNU CC 1.x already installed as
-     `/bin/gcc'.  You should compile with this instead of `/bin/cc'.
-     You can tell GNU CC to use the GNU assembler and linker, by
-     specifying `--with-gnu-as --with-gnu-ld' when configuring.  These
-     will produce COFF format object files and executables;  otherwise
-     GNU CC will use the installed tools, which produce `a.out' format
-     executables.
-
-`m32r-*-elf'
-     Mitsubishi M32R processor.  This configuration is intended for
-     embedded systems.
-
-`m68000-hp-bsd'
-     HP 9000 series 200 running BSD.  Note that the C compiler that
-     comes with this system cannot compile GNU CC; contact
-     `law@cs.utah.edu' to get binaries of GNU CC for bootstrapping.
-
-`m68k-altos'
-     Altos 3068.  You must use the GNU assembler, linker and debugger.
-     Also, you must fix a kernel bug.  Details in the file
-     `README.ALTOS'.
-
-`m68k-apple-aux'
-     Apple Macintosh running A/UX.  You may configure GCC  to use
-     either the system assembler and linker or the GNU assembler and
-     linker.  You should use the GNU configuration if you can,
-     especially if you also want to use GNU C++.  You enabled that
-     configuration with + the `--with-gnu-as' and `--with-gnu-ld'
-     options to `configure'.
-
-     Note the C compiler that comes with this system cannot compile GNU
-     CC.  You can fine binaries of GNU CC for bootstrapping on
-     `jagubox.gsfc.nasa.gov'.  You will also a patched version of
-     `/bin/ld' there that raises some of the arbitrary limits found in
-     the original.
-
-`m68k-att-sysv'
-     AT&T 3b1, a.k.a. 7300 PC.  Special procedures are needed to
-     compile GNU CC with this machine's standard C compiler, due to
-     bugs in that compiler.  You can bootstrap it more easily with
-     previous versions of GNU CC if you have them.
-
-     Installing GNU CC on the 3b1 is difficult if you do not already
-     have GNU CC running, due to bugs in the installed C compiler.
-     However, the following procedure might work.  We are unable to
-     test it.
-
-       1. Comment out the `#include "config.h"' line near the start of
-          `cccp.c' and do `make cpp'.  This makes a preliminary version
-          of GNU cpp.
-
-       2. Save the old `/lib/cpp' and copy the preliminary GNU cpp to
-          that file name.
-
-       3. Undo your change in `cccp.c', or reinstall the original
-          version, and do `make cpp' again.
-
-       4. Copy this final version of GNU cpp into `/lib/cpp'.
-
-       5. Replace every occurrence of `obstack_free' in the file
-          `tree.c' with `_obstack_free'.
-
-       6. Run `make' to get the first-stage GNU CC.
-
-       7. Reinstall the original version of `/lib/cpp'.
-
-       8. Now you can compile GNU CC with itself and install it in the
-          normal fashion.
-
-`m68k-bull-sysv'
-     Bull DPX/2 series 200 and 300 with BOS-2.00.45 up to BOS-2.01. GNU
-     CC works either with native assembler or GNU assembler. You can use
-     GNU assembler with native coff generation by providing
-     `--with-gnu-as' to the configure script or use GNU assembler with
-     dbx-in-coff encapsulation by providing `--with-gnu-as --stabs'.
-     For any problem with native assembler or for availability of the
-     DPX/2 port of GAS, contact `F.Pierresteguy@frcl.bull.fr'.
-
-`m68k-crds-unox'
-     Use `configure unos' for building on Unos.
-
-     The Unos assembler is named `casm' instead of `as'.  For some
-     strange reason linking `/bin/as' to `/bin/casm' changes the
-     behavior, and does not work.  So, when installing GNU CC, you
-     should install the following script as `as' in the subdirectory
-     where the passes of GCC are installed:
-
-          #!/bin/sh
-          casm $*
-
-     The default Unos library is named `libunos.a' instead of `libc.a'.
-     To allow GNU CC to function, either change all references to
-     `-lc' in `gcc.c' to `-lunos' or link `/lib/libc.a' to
-     `/lib/libunos.a'.
-
-     When compiling GNU CC with the standard compiler, to overcome bugs
-     in the support of `alloca', do not use `-O' when making stage 2.
-     Then use the stage 2 compiler with `-O' to make the stage 3
-     compiler.  This compiler will have the same characteristics as the
-     usual stage 2 compiler on other systems.  Use it to make a stage 4
-     compiler and compare that with stage 3 to verify proper
-     compilation.
-
-     (Perhaps simply defining `ALLOCA' in `x-crds' as described in the
-     comments there will make the above paragraph superfluous.  Please
-     inform us of whether this works.)
-
-     Unos uses memory segmentation instead of demand paging, so you
-     will need a lot of memory.  5 Mb is barely enough if no other
-     tasks are running.  If linking `cc1' fails, try putting the object
-     files into a library and linking from that library.
-
-`m68k-hp-hpux'
-     HP 9000 series 300 or 400 running HP-UX.  HP-UX version 8.0 has a
-     bug in the assembler that prevents compilation of GNU CC.  To fix
-     it, get patch PHCO_4484 from HP.
-
-     In addition, if you wish to use gas `--with-gnu-as' you must use
-     gas version 2.1 or later, and you must use the GNU linker version
-     2.1 or later.  Earlier versions of gas relied upon a program which
-     converted the gas output into the native HP/UX format, but that
-     program has not been kept up to date.  gdb does not understand
-     that native HP/UX format, so you must use gas if you wish to use
-     gdb.
-
-`m68k-sun'
-     Sun 3.  We do not provide a configuration file to use the Sun FPA
-     by default, because programs that establish signal handlers for
-     floating point traps inherently cannot work with the FPA.
-
-     See *Note Sun Install::, for information on installing GNU CC on
-     Sun systems.
-
-`m88k-*-svr3'
-     Motorola m88k running the AT&T/Unisoft/Motorola V.3 reference port.
-     These systems tend to use the Green Hills C, revision 1.8.5, as the
-     standard C compiler.  There are apparently bugs in this compiler
-     that result in object files differences between stage 2 and stage
-     3.  If this happens, make the stage 4 compiler and compare it to
-     the stage 3 compiler.  If the stage 3 and stage 4 object files are
-     identical, this suggests you encountered a problem with the
-     standard C compiler; the stage 3 and 4 compilers may be usable.
-
-     It is best, however, to use an older version of GNU CC for
-     bootstrapping if you have one.
-
-`m88k-*-dgux'
-     Motorola m88k running DG/UX.  To build 88open BCS native or cross
-     compilers on DG/UX, specify the configuration name as
-     `m88k-*-dguxbcs' and build in the 88open BCS software development
-     environment.  To build ELF native or cross compilers on DG/UX,
-     specify `m88k-*-dgux' and build in the DG/UX ELF development
-     environment.  You set the software development environment by
-     issuing `sde-target' command and specifying either `m88kbcs' or
-     `m88kdguxelf' as the operand.
-
-     If you do not specify a configuration name, `configure' guesses the
-     configuration based on the current software development
-     environment.
-
-`m88k-tektronix-sysv3'
-     Tektronix XD88 running UTekV 3.2e.  Do not turn on optimization
-     while building stage1 if you bootstrap with the buggy Green Hills
-     compiler.  Also, The bundled LAI System V NFS is buggy so if you
-     build in an NFS mounted directory, start from a fresh reboot, or
-     avoid NFS all together.  Otherwise you may have trouble getting
-     clean comparisons between stages.
-
-`mips-mips-bsd'
-     MIPS machines running the MIPS operating system in BSD mode.  It's
-     possible that some old versions of the system lack the functions
-     `memcpy', `memcmp', and `memset'.  If your system lacks these, you
-     must remove or undo the definition of `TARGET_MEM_FUNCTIONS' in
-     `mips-bsd.h'.
-
-     The MIPS C compiler needs to be told to increase its table size
-     for switch statements with the `-Wf,-XNg1500' option in order to
-     compile `cp/parse.c'.  If you use the `-O2' optimization option,
-     you also need to use `-Olimit 3000'.  Both of these options are
-     automatically generated in the `Makefile' that the shell script
-     `configure' builds.  If you override the `CC' make variable and
-     use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit
-     3000'.
-
-`mips-mips-riscos*'
-     The MIPS C compiler needs to be told to increase its table size
-     for switch statements with the `-Wf,-XNg1500' option in order to
-     compile `cp/parse.c'.  If you use the `-O2' optimization option,
-     you also need to use `-Olimit 3000'.  Both of these options are
-     automatically generated in the `Makefile' that the shell script
-     `configure' builds.  If you override the `CC' make variable and
-     use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit
-     3000'.
-
-     MIPS computers running RISC-OS can support four different
-     personalities: default, BSD 4.3, System V.3, and System V.4 (older
-     versions of RISC-OS don't support V.4).  To configure GCC for
-     these platforms use the following configurations:
-
-    `mips-mips-riscos`rev''
-          Default configuration for RISC-OS, revision `rev'.
-
-    `mips-mips-riscos`rev'bsd'
-          BSD 4.3 configuration for RISC-OS, revision `rev'.
-
-    `mips-mips-riscos`rev'sysv4'
-          System V.4 configuration for RISC-OS, revision `rev'.
-
-    `mips-mips-riscos`rev'sysv'
-          System V.3 configuration for RISC-OS, revision `rev'.
-
-     The revision `rev' mentioned above is the revision of RISC-OS to
-     use.  You must reconfigure GCC when going from a RISC-OS revision
-     4 to RISC-OS revision 5.  This has the effect of avoiding a linker
-     bug (see *Note Installation Problems::, for more details).
-
-`mips-sgi-*'
-     In order to compile GCC on an SGI running IRIX 4, the "c.hdr.lib"
-     option must be installed from the CD-ROM supplied from Silicon
-     Graphics.  This is found on the 2nd CD in release 4.0.1.
-
-     In order to compile GCC on an SGI running IRIX 5, the
-     "compiler_dev.hdr" subsystem must be installed from the IDO CD-ROM
-     supplied by Silicon Graphics.
-
-     `make compare' may fail on version 5 of IRIX unless you add
-     `-save-temps' to `CFLAGS'.  On these systems, the name of the
-     assembler input file is stored in the object file, and that makes
-     comparison fail if it differs between the `stage1' and `stage2'
-     compilations.  The option `-save-temps' forces a fixed name to be
-     used for the assembler input file, instead of a randomly chosen
-     name in `/tmp'.  Do not add `-save-temps' unless the comparisons
-     fail without that option.  If you do you `-save-temps', you will
-     have to manually delete the `.i' and `.s' files after each series
-     of compilations.
-
-     The MIPS C compiler needs to be told to increase its table size
-     for switch statements with the `-Wf,-XNg1500' option in order to
-     compile `cp/parse.c'.  If you use the `-O2' optimization option,
-     you also need to use `-Olimit 3000'.  Both of these options are
-     automatically generated in the `Makefile' that the shell script
-     `configure' builds.  If you override the `CC' make variable and
-     use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit
-     3000'.
-
-     On Irix version 4.0.5F, and perhaps on some other versions as well,
-     there is an assembler bug that reorders instructions incorrectly.
-     To work around it, specify the target configuration
-     `mips-sgi-irix4loser'.  This configuration inhibits assembler
-     optimization.
-
-     In a compiler configured with target `mips-sgi-irix4', you can turn
-     off assembler optimization by using the `-noasmopt' option.  This
-     compiler option passes the option `-O0' to the assembler, to
-     inhibit reordering.
-
-     The `-noasmopt' option can be useful for testing whether a problem
-     is due to erroneous assembler reordering.  Even if a problem does
-     not go away with `-noasmopt', it may still be due to assembler
-     reordering--perhaps GNU CC itself was miscompiled as a result.
-
-     To enable debugging under Irix 5, you must use GNU as 2.5 or later,
-     and use the `--with-gnu-as' configure option when configuring gcc.
-     GNU as is distributed as part of the binutils package.
-
-`mips-sony-sysv'
-     Sony MIPS NEWS.  This works in NEWSOS 5.0.1, but not in 5.0.2
-     (which uses ELF instead of COFF).  Support for 5.0.2 will probably
-     be provided soon by volunteers.  In particular, the linker does
-     not like the code generated by GCC when shared libraries are
-     linked in.
-
-`ns32k-encore'
-     Encore ns32000 system.  Encore systems are supported only under
-     BSD.
-
-`ns32k-*-genix'
-     National Semiconductor ns32000 system.  Genix has bugs in `alloca'
-     and `malloc'; you must get the compiled versions of these from GNU
-     Emacs.
-
-`ns32k-sequent'
-     Go to the Berkeley universe before compiling.  In addition, you
-     probably need to create a file named `string.h' containing just
-     one line: `#include <strings.h>'.
-
-`ns32k-utek'
-     UTEK ns32000 system ("merlin").  The C compiler that comes with
-     this system cannot compile GNU CC; contact `tektronix!reed!mason'
-     to get binaries of GNU CC for bootstrapping.
-
-`romp-*-aos'
-`romp-*-mach'
-     The only operating systems supported for the IBM RT PC are AOS and
-     MACH.  GNU CC does not support AIX running on the RT.  We
-     recommend you compile GNU CC with an earlier version of itself; if
-     you compile GNU CC with `hc', the Metaware compiler, it will work,
-     but you will get mismatches between the stage 2 and stage 3
-     compilers in various files.  These errors are minor differences in
-     some floating-point constants and can be safely ignored; the stage
-     3 compiler is correct.
-
-`rs6000-*-aix'
-`powerpc-*-aix'
-     Various early versions of each release of the IBM XLC compiler
-     will not bootstrap GNU CC.  Symptoms include differences between
-     the stage2 and stage3 object files, and errors when compiling
-     `libgcc.a' or `enquire'.  Known problematic releases include:
-     xlc-1.2.1.8, xlc-1.3.0.0 (distributed with AIX 3.2.5), and
-     xlc-1.3.0.19.  Both xlc-1.2.1.28 and xlc-1.3.0.24 (PTF 432238) are
-     known to produce working versions of GNU CC, but most other recent
-     releases correctly bootstrap GNU CC.  Also, releases of AIX prior
-     to AIX 3.2.4 include a version of the IBM assembler which does not
-     accept debugging directives: assembler updates are available as
-     PTFs.  Also, if you are using AIX 3.2.5 or greater and the GNU
-     assembler, you must have a version modified after October 16th,
-     1995 in order for the GNU C compiler to build.  See the file
-     `README.RS6000' for more details on of these problems.
-
-     GNU CC does not yet support the 64-bit PowerPC instructions.
-
-     Objective C does not work on this architecture because it makes
-     assumptions that are incompatible with the calling conventions.
-
-     AIX on the RS/6000 provides support (NLS) for environments outside
-     of the United States.  Compilers and assemblers use NLS to support
-     locale-specific representations of various objects including
-     floating-point numbers ("." vs "," for separating decimal
-     fractions).  There have been problems reported where the library
-     linked with GNU CC does not produce the same floating-point
-     formats that the assembler accepts.  If you have this problem, set
-     the LANG environment variable to "C" or "En_US".
-
-     Due to changes in the way that GNU CC invokes the binder (linker)
-     for AIX 4.1, you may now receive warnings of duplicate symbols
-     from the link step that were not reported before.  The assembly
-     files generated by GNU CC for AIX have always included multiple
-     symbol definitions for certain global variable and function
-     declarations in the original program.  The warnings should not
-     prevent the linker from producing a correct library or runnable
-     executable.
-
-     By default, AIX 4.1 produces code that can be used on either Power
-     or PowerPC processors.
-
-     You can specify a default version for the `-mcpu='CPU_TYPE switch
-     by using the configure option `--with-cpu-'CPU_TYPE.
-
-`powerpc-*-elf'
-`powerpc-*-sysv4'
-     PowerPC system in big endian mode, running System V.4.
-
-     You can specify a default version for the `-mcpu='CPU_TYPE switch
-     by using the configure option `--with-cpu-'CPU_TYPE.
-
-`powerpc-*-linux-gnu'
-     PowerPC system in big endian mode, running the Linux-based GNU
-     system.
-
-     You can specify a default version for the `-mcpu='CPU_TYPE switch
-     by using the configure option `--with-cpu-'CPU_TYPE.
-
-`powerpc-*-eabiaix'
-     Embedded PowerPC system in big endian mode with -mcall-aix
-     selected as the default.
-
-     You can specify a default version for the `-mcpu='CPU_TYPE switch
-     by using the configure option `--with-cpu-'CPU_TYPE.
-
-`powerpc-*-eabisim'
-     Embedded PowerPC system in big endian mode for use in running
-     under the PSIM simulator.
-
-     You can specify a default version for the `-mcpu='CPU_TYPE switch
-     by using the configure option `--with-cpu-'CPU_TYPE.
-
-`powerpc-*-eabi'
-     Embedded PowerPC system in big endian mode.
-
-     You can specify a default version for the `-mcpu='CPU_TYPE switch
-     by using the configure option `--with-cpu-'CPU_TYPE.
-
-`powerpcle-*-elf'
-`powerpcle-*-sysv4'
-     PowerPC system in little endian mode, running System V.4.
-
-     You can specify a default version for the `-mcpu='CPU_TYPE switch
-     by using the configure option `--with-cpu-'CPU_TYPE.
-
-`powerpcle-*-solaris2*'
-     PowerPC system in little endian mode, running Solaris 2.5.1 or
-     higher.
-
-     You can specify a default version for the `-mcpu='CPU_TYPE switch
-     by using the configure option `--with-cpu-'CPU_TYPE.  Beta
-     versions of the Sun 4.0 compiler do not seem to be able to build
-     GNU CC correctly.  There are also problems with the host assembler
-     and linker that are fixed by using the GNU versions of these tools.
-
-`powerpcle-*-eabisim'
-     Embedded PowerPC system in little endian mode for use in running
-     under the PSIM simulator.
-
-`powerpcle-*-eabi'
-     Embedded PowerPC system in little endian mode.
-
-     You can specify a default version for the `-mcpu='CPU_TYPE switch
-     by using the configure option `--with-cpu-'CPU_TYPE.
-
-`powerpcle-*-winnt'
-`powerpcle-*-pe'
-     PowerPC system in little endian mode running Windows NT.
-
-     You can specify a default version for the `-mcpu='CPU_TYPE switch
-     by using the configure option `--with-cpu-'CPU_TYPE.
-
-`vax-dec-ultrix'
-     Don't try compiling with Vax C (`vcc').  It produces incorrect code
-     in some cases (for example, when `alloca' is used).
-
-     Meanwhile, compiling `cp/parse.c' with pcc does not work because of
-     an internal table size limitation in that compiler.  To avoid this
-     problem, compile just the GNU C compiler first, and use it to
-     recompile building all the languages that you want to run.
-
-`sparc-sun-*'
-     See *Note Sun Install::, for information on installing GNU CC on
-     Sun systems.
-
-`vax-dec-vms'
-     See *Note VMS Install::, for details on how to install GNU CC on
-     VMS.
-
-`we32k-*-*'
-     These computers are also known as the 3b2, 3b5, 3b20 and other
-     similar names.  (However, the 3b1 is actually a 68000; see *Note
-     Configurations::.)
-
-     Don't use `-g' when compiling with the system's compiler.  The
-     system's linker seems to be unable to handle such a large program
-     with debugging information.
-
-     The system's compiler runs out of capacity when compiling `stmt.c'
-     in GNU CC.  You can work around this by building `cpp' in GNU CC
-     first, then use that instead of the system's preprocessor with the
-     system's C compiler to compile `stmt.c'.  Here is how:
-
-          mv /lib/cpp /lib/cpp.att
-          cp cpp /lib/cpp.gnu
-          echo '/lib/cpp.gnu -traditional ${1+"$@"}' > /lib/cpp
-          chmod +x /lib/cpp
-
-     The system's compiler produces bad code for some of the GNU CC
-     optimization files.  So you must build the stage 2 compiler without
-     optimization.  Then build a stage 3 compiler with optimization.
-     That executable should work.  Here are the necessary commands:
-
-          make LANGUAGES=c CC=stage1/xgcc CFLAGS="-Bstage1/ -g"
-          make stage2
-          make CC=stage2/xgcc CFLAGS="-Bstage2/ -g -O"
-
-     You may need to raise the ULIMIT setting to build a C++ compiler,
-     as the file `cc1plus' is larger than one megabyte.
-
-\1f
-File: gcc.info,  Node: Other Dir,  Next: Cross-Compiler,  Prev: Configurations,  Up: Installation
-
-Compilation in a Separate Directory
-===================================
-
-   If you wish to build the object files and executables in a directory
-other than the one containing the source files, here is what you must
-do differently:
-
-  1. Make sure you have a version of Make that supports the `VPATH'
-     feature.  (GNU Make supports it, as do Make versions on most BSD
-     systems.)
-
-  2. If you have ever run `configure' in the source directory, you must
-     undo the configuration.  Do this by running:
-
-          make distclean
-
-  3. Go to the directory in which you want to build the compiler before
-     running `configure':
-
-          mkdir gcc-sun3
-          cd gcc-sun3
-
-     On systems that do not support symbolic links, this directory must
-     be on the same file system as the source code directory.
-
-  4. Specify where to find `configure' when you run it:
-
-          ../gcc/configure ...
-
-     This also tells `configure' where to find the compiler sources;
-     `configure' takes the directory from the file name that was used to
-     invoke it.  But if you want to be sure, you can specify the source
-     directory with the `--srcdir' option, like this:
-
-          ../gcc/configure --srcdir=../gcc OTHER OPTIONS
-
-     The directory you specify with `--srcdir' need not be the same as
-     the one that `configure' is found in.
-
-   Now, you can run `make' in that directory.  You need not repeat the
-configuration steps shown above, when ordinary source files change.  You
-must, however, run `configure' again when the configuration files
-change, if your system does not support symbolic links.
-
-\1f
-File: gcc.info,  Node: Cross-Compiler,  Next: Sun Install,  Prev: Other Dir,  Up: Installation
-
-Building and Installing a Cross-Compiler
-========================================
-
-   GNU CC can function as a cross-compiler for many machines, but not
-all.
-
-   * Cross-compilers for the Mips as target using the Mips assembler
-     currently do not work, because the auxiliary programs
-     `mips-tdump.c' and `mips-tfile.c' can't be compiled on anything
-     but a Mips.  It does work to cross compile for a Mips if you use
-     the GNU assembler and linker.
-
-   * Cross-compilers between machines with different floating point
-     formats have not all been made to work.  GNU CC now has a floating
-     point emulator with which these can work, but each target machine
-     description needs to be updated to take advantage of it.
-
-   * Cross-compilation between machines of different word sizes is
-     somewhat problematic and sometimes does not work.
-
-   Since GNU CC generates assembler code, you probably need a
-cross-assembler that GNU CC can run, in order to produce object files.
-If you want to link on other than the target machine, you need a
-cross-linker as well.  You also need header files and libraries suitable
-for the target machine that you can install on the host machine.
-
-* Menu:
-
-* Steps of Cross::      Using a cross-compiler involves several steps
-                          that may be carried out on different machines.
-* Configure Cross::     Configuring a cross-compiler.
-* Tools and Libraries:: Where to put the linker and assembler, and the C library.
-* Cross Headers::       Finding and installing header files
-                          for a cross-compiler.
-* Cross Runtime::       Supplying arithmetic runtime routines (`libgcc1.a').
-* Build Cross::         Actually compiling the cross-compiler.
-
-\1f
-File: gcc.info,  Node: Steps of Cross,  Next: Configure Cross,  Up: Cross-Compiler
-
-Steps of Cross-Compilation
---------------------------
-
-   To compile and run a program using a cross-compiler involves several
-steps:
-
-   * Run the cross-compiler on the host machine to produce assembler
-     files for the target machine.  This requires header files for the
-     target machine.
-
-   * Assemble the files produced by the cross-compiler.  You can do this
-     either with an assembler on the target machine, or with a
-     cross-assembler on the host machine.
-
-   * Link those files to make an executable.  You can do this either
-     with a linker on the target machine, or with a cross-linker on the
-     host machine.  Whichever machine you use, you need libraries and
-     certain startup files (typically `crt....o') for the target
-     machine.
-
-   It is most convenient to do all of these steps on the same host
-machine, since then you can do it all with a single invocation of GNU
-CC.  This requires a suitable cross-assembler and cross-linker.  For
-some targets, the GNU assembler and linker are available.
-
-\1f
-File: gcc.info,  Node: Configure Cross,  Next: Tools and Libraries,  Prev: Steps of Cross,  Up: Cross-Compiler
-
-Configuring a Cross-Compiler
-----------------------------
-
-   To build GNU CC as a cross-compiler, you start out by running
-`configure'.  Use the `--target=TARGET' to specify the target type.  If
-`configure' was unable to correctly identify the system you are running
-on, also specify the `--build=BUILD' option.  For example, here is how
-to configure for a cross-compiler that produces code for an HP 68030
-system running BSD on a system that `configure' can correctly identify:
-
-     ./configure --target=m68k-hp-bsd4.3
-
-\1f
-File: gcc.info,  Node: Tools and Libraries,  Next: Cross Headers,  Prev: Configure Cross,  Up: Cross-Compiler
-
-Tools and Libraries for a Cross-Compiler
-----------------------------------------
-
-   If you have a cross-assembler and cross-linker available, you should
-install them now.  Put them in the directory `/usr/local/TARGET/bin'.
-Here is a table of the tools you should put in this directory:
-
-`as'
-     This should be the cross-assembler.
-
-`ld'
-     This should be the cross-linker.
-
-`ar'
-     This should be the cross-archiver: a program which can manipulate
-     archive files (linker libraries) in the target machine's format.
-
-`ranlib'
-     This should be a program to construct a symbol table in an archive
-     file.
-
-   The installation of GNU CC will find these programs in that
-directory, and copy or link them to the proper place to for the
-cross-compiler to find them when run later.
-
-   The easiest way to provide these files is to build the Binutils
-package and GAS.  Configure them with the same `--host' and `--target'
-options that you use for configuring GNU CC, then build and install
-them.  They install their executables automatically into the proper
-directory.  Alas, they do not support all the targets that GNU CC
-supports.
-
-   If you want to install libraries to use with the cross-compiler,
-such as a standard C library, put them in the directory
-`/usr/local/TARGET/lib'; installation of GNU CC copies all the files in
-that subdirectory into the proper place for GNU CC to find them and
-link with them.  Here's an example of copying some libraries from a
-target machine:
-
-     ftp TARGET-MACHINE
-     lcd /usr/local/TARGET/lib
-     cd /lib
-     get libc.a
-     cd /usr/lib
-     get libg.a
-     get libm.a
-     quit
-
-The precise set of libraries you'll need, and their locations on the
-target machine, vary depending on its operating system.
-
-   Many targets require "start files" such as `crt0.o' and `crtn.o'
-which are linked into each executable; these too should be placed in
-`/usr/local/TARGET/lib'.  There may be several alternatives for
-`crt0.o', for use with profiling or other compilation options.  Check
-your target's definition of `STARTFILE_SPEC' to find out what start
-files it uses.  Here's an example of copying these files from a target
-machine:
-
-     ftp TARGET-MACHINE
-     lcd /usr/local/TARGET/lib
-     prompt
-     cd /lib
-     mget *crt*.o
-     cd /usr/lib
-     mget *crt*.o
-     quit
-
diff --git a/gcc/gcc.info-8 b/gcc/gcc.info-8
deleted file mode 100644 (file)
index 3f49097..0000000
+++ /dev/null
@@ -1,1202 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Cross Runtime,  Next: Build Cross,  Prev: Cross Headers,  Up: Cross-Compiler
-
-`libgcc.a' and Cross-Compilers
-------------------------------
-
-   Code compiled by GNU CC uses certain runtime support functions
-implicitly.  Some of these functions can be compiled successfully with
-GNU CC itself, but a few cannot be.  These problem functions are in the
-source file `libgcc1.c'; the library made from them is called
-`libgcc1.a'.
-
-   When you build a native compiler, these functions are compiled with
-some other compiler-the one that you use for bootstrapping GNU CC.
-Presumably it knows how to open code these operations, or else knows how
-to call the run-time emulation facilities that the machine comes with.
-But this approach doesn't work for building a cross-compiler.  The
-compiler that you use for building knows about the host system, not the
-target system.
-
-   So, when you build a cross-compiler you have to supply a suitable
-library `libgcc1.a' that does the job it is expected to do.
-
-   To compile `libgcc1.c' with the cross-compiler itself does not work.
-The functions in this file are supposed to implement arithmetic
-operations that GNU CC does not know how to open code for your target
-machine.  If these functions are compiled with GNU CC itself, they will
-compile into infinite recursion.
-
-   On any given target, most of these functions are not needed.  If GNU
-CC can open code an arithmetic operation, it will not call these
-functions to perform the operation.  It is possible that on your target
-machine, none of these functions is needed.  If so, you can supply an
-empty library as `libgcc1.a'.
-
-   Many targets need library support only for multiplication and
-division.  If you are linking with a library that contains functions for
-multiplication and division, you can tell GNU CC to call them directly
-by defining the macros `MULSI3_LIBCALL', and the like.  These macros
-need to be defined in the target description macro file.  For some
-targets, they are defined already.  This may be sufficient to avoid the
-need for libgcc1.a; if so, you can supply an empty library.
-
-   Some targets do not have floating point instructions; they need other
-functions in `libgcc1.a', which do floating arithmetic.  Recent
-versions of GNU CC have a file which emulates floating point.  With a
-certain amount of work, you should be able to construct a floating
-point emulator that can be used as `libgcc1.a'.  Perhaps future
-versions will contain code to do this automatically and conveniently.
-That depends on whether someone wants to implement it.
-
-   Some embedded targets come with all the necessary `libgcc1.a'
-routines written in C or assembler.  These targets build `libgcc1.a'
-automatically and you do not need to do anything special for them.
-Other embedded targets do not need any `libgcc1.a' routines since all
-the necessary operations are supported by the hardware.
-
-   If your target system has another C compiler, you can configure GNU
-CC as a native compiler on that machine, build just `libgcc1.a' with
-`make libgcc1.a' on that machine, and use the resulting file with the
-cross-compiler.  To do this, execute the following on the target
-machine:
-
-     cd TARGET-BUILD-DIR
-     ./configure --host=sparc --target=sun3
-     make libgcc1.a
-
-And then this on the host machine:
-
-     ftp TARGET-MACHINE
-     binary
-     cd TARGET-BUILD-DIR
-     get libgcc1.a
-     quit
-
-   Another way to provide the functions you need in `libgcc1.a' is to
-define the appropriate `perform_...' macros for those functions.  If
-these definitions do not use the C arithmetic operators that they are
-meant to implement, you should be able to compile them with the
-cross-compiler you are building.  (If these definitions already exist
-for your target file, then you are all set.)
-
-   To build `libgcc1.a' using the perform macros, use
-`LIBGCC1=libgcc1.a OLDCC=./xgcc' when building the compiler.
-Otherwise, you should place your replacement library under the name
-`libgcc1.a' in the directory in which you will build the
-cross-compiler, before you run `make'.
-
-\1f
-File: gcc.info,  Node: Cross Headers,  Next: Cross Runtime,  Prev: Tools and Libraries,  Up: Cross-Compiler
-
-Cross-Compilers and Header Files
---------------------------------
-
-   If you are cross-compiling a standalone program or a program for an
-embedded system, then you may not need any header files except the few
-that are part of GNU CC (and those of your program).  However, if you
-intend to link your program with a standard C library such as `libc.a',
-then you probably need to compile with the header files that go with
-the library you use.
-
-   The GNU C compiler does not come with these files, because (1) they
-are system-specific, and (2) they belong in a C library, not in a
-compiler.
-
-   If the GNU C library supports your target machine, then you can get
-the header files from there (assuming you actually use the GNU library
-when you link your program).
-
-   If your target machine comes with a C compiler, it probably comes
-with suitable header files also.  If you make these files accessible
-from the host machine, the cross-compiler can use them also.
-
-   Otherwise, you're on your own in finding header files to use when
-cross-compiling.
-
-   When you have found suitable header files, put them in the directory
-`/usr/local/TARGET/include', before building the cross compiler.  Then
-installation will run fixincludes properly and install the corrected
-versions of the header files where the compiler will use them.
-
-   Provide the header files before you build the cross-compiler, because
-the build stage actually runs the cross-compiler to produce parts of
-`libgcc.a'.  (These are the parts that *can* be compiled with GNU CC.)
-Some of them need suitable header files.
-
-   Here's an example showing how to copy the header files from a target
-machine.  On the target machine, do this:
-
-     (cd /usr/include; tar cf - .) > tarfile
-
-   Then, on the host machine, do this:
-
-     ftp TARGET-MACHINE
-     lcd /usr/local/TARGET/include
-     get tarfile
-     quit
-     tar xf tarfile
-
-\1f
-File: gcc.info,  Node: Build Cross,  Prev: Cross Runtime,  Up: Cross-Compiler
-
-Actually Building the Cross-Compiler
-------------------------------------
-
-   Now you can proceed just as for compiling a single-machine compiler
-through the step of building stage 1.  If you have not provided some
-sort of `libgcc1.a', then compilation will give up at the point where
-it needs that file, printing a suitable error message.  If you do
-provide `libgcc1.a', then building the compiler will automatically
-compile and link a test program called `libgcc1-test'; if you get
-errors in the linking, it means that not all of the necessary routines
-in `libgcc1.a' are available.
-
-   You must provide the header file `float.h'.  One way to do this is
-to compile `enquire' and run it on your target machine.  The job of
-`enquire' is to run on the target machine and figure out by experiment
-the nature of its floating point representation.  `enquire' records its
-findings in the header file `float.h'.  If you can't produce this file
-by running `enquire' on the target machine, then you will need to come
-up with a suitable `float.h' in some other way (or else, avoid using it
-in your programs).
-
-   Do not try to build stage 2 for a cross-compiler.  It doesn't work to
-rebuild GNU CC as a cross-compiler using the cross-compiler, because
-that would produce a program that runs on the target machine, not on the
-host.  For example, if you compile a 386-to-68030 cross-compiler with
-itself, the result will not be right either for the 386 (because it was
-compiled into 68030 code) or for the 68030 (because it was configured
-for a 386 as the host).  If you want to compile GNU CC into 68030 code,
-whether you compile it on a 68030 or with a cross-compiler on a 386, you
-must specify a 68030 as the host when you configure it.
-
-   To install the cross-compiler, use `make install', as usual.
-
-\1f
-File: gcc.info,  Node: Sun Install,  Next: VMS Install,  Prev: Cross-Compiler,  Up: Installation
-
-Installing GNU CC on the Sun
-============================
-
-   On Solaris (version 2.1), do not use the linker or other tools in
-`/usr/ucb' to build GNU CC.  Use `/usr/ccs/bin'.
-
-   Make sure the environment variable `FLOAT_OPTION' is not set when
-you compile `libgcc.a'.  If this option were set to `f68881' when
-`libgcc.a' is compiled, the resulting code would demand to be linked
-with a special startup file and would not link properly without special
-pains.
-
-   There is a bug in `alloca' in certain versions of the Sun library.
-To avoid this bug, install the binaries of GNU CC that were compiled by
-GNU CC.  They use `alloca' as a built-in function and never the one in
-the library.
-
-   Some versions of the Sun compiler crash when compiling GNU CC.  The
-problem is a segmentation fault in cpp.  This problem seems to be due to
-the bulk of data in the environment variables.  You may be able to avoid
-it by using the following command to compile GNU CC with Sun CC:
-
-     make CC="TERMCAP=x OBJS=x LIBFUNCS=x STAGESTUFF=x cc"
-
-   SunOS 4.1.3 and 4.1.3_U1 have bugs that can cause intermittent core
-dumps when compiling GNU CC.  A common symptom is an internal compiler
-error which does not recur if you run it again.  To fix the problem,
-install Sun recommended patch 100726 (for SunOS 4.1.3) or 101508 (for
-SunOS 4.1.3_U1), or upgrade to a later SunOS release.
-
-\1f
-File: gcc.info,  Node: VMS Install,  Next: Collect2,  Prev: Sun Install,  Up: Installation
-
-Installing GNU CC on VMS
-========================
-
-   The VMS version of GNU CC is distributed in a backup saveset
-containing both source code and precompiled binaries.
-
-   To install the `gcc' command so you can use the compiler easily, in
-the same manner as you use the VMS C compiler, you must install the VMS
-CLD file for GNU CC as follows:
-
-  1. Define the VMS logical names `GNU_CC' and `GNU_CC_INCLUDE' to
-     point to the directories where the GNU CC executables
-     (`gcc-cpp.exe', `gcc-cc1.exe', etc.) and the C include files are
-     kept respectively.  This should be done with the commands:
-
-          $ assign /system /translation=concealed -
-            disk:[gcc.] gnu_cc
-          $ assign /system /translation=concealed -
-            disk:[gcc.include.] gnu_cc_include
-
-     with the appropriate disk and directory names.  These commands can
-     be placed in your system startup file so they will be executed
-     whenever the machine is rebooted.  You may, if you choose, do this
-     via the `GCC_INSTALL.COM' script in the `[GCC]' directory.
-
-  2. Install the `GCC' command with the command line:
-
-          $ set command /table=sys$common:[syslib]dcltables -
-            /output=sys$common:[syslib]dcltables gnu_cc:[000000]gcc
-          $ install replace sys$common:[syslib]dcltables
-
-  3. To install the help file, do the following:
-
-          $ library/help sys$library:helplib.hlb gcc.hlp
-
-     Now you can invoke the compiler with a command like `gcc /verbose
-     file.c', which is equivalent to the command `gcc -v -c file.c' in
-     Unix.
-
-   If you wish to use GNU C++ you must first install GNU CC, and then
-perform the following steps:
-
-  1. Define the VMS logical name `GNU_GXX_INCLUDE' to point to the
-     directory where the preprocessor will search for the C++ header
-     files.  This can be done with the command:
-
-          $ assign /system /translation=concealed -
-            disk:[gcc.gxx_include.] gnu_gxx_include
-
-     with the appropriate disk and directory name.  If you are going to
-     be using libg++, this is where the libg++ install procedure will
-     install the libg++ header files.
-
-  2. Obtain the file `gcc-cc1plus.exe', and place this in the same
-     directory that `gcc-cc1.exe' is kept.
-
-     The GNU C++ compiler can be invoked with a command like `gcc /plus
-     /verbose file.cc', which is equivalent to the command `g++ -v -c
-     file.cc' in Unix.
-
-   We try to put corresponding binaries and sources on the VMS
-distribution tape.  But sometimes the binaries will be from an older
-version than the sources, because we don't always have time to update
-them.  (Use the `/version' option to determine the version number of
-the binaries and compare it with the source file `version.c' to tell
-whether this is so.)  In this case, you should use the binaries you get
-to recompile the sources.  If you must recompile, here is how:
-
-  1. Execute the command procedure `vmsconfig.com' to set up the files
-     `tm.h', `config.h', `aux-output.c', and `md.', and to create files
-     `tconfig.h' and `hconfig.h'.  This procedure also creates several
-     linker option files used by `make-cc1.com' and a data file used by
-     `make-l2.com'.
-
-          $ @vmsconfig.com
-
-  2. Setup the logical names and command tables as defined above.  In
-     addition, define the VMS logical name `GNU_BISON' to point at the
-     to the directories where the Bison executable is kept.  This
-     should be done with the command:
-
-          $ assign /system /translation=concealed -
-            disk:[bison.] gnu_bison
-
-     You may, if you choose, use the `INSTALL_BISON.COM' script in the
-     `[BISON]' directory.
-
-  3. Install the `BISON' command with the command line:
-
-          $ set command /table=sys$common:[syslib]dcltables -
-            /output=sys$common:[syslib]dcltables -
-            gnu_bison:[000000]bison
-          $ install replace sys$common:[syslib]dcltables
-
-  4. Type `@make-gcc' to recompile everything (alternatively, submit
-     the file `make-gcc.com' to a batch queue).  If you wish to build
-     the GNU C++ compiler as well as the GNU CC compiler, you must
-     first edit `make-gcc.com' and follow the instructions that appear
-     in the comments.
-
-  5. In order to use GCC, you need a library of functions which GCC
-     compiled code will call to perform certain tasks, and these
-     functions are defined in the file `libgcc2.c'.  To compile this
-     you should use the command procedure `make-l2.com', which will
-     generate the library `libgcc2.olb'.  `libgcc2.olb' should be built
-     using the compiler built from the same distribution that
-     `libgcc2.c' came from, and `make-gcc.com' will automatically do
-     all of this for you.
-
-     To install the library, use the following commands:
-
-          $ library gnu_cc:[000000]gcclib/delete=(new,eprintf)
-          $ library gnu_cc:[000000]gcclib/delete=L_*
-          $ library libgcc2/extract=*/output=libgcc2.obj
-          $ library gnu_cc:[000000]gcclib libgcc2.obj
-
-     The first command simply removes old modules that will be replaced
-     with modules from `libgcc2' under different module names.  The
-     modules `new' and `eprintf' may not actually be present in your
-     `gcclib.olb'--if the VMS librarian complains about those modules
-     not being present, simply ignore the message and continue on with
-     the next command.  The second command removes the modules that
-     came from the previous version of the library `libgcc2.c'.
-
-     Whenever you update the compiler on your system, you should also
-     update the library with the above procedure.
-
-  6. You may wish to build GCC in such a way that no files are written
-     to the directory where the source files reside.  An example would
-     be the when the source files are on a read-only disk.  In these
-     cases, execute the following DCL commands (substituting your
-     actual path names):
-
-          $ assign dua0:[gcc.build_dir.]/translation=concealed, -
-                   dua1:[gcc.source_dir.]/translation=concealed  gcc_build
-          $ set default gcc_build:[000000]
-
-     where the directory `dua1:[gcc.source_dir]' contains the source
-     code, and the directory `dua0:[gcc.build_dir]' is meant to contain
-     all of the generated object files and executables.  Once you have
-     done this, you can proceed building GCC as described above.  (Keep
-     in mind that `gcc_build' is a rooted logical name, and thus the
-     device names in each element of the search list must be an actual
-     physical device name rather than another rooted logical name).
-
-  7. *If you are building GNU CC with a previous version of GNU CC, you
-     also should check to see that you have the newest version of the
-     assembler*.  In particular, GNU CC version 2 treats global constant
-     variables slightly differently from GNU CC version 1, and GAS
-     version 1.38.1 does not have the patches required to work with GCC
-     version 2.  If you use GAS 1.38.1, then `extern const' variables
-     will not have the read-only bit set, and the linker will generate
-     warning messages about mismatched psect attributes for these
-     variables.  These warning messages are merely a nuisance, and can
-     safely be ignored.
-
-     If you are compiling with a version of GNU CC older than 1.33,
-     specify `/DEFINE=("inline=")' as an option in all the
-     compilations.  This requires editing all the `gcc' commands in
-     `make-cc1.com'.  (The older versions had problems supporting
-     `inline'.)  Once you have a working 1.33 or newer GNU CC, you can
-     change this file back.
-
-  8. If you want to build GNU CC with the VAX C compiler, you will need
-     to make minor changes in `make-cccp.com' and `make-cc1.com' to
-     choose alternate definitions of `CC', `CFLAGS', and `LIBS'.  See
-     comments in those files.  However, you must also have a working
-     version of the GNU assembler (GNU as, aka GAS) as it is used as
-     the back-end for GNU CC to produce binary object modules and is
-     not included in the GNU CC sources.  GAS is also needed to compile
-     `libgcc2' in order to build `gcclib' (see above); `make-l2.com'
-     expects to be able to find it operational in
-     `gnu_cc:[000000]gnu-as.exe'.
-
-     To use GNU CC on VMS, you need the VMS driver programs `gcc.exe',
-     `gcc.com', and `gcc.cld'.  They are distributed with the VMS
-     binaries (`gcc-vms') rather than the GNU CC sources.  GAS is also
-     included in `gcc-vms', as is Bison.
-
-     Once you have successfully built GNU CC with VAX C, you should use
-     the resulting compiler to rebuild itself.  Before doing this, be
-     sure to restore the `CC', `CFLAGS', and `LIBS' definitions in
-     `make-cccp.com' and `make-cc1.com'.  The second generation
-     compiler will be able to take advantage of many optimizations that
-     must be suppressed when building with other compilers.
-
-   Under previous versions of GNU CC, the generated code would
-occasionally give strange results when linked with the sharable
-`VAXCRTL' library.  Now this should work.
-
-   Even with this version, however, GNU CC itself should not be linked
-with the sharable `VAXCRTL'.  The version of `qsort' in `VAXCRTL' has a
-bug (known to be present in VMS versions V4.6 through V5.5) which
-causes the compiler to fail.
-
-   The executables are generated by `make-cc1.com' and `make-cccp.com'
-use the object library version of `VAXCRTL' in order to make use of the
-`qsort' routine in `gcclib.olb'.  If you wish to link the compiler
-executables with the shareable image version of `VAXCRTL', you should
-edit the file `tm.h' (created by `vmsconfig.com') to define the macro
-`QSORT_WORKAROUND'.
-
-   `QSORT_WORKAROUND' is always defined when GNU CC is compiled with
-VAX C, to avoid a problem in case `gcclib.olb' is not yet available.
-
-\1f
-File: gcc.info,  Node: Collect2,  Next: Header Dirs,  Prev: VMS Install,  Up: Installation
-
-`collect2'
-==========
-
-   Many target systems do not have support in the assembler and linker
-for "constructors"--initialization functions to be called before the
-official "start" of `main'.  On such systems, GNU CC uses a utility
-called `collect2' to arrange to call these functions at start time.
-
-   The program `collect2' works by linking the program once and looking
-through the linker output file for symbols with particular names
-indicating they are constructor functions.  If it finds any, it creates
-a new temporary `.c' file containing a table of them, compiles it, and
-links the program a second time including that file.
-
-   The actual calls to the constructors are carried out by a subroutine
-called `__main', which is called (automatically) at the beginning of
-the body of `main' (provided `main' was compiled with GNU CC).  Calling
-`__main' is necessary, even when compiling C code, to allow linking C
-and C++ object code together.  (If you use `-nostdlib', you get an
-unresolved reference to `__main', since it's defined in the standard
-GCC library.  Include `-lgcc' at the end of your compiler command line
-to resolve this reference.)
-
-   The program `collect2' is installed as `ld' in the directory where
-the passes of the compiler are installed.  When `collect2' needs to
-find the *real* `ld', it tries the following file names:
-
-   * `real-ld' in the directories listed in the compiler's search
-     directories.
-
-   * `real-ld' in the directories listed in the environment variable
-     `PATH'.
-
-   * The file specified in the `REAL_LD_FILE_NAME' configuration macro,
-     if specified.
-
-   * `ld' in the compiler's search directories, except that `collect2'
-     will not execute itself recursively.
-
-   * `ld' in `PATH'.
-
-   "The compiler's search directories" means all the directories where
-`gcc' searches for passes of the compiler.  This includes directories
-that you specify with `-B'.
-
-   Cross-compilers search a little differently:
-
-   * `real-ld' in the compiler's search directories.
-
-   * `TARGET-real-ld' in `PATH'.
-
-   * The file specified in the `REAL_LD_FILE_NAME' configuration macro,
-     if specified.
-
-   * `ld' in the compiler's search directories.
-
-   * `TARGET-ld' in `PATH'.
-
-   `collect2' explicitly avoids running `ld' using the file name under
-which `collect2' itself was invoked.  In fact, it remembers up a list
-of such names--in case one copy of `collect2' finds another copy (or
-version) of `collect2' installed as `ld' in a second place in the
-search path.
-
-   `collect2' searches for the utilities `nm' and `strip' using the
-same algorithm as above for `ld'.
-
-\1f
-File: gcc.info,  Node: Header Dirs,  Prev: Collect2,  Up: Installation
-
-Standard Header File Directories
-================================
-
-   `GCC_INCLUDE_DIR' means the same thing for native and cross.  It is
-where GNU CC stores its private include files, and also where GNU CC
-stores the fixed include files.  A cross compiled GNU CC runs
-`fixincludes' on the header files in `$(tooldir)/include'.  (If the
-cross compilation header files need to be fixed, they must be installed
-before GNU CC is built.  If the cross compilation header files are
-already suitable for ANSI C and GNU CC, nothing special need be done).
-
-   `GPLUS_INCLUDE_DIR' means the same thing for native and cross.  It
-is where `g++' looks first for header files.  `libg++' installs only
-target independent header files in that directory.
-
-   `LOCAL_INCLUDE_DIR' is used only for a native compiler.  It is
-normally `/usr/local/include'.  GNU CC searches this directory so that
-users can install header files in `/usr/local/include'.
-
-   `CROSS_INCLUDE_DIR' is used only for a cross compiler.  GNU CC
-doesn't install anything there.
-
-   `TOOL_INCLUDE_DIR' is used for both native and cross compilers.  It
-is the place for other packages to install header files that GNU CC will
-use.  For a cross-compiler, this is the equivalent of `/usr/include'.
-When you build a cross-compiler, `fixincludes' processes any header
-files in this directory.
-
-\1f
-File: gcc.info,  Node: C Extensions,  Next: C++ Extensions,  Prev: Installation,  Up: Top
-
-Extensions to the C Language Family
-***********************************
-
-   GNU C provides several language features not found in ANSI standard
-C.  (The `-pedantic' option directs GNU CC to print a warning message if
-any of these features is used.)  To test for the availability of these
-features in conditional compilation, check for a predefined macro
-`__GNUC__', which is always defined under GNU CC.
-
-   These extensions are available in C and Objective C.  Most of them
-are also available in C++.  *Note Extensions to the C++ Language: C++
-Extensions, for extensions that apply *only* to C++.
-
-* Menu:
-
-* Statement Exprs::     Putting statements and declarations inside expressions.
-* Local Labels::        Labels local to a statement-expression.
-* Labels as Values::    Getting pointers to labels, and computed gotos.
-* Nested Functions::    As in Algol and Pascal, lexical scoping of functions.
-* Constructing Calls:: Dispatching a call to another function.
-* Naming Types::        Giving a name to the type of some expression.
-* Typeof::              `typeof': referring to the type of an expression.
-* Lvalues::             Using `?:', `,' and casts in lvalues.
-* Conditionals::        Omitting the middle operand of a `?:' expression.
-* Long Long::          Double-word integers--`long long int'.
-* Complex::             Data types for complex numbers.
-* Zero Length::         Zero-length arrays.
-* Variable Length::     Arrays whose length is computed at run time.
-* Macro Varargs::      Macros with variable number of arguments.
-* Subscripting::        Any array can be subscripted, even if not an lvalue.
-* Pointer Arith::       Arithmetic on `void'-pointers and function pointers.
-* Initializers::        Non-constant initializers.
-* Constructors::        Constructor expressions give structures, unions
-                         or arrays as values.
-* Labeled Elements::   Labeling elements of initializers.
-* Cast to Union::       Casting to union type from any member of the union.
-* Case Ranges::                `case 1 ... 9' and such.
-* Function Attributes:: Declaring that functions have no side effects,
-                         or that they can never return.
-* Function Prototypes:: Prototype declarations and old-style definitions.
-* C++ Comments::        C++ comments are recognized.
-* Dollar Signs::        Dollar sign is allowed in identifiers.
-* Character Escapes::   `\e' stands for the character <ESC>.
-* Variable Attributes::        Specifying attributes of variables.
-* Type Attributes::    Specifying attributes of types.
-* Alignment::           Inquiring about the alignment of a type or variable.
-* Inline::              Defining inline functions (as fast as macros).
-* Extended Asm::        Assembler instructions with C expressions as operands.
-                         (With them you can define "built-in" functions.)
-* Asm Labels::          Specifying the assembler name to use for a C symbol.
-* Explicit Reg Vars::   Defining variables residing in specified registers.
-* Alternate Keywords::  `__const__', `__asm__', etc., for header files.
-* Incomplete Enums::    `enum foo;', with details to follow.
-* Function Names::     Printable strings which are the name of the current
-                        function.
-* Return Address::      Getting the return or frame address of a function.
-
-\1f
-File: gcc.info,  Node: Statement Exprs,  Next: Local Labels,  Up: C Extensions
-
-Statements and Declarations in Expressions
-==========================================
-
-   A compound statement enclosed in parentheses may appear as an
-expression in GNU C.  This allows you to use loops, switches, and local
-variables within an expression.
-
-   Recall that a compound statement is a sequence of statements
-surrounded by braces; in this construct, parentheses go around the
-braces.  For example:
-
-     ({ int y = foo (); int z;
-        if (y > 0) z = y;
-        else z = - y;
-        z; })
-
-is a valid (though slightly more complex than necessary) expression for
-the absolute value of `foo ()'.
-
-   The last thing in the compound statement should be an expression
-followed by a semicolon; the value of this subexpression serves as the
-value of the entire construct.  (If you use some other kind of statement
-last within the braces, the construct has type `void', and thus
-effectively no value.)
-
-   This feature is especially useful in making macro definitions "safe"
-(so that they evaluate each operand exactly once).  For example, the
-"maximum" function is commonly defined as a macro in standard C as
-follows:
-
-     #define max(a,b) ((a) > (b) ? (a) : (b))
-
-But this definition computes either A or B twice, with bad results if
-the operand has side effects.  In GNU C, if you know the type of the
-operands (here let's assume `int'), you can define the macro safely as
-follows:
-
-     #define maxint(a,b) \
-       ({int _a = (a), _b = (b); _a > _b ? _a : _b; })
-
-   Embedded statements are not allowed in constant expressions, such as
-the value of an enumeration constant, the width of a bit field, or the
-initial value of a static variable.
-
-   If you don't know the type of the operand, you can still do this,
-but you must use `typeof' (*note Typeof::.) or type naming (*note
-Naming Types::.).
-
-\1f
-File: gcc.info,  Node: Local Labels,  Next: Labels as Values,  Prev: Statement Exprs,  Up: C Extensions
-
-Locally Declared Labels
-=======================
-
-   Each statement expression is a scope in which "local labels" can be
-declared.  A local label is simply an identifier; you can jump to it
-with an ordinary `goto' statement, but only from within the statement
-expression it belongs to.
-
-   A local label declaration looks like this:
-
-     __label__ LABEL;
-
-or
-
-     __label__ LABEL1, LABEL2, ...;
-
-   Local label declarations must come at the beginning of the statement
-expression, right after the `({', before any ordinary declarations.
-
-   The label declaration defines the label *name*, but does not define
-the label itself.  You must do this in the usual way, with `LABEL:',
-within the statements of the statement expression.
-
-   The local label feature is useful because statement expressions are
-often used in macros.  If the macro contains nested loops, a `goto' can
-be useful for breaking out of them.  However, an ordinary label whose
-scope is the whole function cannot be used: if the macro can be
-expanded several times in one function, the label will be multiply
-defined in that function.  A local label avoids this problem.  For
-example:
-
-     #define SEARCH(array, target)                     \
-     ({                                               \
-       __label__ found;                                \
-       typeof (target) _SEARCH_target = (target);      \
-       typeof (*(array)) *_SEARCH_array = (array);     \
-       int i, j;                                       \
-       int value;                                      \
-       for (i = 0; i < max; i++)                       \
-         for (j = 0; j < max; j++)                     \
-           if (_SEARCH_array[i][j] == _SEARCH_target)  \
-             { value = i; goto found; }              \
-       value = -1;                                     \
-      found:                                           \
-       value;                                          \
-     })
-
-\1f
-File: gcc.info,  Node: Labels as Values,  Next: Nested Functions,  Prev: Local Labels,  Up: C Extensions
-
-Labels as Values
-================
-
-   You can get the address of a label defined in the current function
-(or a containing function) with the unary operator `&&'.  The value has
-type `void *'.  This value is a constant and can be used wherever a
-constant of that type is valid.  For example:
-
-     void *ptr;
-     ...
-     ptr = &&foo;
-
-   To use these values, you need to be able to jump to one.  This is
-done with the computed goto statement(1), `goto *EXP;'.  For example,
-
-     goto *ptr;
-
-Any expression of type `void *' is allowed.
-
-   One way of using these constants is in initializing a static array
-that will serve as a jump table:
-
-     static void *array[] = { &&foo, &&bar, &&hack };
-
-   Then you can select a label with indexing, like this:
-
-     goto *array[i];
-
-Note that this does not check whether the subscript is in bounds--array
-indexing in C never does that.
-
-   Such an array of label values serves a purpose much like that of the
-`switch' statement.  The `switch' statement is cleaner, so use that
-rather than an array unless the problem does not fit a `switch'
-statement very well.
-
-   Another use of label values is in an interpreter for threaded code.
-The labels within the interpreter function can be stored in the
-threaded code for super-fast dispatching.
-
-   You can use this mechanism to jump to code in a different function.
-If you do that, totally unpredictable things will happen.  The best way
-to avoid this is to store the label address only in automatic variables
-and never pass it as an argument.
-
-   ---------- Footnotes ----------
-
-   (1) The analogous feature in Fortran is called an assigned goto, but
-that name seems inappropriate in C, where one can do more than simply
-store label addresses in label variables.
-
-\1f
-File: gcc.info,  Node: Nested Functions,  Next: Constructing Calls,  Prev: Labels as Values,  Up: C Extensions
-
-Nested Functions
-================
-
-   A "nested function" is a function defined inside another function.
-(Nested functions are not supported for GNU C++.)  The nested function's
-name is local to the block where it is defined.  For example, here we
-define a nested function named `square', and call it twice:
-
-     foo (double a, double b)
-     {
-       double square (double z) { return z * z; }
-     
-       return square (a) + square (b);
-     }
-
-   The nested function can access all the variables of the containing
-function that are visible at the point of its definition.  This is
-called "lexical scoping".  For example, here we show a nested function
-which uses an inherited variable named `offset':
-
-     bar (int *array, int offset, int size)
-     {
-       int access (int *array, int index)
-         { return array[index + offset]; }
-       int i;
-       ...
-       for (i = 0; i < size; i++)
-         ... access (array, i) ...
-     }
-
-   Nested function definitions are permitted within functions in the
-places where variable definitions are allowed; that is, in any block,
-before the first statement in the block.
-
-   It is possible to call the nested function from outside the scope of
-its name by storing its address or passing the address to another
-function:
-
-     hack (int *array, int size)
-     {
-       void store (int index, int value)
-         { array[index] = value; }
-     
-       intermediate (store, size);
-     }
-
-   Here, the function `intermediate' receives the address of `store' as
-an argument.  If `intermediate' calls `store', the arguments given to
-`store' are used to store into `array'.  But this technique works only
-so long as the containing function (`hack', in this example) does not
-exit.
-
-   If you try to call the nested function through its address after the
-containing function has exited, all hell will break loose.  If you try
-to call it after a containing scope level has exited, and if it refers
-to some of the variables that are no longer in scope, you may be lucky,
-but it's not wise to take the risk.  If, however, the nested function
-does not refer to anything that has gone out of scope, you should be
-safe.
-
-   GNU CC implements taking the address of a nested function using a
-technique called "trampolines".  A paper describing them is available
-from `maya.idiap.ch' in directory `pub/tmb', file `usenix88-lexic.ps.Z'.
-
-   A nested function can jump to a label inherited from a containing
-function, provided the label was explicitly declared in the containing
-function (*note Local Labels::.).  Such a jump returns instantly to the
-containing function, exiting the nested function which did the `goto'
-and any intermediate functions as well.  Here is an example:
-
-     bar (int *array, int offset, int size)
-     {
-       __label__ failure;
-       int access (int *array, int index)
-         {
-           if (index > size)
-             goto failure;
-           return array[index + offset];
-         }
-       int i;
-       ...
-       for (i = 0; i < size; i++)
-         ... access (array, i) ...
-       ...
-       return 0;
-     
-      /* Control comes here from `access'
-         if it detects an error.  */
-      failure:
-       return -1;
-     }
-
-   A nested function always has internal linkage.  Declaring one with
-`extern' is erroneous.  If you need to declare the nested function
-before its definition, use `auto' (which is otherwise meaningless for
-function declarations).
-
-     bar (int *array, int offset, int size)
-     {
-       __label__ failure;
-       auto int access (int *, int);
-       ...
-       int access (int *array, int index)
-         {
-           if (index > size)
-             goto failure;
-           return array[index + offset];
-         }
-       ...
-     }
-
-\1f
-File: gcc.info,  Node: Constructing Calls,  Next: Naming Types,  Prev: Nested Functions,  Up: C Extensions
-
-Constructing Function Calls
-===========================
-
-   Using the built-in functions described below, you can record the
-arguments a function received, and call another function with the same
-arguments, without knowing the number or types of the arguments.
-
-   You can also record the return value of that function call, and
-later return that value, without knowing what data type the function
-tried to return (as long as your caller expects that data type).
-
-`__builtin_apply_args ()'
-     This built-in function returns a pointer of type `void *' to data
-     describing how to perform a call with the same arguments as were
-     passed to the current function.
-
-     The function saves the arg pointer register, structure value
-     address, and all registers that might be used to pass arguments to
-     a function into a block of memory allocated on the stack.  Then it
-     returns the address of that block.
-
-`__builtin_apply (FUNCTION, ARGUMENTS, SIZE)'
-     This built-in function invokes FUNCTION (type `void (*)()') with a
-     copy of the parameters described by ARGUMENTS (type `void *') and
-     SIZE (type `int').
-
-     The value of ARGUMENTS should be the value returned by
-     `__builtin_apply_args'.  The argument SIZE specifies the size of
-     the stack argument data, in bytes.
-
-     This function returns a pointer of type `void *' to data describing
-     how to return whatever value was returned by FUNCTION.  The data
-     is saved in a block of memory allocated on the stack.
-
-     It is not always simple to compute the proper value for SIZE.  The
-     value is used by `__builtin_apply' to compute the amount of data
-     that should be pushed on the stack and copied from the incoming
-     argument area.
-
-`__builtin_return (RESULT)'
-     This built-in function returns the value described by RESULT from
-     the containing function.  You should specify, for RESULT, a value
-     returned by `__builtin_apply'.
-
-\1f
-File: gcc.info,  Node: Naming Types,  Next: Typeof,  Prev: Constructing Calls,  Up: C Extensions
-
-Naming an Expression's Type
-===========================
-
-   You can give a name to the type of an expression using a `typedef'
-declaration with an initializer.  Here is how to define NAME as a type
-name for the type of EXP:
-
-     typedef NAME = EXP;
-
-   This is useful in conjunction with the statements-within-expressions
-feature.  Here is how the two together can be used to define a safe
-"maximum" macro that operates on any arithmetic type:
-
-     #define max(a,b) \
-       ({typedef _ta = (a), _tb = (b);  \
-         _ta _a = (a); _tb _b = (b);     \
-         _a > _b ? _a : _b; })
-
-   The reason for using names that start with underscores for the local
-variables is to avoid conflicts with variable names that occur within
-the expressions that are substituted for `a' and `b'.  Eventually we
-hope to design a new form of declaration syntax that allows you to
-declare variables whose scopes start only after their initializers;
-this will be a more reliable way to prevent such conflicts.
-
-\1f
-File: gcc.info,  Node: Typeof,  Next: Lvalues,  Prev: Naming Types,  Up: C Extensions
-
-Referring to a Type with `typeof'
-=================================
-
-   Another way to refer to the type of an expression is with `typeof'.
-The syntax of using of this keyword looks like `sizeof', but the
-construct acts semantically like a type name defined with `typedef'.
-
-   There are two ways of writing the argument to `typeof': with an
-expression or with a type.  Here is an example with an expression:
-
-     typeof (x[0](1))
-
-This assumes that `x' is an array of functions; the type described is
-that of the values of the functions.
-
-   Here is an example with a typename as the argument:
-
-     typeof (int *)
-
-Here the type described is that of pointers to `int'.
-
-   If you are writing a header file that must work when included in
-ANSI C programs, write `__typeof__' instead of `typeof'.  *Note
-Alternate Keywords::.
-
-   A `typeof'-construct can be used anywhere a typedef name could be
-used.  For example, you can use it in a declaration, in a cast, or
-inside of `sizeof' or `typeof'.
-
-   * This declares `y' with the type of what `x' points to.
-
-          typeof (*x) y;
-
-   * This declares `y' as an array of such values.
-
-          typeof (*x) y[4];
-
-   * This declares `y' as an array of pointers to characters:
-
-          typeof (typeof (char *)[4]) y;
-
-     It is equivalent to the following traditional C declaration:
-
-          char *y[4];
-
-     To see the meaning of the declaration using `typeof', and why it
-     might be a useful way to write, let's rewrite it with these macros:
-
-          #define pointer(T)  typeof(T *)
-          #define array(T, N) typeof(T [N])
-
-     Now the declaration can be rewritten this way:
-
-          array (pointer (char), 4) y;
-
-     Thus, `array (pointer (char), 4)' is the type of arrays of 4
-     pointers to `char'.
-
-\1f
-File: gcc.info,  Node: Lvalues,  Next: Conditionals,  Prev: Typeof,  Up: C Extensions
-
-Generalized Lvalues
-===================
-
-   Compound expressions, conditional expressions and casts are allowed
-as lvalues provided their operands are lvalues.  This means that you
-can take their addresses or store values into them.
-
-   Standard C++ allows compound expressions and conditional expressions
-as lvalues, and permits casts to reference type, so use of this
-extension is deprecated for C++ code.
-
-   For example, a compound expression can be assigned, provided the last
-expression in the sequence is an lvalue.  These two expressions are
-equivalent:
-
-     (a, b) += 5
-     a, (b += 5)
-
-   Similarly, the address of the compound expression can be taken.
-These two expressions are equivalent:
-
-     &(a, b)
-     a, &b
-
-   A conditional expression is a valid lvalue if its type is not void
-and the true and false branches are both valid lvalues.  For example,
-these two expressions are equivalent:
-
-     (a ? b : c) = 5
-     (a ? b = 5 : (c = 5))
-
-   A cast is a valid lvalue if its operand is an lvalue.  A simple
-assignment whose left-hand side is a cast works by converting the
-right-hand side first to the specified type, then to the type of the
-inner left-hand side expression.  After this is stored, the value is
-converted back to the specified type to become the value of the
-assignment.  Thus, if `a' has type `char *', the following two
-expressions are equivalent:
-
-     (int)a = 5
-     (int)(a = (char *)(int)5)
-
-   An assignment-with-arithmetic operation such as `+=' applied to a
-cast performs the arithmetic using the type resulting from the cast,
-and then continues as in the previous case.  Therefore, these two
-expressions are equivalent:
-
-     (int)a += 5
-     (int)(a = (char *)(int) ((int)a + 5))
-
-   You cannot take the address of an lvalue cast, because the use of its
-address would not work out coherently.  Suppose that `&(int)f' were
-permitted, where `f' has type `float'.  Then the following statement
-would try to store an integer bit-pattern where a floating point number
-belongs:
-
-     *&(int)f = 1;
-
-   This is quite different from what `(int)f = 1' would do--that would
-convert 1 to floating point and store it.  Rather than cause this
-inconsistency, we think it is better to prohibit use of `&' on a cast.
-
-   If you really do want an `int *' pointer with the address of `f',
-you can simply write `(int *)&f'.
-
-\1f
-File: gcc.info,  Node: Conditionals,  Next: Long Long,  Prev: Lvalues,  Up: C Extensions
-
-Conditionals with Omitted Operands
-==================================
-
-   The middle operand in a conditional expression may be omitted.  Then
-if the first operand is nonzero, its value is the value of the
-conditional expression.
-
-   Therefore, the expression
-
-     x ? : y
-
-has the value of `x' if that is nonzero; otherwise, the value of `y'.
-
-   This example is perfectly equivalent to
-
-     x ? x : y
-
-In this simple case, the ability to omit the middle operand is not
-especially useful.  When it becomes useful is when the first operand
-does, or may (if it is a macro argument), contain a side effect.  Then
-repeating the operand in the middle would perform the side effect
-twice.  Omitting the middle operand uses the value already computed
-without the undesirable effects of recomputing it.
-
-\1f
-File: gcc.info,  Node: Long Long,  Next: Complex,  Prev: Conditionals,  Up: C Extensions
-
-Double-Word Integers
-====================
-
-   GNU C supports data types for integers that are twice as long as
-`int'.  Simply write `long long int' for a signed integer, or `unsigned
-long long int' for an unsigned integer.  To make an integer constant of
-type `long long int', add the suffix `LL' to the integer.  To make an
-integer constant of type `unsigned long long int', add the suffix `ULL'
-to the integer.
-
-   You can use these types in arithmetic like any other integer types.
-Addition, subtraction, and bitwise boolean operations on these types
-are open-coded on all types of machines.  Multiplication is open-coded
-if the machine supports fullword-to-doubleword a widening multiply
-instruction.  Division and shifts are open-coded only on machines that
-provide special support.  The operations that are not open-coded use
-special library routines that come with GNU CC.
-
-   There may be pitfalls when you use `long long' types for function
-arguments, unless you declare function prototypes.  If a function
-expects type `int' for its argument, and you pass a value of type `long
-long int', confusion will result because the caller and the subroutine
-will disagree about the number of bytes for the argument.  Likewise, if
-the function expects `long long int' and you pass `int'.  The best way
-to avoid such problems is to use prototypes.
-
-\1f
-File: gcc.info,  Node: Complex,  Next: Zero Length,  Prev: Long Long,  Up: C Extensions
-
-Complex Numbers
-===============
-
-   GNU C supports complex data types.  You can declare both complex
-integer types and complex floating types, using the keyword
-`__complex__'.
-
-   For example, `__complex__ double x;' declares `x' as a variable
-whose real part and imaginary part are both of type `double'.
-`__complex__ short int y;' declares `y' to have real and imaginary
-parts of type `short int'; this is not likely to be useful, but it
-shows that the set of complex types is complete.
-
-   To write a constant with a complex data type, use the suffix `i' or
-`j' (either one; they are equivalent).  For example, `2.5fi' has type
-`__complex__ float' and `3i' has type `__complex__ int'.  Such a
-constant always has a pure imaginary value, but you can form any
-complex value you like by adding one to a real constant.
-
-   To extract the real part of a complex-valued expression EXP, write
-`__real__ EXP'.  Likewise, use `__imag__' to extract the imaginary part.
-
-   The operator `~' performs complex conjugation when used on a value
-with a complex type.
-
-   GNU CC can allocate complex automatic variables in a noncontiguous
-fashion; it's even possible for the real part to be in a register while
-the imaginary part is on the stack (or vice-versa).  None of the
-supported debugging info formats has a way to represent noncontiguous
-allocation like this, so GNU CC describes a noncontiguous complex
-variable as if it were two separate variables of noncomplex type.  If
-the variable's actual name is `foo', the two fictitious variables are
-named `foo$real' and `foo$imag'.  You can examine and set these two
-fictitious variables with your debugger.
-
-   A future version of GDB will know how to recognize such pairs and
-treat them as a single variable with a complex type.
-
-\1f
-File: gcc.info,  Node: Zero Length,  Next: Variable Length,  Prev: Complex,  Up: C Extensions
-
-Arrays of Length Zero
-=====================
-
-   Zero-length arrays are allowed in GNU C.  They are very useful as
-the last element of a structure which is really a header for a
-variable-length object:
-
-     struct line {
-       int length;
-       char contents[0];
-     };
-     
-     {
-       struct line *thisline = (struct line *)
-         malloc (sizeof (struct line) + this_length);
-       thisline->length = this_length;
-     }
-
-   In standard C, you would have to give `contents' a length of 1, which
-means either you waste space or complicate the argument to `malloc'.
-
diff --git a/gcc/gcc.info-9 b/gcc/gcc.info-9
deleted file mode 100644 (file)
index 822751e..0000000
+++ /dev/null
@@ -1,1225 +0,0 @@
-This is Info file gcc.info, produced by Makeinfo version 1.68 from the
-input file gcc.texi.
-
-   This file documents the use and the internals of the GNU compiler.
-
-   Published by the Free Software Foundation 59 Temple Place - Suite 330
-Boston, MA 02111-1307 USA
-
-   Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided also
-that the sections entitled "GNU General Public License," "Funding for
-Free Software," and "Protect Your Freedom--Fight `Look And Feel'" are
-included exactly as in the original, and provided that the entire
-resulting derived work is distributed under the terms of a permission
-notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that the sections entitled "GNU General Public
-License," "Funding for Free Software," and "Protect Your Freedom--Fight
-`Look And Feel'", and this permission notice, may be included in
-translations approved by the Free Software Foundation instead of in the
-original English.
-
-\1f
-File: gcc.info,  Node: Variable Length,  Next: Macro Varargs,  Prev: Zero Length,  Up: C Extensions
-
-Arrays of Variable Length
-=========================
-
-   Variable-length automatic arrays are allowed in GNU C.  These arrays
-are declared like any other automatic arrays, but with a length that is
-not a constant expression.  The storage is allocated at the point of
-declaration and deallocated when the brace-level is exited.  For
-example:
-
-     FILE *
-     concat_fopen (char *s1, char *s2, char *mode)
-     {
-       char str[strlen (s1) + strlen (s2) + 1];
-       strcpy (str, s1);
-       strcat (str, s2);
-       return fopen (str, mode);
-     }
-
-   Jumping or breaking out of the scope of the array name deallocates
-the storage.  Jumping into the scope is not allowed; you get an error
-message for it.
-
-   You can use the function `alloca' to get an effect much like
-variable-length arrays.  The function `alloca' is available in many
-other C implementations (but not in all).  On the other hand,
-variable-length arrays are more elegant.
-
-   There are other differences between these two methods.  Space
-allocated with `alloca' exists until the containing *function* returns.
-The space for a variable-length array is deallocated as soon as the
-array name's scope ends.  (If you use both variable-length arrays and
-`alloca' in the same function, deallocation of a variable-length array
-will also deallocate anything more recently allocated with `alloca'.)
-
-   You can also use variable-length arrays as arguments to functions:
-
-     struct entry
-     tester (int len, char data[len][len])
-     {
-       ...
-     }
-
-   The length of an array is computed once when the storage is allocated
-and is remembered for the scope of the array in case you access it with
-`sizeof'.
-
-   If you want to pass the array first and the length afterward, you can
-use a forward declaration in the parameter list--another GNU extension.
-
-     struct entry
-     tester (int len; char data[len][len], int len)
-     {
-       ...
-     }
-
-   The `int len' before the semicolon is a "parameter forward
-declaration", and it serves the purpose of making the name `len' known
-when the declaration of `data' is parsed.
-
-   You can write any number of such parameter forward declarations in
-the parameter list.  They can be separated by commas or semicolons, but
-the last one must end with a semicolon, which is followed by the "real"
-parameter declarations.  Each forward declaration must match a "real"
-declaration in parameter name and data type.
-
-\1f
-File: gcc.info,  Node: Macro Varargs,  Next: Subscripting,  Prev: Variable Length,  Up: C Extensions
-
-Macros with Variable Numbers of Arguments
-=========================================
-
-   In GNU C, a macro can accept a variable number of arguments, much as
-a function can.  The syntax for defining the macro looks much like that
-used for a function.  Here is an example:
-
-     #define eprintf(format, args...)  \
-      fprintf (stderr, format , ## args)
-
-   Here `args' is a "rest argument": it takes in zero or more
-arguments, as many as the call contains.  All of them plus the commas
-between them form the value of `args', which is substituted into the
-macro body where `args' is used.  Thus, we have this expansion:
-
-     eprintf ("%s:%d: ", input_file_name, line_number)
-     ==>
-     fprintf (stderr, "%s:%d: " , input_file_name, line_number)
-
-Note that the comma after the string constant comes from the definition
-of `eprintf', whereas the last comma comes from the value of `args'.
-
-   The reason for using `##' is to handle the case when `args' matches
-no arguments at all.  In this case, `args' has an empty value.  In this
-case, the second comma in the definition becomes an embarrassment: if
-it got through to the expansion of the macro, we would get something
-like this:
-
-     fprintf (stderr, "success!\n" , )
-
-which is invalid C syntax.  `##' gets rid of the comma, so we get the
-following instead:
-
-     fprintf (stderr, "success!\n")
-
-   This is a special feature of the GNU C preprocessor: `##' before a
-rest argument that is empty discards the preceding sequence of
-non-whitespace characters from the macro definition.  (If another macro
-argument precedes, none of it is discarded.)
-
-   It might be better to discard the last preprocessor token instead of
-the last preceding sequence of non-whitespace characters; in fact, we
-may someday change this feature to do so.  We advise you to write the
-macro definition so that the preceding sequence of non-whitespace
-characters is just a single token, so that the meaning will not change
-if we change the definition of this feature.
-
-\1f
-File: gcc.info,  Node: Subscripting,  Next: Pointer Arith,  Prev: Macro Varargs,  Up: C Extensions
-
-Non-Lvalue Arrays May Have Subscripts
-=====================================
-
-   Subscripting is allowed on arrays that are not lvalues, even though
-the unary `&' operator is not.  For example, this is valid in GNU C
-though not valid in other C dialects:
-
-     struct foo {int a[4];};
-     
-     struct foo f();
-     
-     bar (int index)
-     {
-       return f().a[index];
-     }
-
-\1f
-File: gcc.info,  Node: Pointer Arith,  Next: Initializers,  Prev: Subscripting,  Up: C Extensions
-
-Arithmetic on `void'- and Function-Pointers
-===========================================
-
-   In GNU C, addition and subtraction operations are supported on
-pointers to `void' and on pointers to functions.  This is done by
-treating the size of a `void' or of a function as 1.
-
-   A consequence of this is that `sizeof' is also allowed on `void' and
-on function types, and returns 1.
-
-   The option `-Wpointer-arith' requests a warning if these extensions
-are used.
-
-\1f
-File: gcc.info,  Node: Initializers,  Next: Constructors,  Prev: Pointer Arith,  Up: C Extensions
-
-Non-Constant Initializers
-=========================
-
-   As in standard C++, the elements of an aggregate initializer for an
-automatic variable are not required to be constant expressions in GNU C.
-Here is an example of an initializer with run-time varying elements:
-
-     foo (float f, float g)
-     {
-       float beat_freqs[2] = { f-g, f+g };
-       ...
-     }
-
-\1f
-File: gcc.info,  Node: Constructors,  Next: Labeled Elements,  Prev: Initializers,  Up: C Extensions
-
-Constructor Expressions
-=======================
-
-   GNU C supports constructor expressions.  A constructor looks like a
-cast containing an initializer.  Its value is an object of the type
-specified in the cast, containing the elements specified in the
-initializer.
-
-   Usually, the specified type is a structure.  Assume that `struct
-foo' and `structure' are declared as shown:
-
-     struct foo {int a; char b[2];} structure;
-
-Here is an example of constructing a `struct foo' with a constructor:
-
-     structure = ((struct foo) {x + y, 'a', 0});
-
-This is equivalent to writing the following:
-
-     {
-       struct foo temp = {x + y, 'a', 0};
-       structure = temp;
-     }
-
-   You can also construct an array.  If all the elements of the
-constructor are (made up of) simple constant expressions, suitable for
-use in initializers, then the constructor is an lvalue and can be
-coerced to a pointer to its first element, as shown here:
-
-     char **foo = (char *[]) { "x", "y", "z" };
-
-   Array constructors whose elements are not simple constants are not
-very useful, because the constructor is not an lvalue.  There are only
-two valid ways to use it: to subscript it, or initialize an array
-variable with it.  The former is probably slower than a `switch'
-statement, while the latter does the same thing an ordinary C
-initializer would do.  Here is an example of subscripting an array
-constructor:
-
-     output = ((int[]) { 2, x, 28 }) [input];
-
-   Constructor expressions for scalar types and union types are is also
-allowed, but then the constructor expression is equivalent to a cast.
-
-\1f
-File: gcc.info,  Node: Labeled Elements,  Next: Cast to Union,  Prev: Constructors,  Up: C Extensions
-
-Labeled Elements in Initializers
-================================
-
-   Standard C requires the elements of an initializer to appear in a
-fixed order, the same as the order of the elements in the array or
-structure being initialized.
-
-   In GNU C you can give the elements in any order, specifying the array
-indices or structure field names they apply to.  This extension is not
-implemented in GNU C++.
-
-   To specify an array index, write `[INDEX]' or `[INDEX] =' before the
-element value.  For example,
-
-     int a[6] = { [4] 29, [2] = 15 };
-
-is equivalent to
-
-     int a[6] = { 0, 0, 15, 0, 29, 0 };
-
-The index values must be constant expressions, even if the array being
-initialized is automatic.
-
-   To initialize a range of elements to the same value, write `[FIRST
-... LAST] = VALUE'.  For example,
-
-     int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
-
-Note that the length of the array is the highest value specified plus
-one.
-
-   In a structure initializer, specify the name of a field to initialize
-with `FIELDNAME:' before the element value.  For example, given the
-following structure,
-
-     struct point { int x, y; };
-
-the following initialization
-
-     struct point p = { y: yvalue, x: xvalue };
-
-is equivalent to
-
-     struct point p = { xvalue, yvalue };
-
-   Another syntax which has the same meaning is `.FIELDNAME ='., as
-shown here:
-
-     struct point p = { .y = yvalue, .x = xvalue };
-
-   You can also use an element label (with either the colon syntax or
-the period-equal syntax) when initializing a union, to specify which
-element of the union should be used.  For example,
-
-     union foo { int i; double d; };
-     
-     union foo f = { d: 4 };
-
-will convert 4 to a `double' to store it in the union using the second
-element.  By contrast, casting 4 to type `union foo' would store it
-into the union as the integer `i', since it is an integer.  (*Note Cast
-to Union::.)
-
-   You can combine this technique of naming elements with ordinary C
-initialization of successive elements.  Each initializer element that
-does not have a label applies to the next consecutive element of the
-array or structure.  For example,
-
-     int a[6] = { [1] = v1, v2, [4] = v4 };
-
-is equivalent to
-
-     int a[6] = { 0, v1, v2, 0, v4, 0 };
-
-   Labeling the elements of an array initializer is especially useful
-when the indices are characters or belong to an `enum' type.  For
-example:
-
-     int whitespace[256]
-       = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
-           ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };
-
-\1f
-File: gcc.info,  Node: Case Ranges,  Next: Function Attributes,  Prev: Cast to Union,  Up: C Extensions
-
-Case Ranges
-===========
-
-   You can specify a range of consecutive values in a single `case'
-label, like this:
-
-     case LOW ... HIGH:
-
-This has the same effect as the proper number of individual `case'
-labels, one for each integer value from LOW to HIGH, inclusive.
-
-   This feature is especially useful for ranges of ASCII character
-codes:
-
-     case 'A' ... 'Z':
-
-   *Be careful:* Write spaces around the `...', for otherwise it may be
-parsed wrong when you use it with integer values.  For example, write
-this:
-
-     case 1 ... 5:
-
-rather than this:
-
-     case 1...5:
-
-\1f
-File: gcc.info,  Node: Cast to Union,  Next: Case Ranges,  Prev: Labeled Elements,  Up: C Extensions
-
-Cast to a Union Type
-====================
-
-   A cast to union type is similar to other casts, except that the type
-specified is a union type.  You can specify the type either with `union
-TAG' or with a typedef name.  A cast to union is actually a constructor
-though, not a cast, and hence does not yield an lvalue like normal
-casts.  (*Note Constructors::.)
-
-   The types that may be cast to the union type are those of the members
-of the union.  Thus, given the following union and variables:
-
-     union foo { int i; double d; };
-     int x;
-     double y;
-
-both `x' and `y' can be cast to type `union' foo.
-
-   Using the cast as the right-hand side of an assignment to a variable
-of union type is equivalent to storing in a member of the union:
-
-     union foo u;
-     ...
-     u = (union foo) x  ==  u.i = x
-     u = (union foo) y  ==  u.d = y
-
-   You can also use the union cast as a function argument:
-
-     void hack (union foo);
-     ...
-     hack ((union foo) x);
-
-\1f
-File: gcc.info,  Node: Function Attributes,  Next: Function Prototypes,  Prev: Case Ranges,  Up: C Extensions
-
-Declaring Attributes of Functions
-=================================
-
-   In GNU C, you declare certain things about functions called in your
-program which help the compiler optimize function calls and check your
-code more carefully.
-
-   The keyword `__attribute__' allows you to specify special attributes
-when making a declaration.  This keyword is followed by an attribute
-specification inside double parentheses.  Eight attributes, `noreturn',
-`const', `format', `section', `constructor', `destructor', `unused' and
-`weak' are currently defined for functions.  Other attributes, including
-`section' are supported for variables declarations (*note Variable
-Attributes::.) and for types (*note Type Attributes::.).
-
-   You may also specify attributes with `__' preceding and following
-each keyword.  This allows you to use them in header files without
-being concerned about a possible macro of the same name.  For example,
-you may use `__noreturn__' instead of `noreturn'.
-
-`noreturn'
-     A few standard library functions, such as `abort' and `exit',
-     cannot return.  GNU CC knows this automatically.  Some programs
-     define their own functions that never return.  You can declare them
-     `noreturn' to tell the compiler this fact.  For example,
-
-          void fatal () __attribute__ ((noreturn));
-          
-          void
-          fatal (...)
-          {
-            ... /* Print error message. */ ...
-            exit (1);
-          }
-
-     The `noreturn' keyword tells the compiler to assume that `fatal'
-     cannot return.  It can then optimize without regard to what would
-     happen if `fatal' ever did return.  This makes slightly better
-     code.  More importantly, it helps avoid spurious warnings of
-     uninitialized variables.
-
-     Do not assume that registers saved by the calling function are
-     restored before calling the `noreturn' function.
-
-     It does not make sense for a `noreturn' function to have a return
-     type other than `void'.
-
-     The attribute `noreturn' is not implemented in GNU C versions
-     earlier than 2.5.  An alternative way to declare that a function
-     does not return, which works in the current version and in some
-     older versions, is as follows:
-
-          typedef void voidfn ();
-          
-          volatile voidfn fatal;
-
-`const'
-     Many functions do not examine any values except their arguments,
-     and have no effects except the return value.  Such a function can
-     be subject to common subexpression elimination and loop
-     optimization just as an arithmetic operator would be.  These
-     functions should be declared with the attribute `const'.  For
-     example,
-
-          int square (int) __attribute__ ((const));
-
-     says that the hypothetical function `square' is safe to call fewer
-     times than the program says.
-
-     The attribute `const' is not implemented in GNU C versions earlier
-     than 2.5.  An alternative way to declare that a function has no
-     side effects, which works in the current version and in some older
-     versions, is as follows:
-
-          typedef int intfn ();
-          
-          extern const intfn square;
-
-     This approach does not work in GNU C++ from 2.6.0 on, since the
-     language specifies that the `const' must be attached to the return
-     value.
-
-     Note that a function that has pointer arguments and examines the
-     data pointed to must *not* be declared `const'.  Likewise, a
-     function that calls a non-`const' function usually must not be
-     `const'.  It does not make sense for a `const' function to return
-     `void'.
-
-`format (ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)'
-     The `format' attribute specifies that a function takes `printf' or
-     `scanf' style arguments which should be type-checked against a
-     format string.  For example, the declaration:
-
-          extern int
-          my_printf (void *my_object, const char *my_format, ...)
-                __attribute__ ((format (printf, 2, 3)));
-
-     causes the compiler to check the arguments in calls to `my_printf'
-     for consistency with the `printf' style format string argument
-     `my_format'.
-
-     The parameter ARCHETYPE determines how the format string is
-     interpreted, and should be either `printf' or `scanf'.  The
-     parameter STRING-INDEX specifies which argument is the format
-     string argument (starting from 1), while FIRST-TO-CHECK is the
-     number of the first argument to check against the format string.
-     For functions where the arguments are not available to be checked
-     (such as `vprintf'), specify the third parameter as zero.  In this
-     case the compiler only checks the format string for consistency.
-
-     In the example above, the format string (`my_format') is the second
-     argument of the function `my_print', and the arguments to check
-     start with the third argument, so the correct parameters for the
-     format attribute are 2 and 3.
-
-     The `format' attribute allows you to identify your own functions
-     which take format strings as arguments, so that GNU CC can check
-     the calls to these functions for errors.  The compiler always
-     checks formats for the ANSI library functions `printf', `fprintf',
-     `sprintf', `scanf', `fscanf', `sscanf', `vprintf', `vfprintf' and
-     `vsprintf' whenever such warnings are requested (using
-     `-Wformat'), so there is no need to modify the header file
-     `stdio.h'.
-
-`format_arg (STRING-INDEX)'
-     The `format_arg' attribute specifies that a function takes
-     `printf' or `scanf' style arguments, modifies it (for example, to
-     translate it into another language), and passes it to a `printf'
-     or `scanf' style function.  For example, the declaration:
-
-          extern char *
-          my_dgettext (char *my_domain, const char *my_format)
-                __attribute__ ((format_arg (2)));
-
-     causes the compiler to check the arguments in calls to
-     `my_dgettext' whose result is passed to a `printf' or `scanf' type
-     function for consistency with the `printf' style format string
-     argument `my_format'.
-
-     The parameter STRING-INDEX specifies which argument is the format
-     string argument (starting from 1).
-
-     The `format-arg' attribute allows you to identify your own
-     functions which modify format strings, so that GNU CC can check the
-     calls to `printf' and `scanf' function whose operands are a call
-     to one of your own function.  The compiler always treats
-     `gettext', `dgettext', and `dcgettext' in this manner.
-
-`section ("section-name")'
-     Normally, the compiler places the code it generates in the `text'
-     section.  Sometimes, however, you need additional sections, or you
-     need certain particular functions to appear in special sections.
-     The `section' attribute specifies that a function lives in a
-     particular section.  For example, the declaration:
-
-          extern void foobar (void) __attribute__ ((section ("bar")));
-
-     puts the function `foobar' in the `bar' section.
-
-     Some file formats do not support arbitrary sections so the
-     `section' attribute is not available on all platforms.  If you
-     need to map the entire contents of a module to a particular
-     section, consider using the facilities of the linker instead.
-
-`constructor'
-`destructor'
-     The `constructor' attribute causes the function to be called
-     automatically before execution enters `main ()'.  Similarly, the
-     `destructor' attribute causes the function to be called
-     automatically after `main ()' has completed or `exit ()' has been
-     called.  Functions with these attributes are useful for
-     initializing data that will be used implicitly during the
-     execution of the program.
-
-     These attributes are not currently implemented for Objective C.
-
-`unused'
-     This attribute, attached to a function, means that the function is
-     meant to be possibly unused.  GNU CC will not produce a warning
-     for this function.  GNU C++ does not currently support this
-     attribute as definitions without parameters are valid in C++.
-
-`weak'
-     The `weak' attribute causes the declaration to be emitted as a weak
-     symbol rather than a global.  This is primarily useful in defining
-     library functions which can be overridden in user code, though it
-     can also be used with non-function declarations.  Weak symbols are
-     supported for ELF targets, and also for a.out targets when using
-     the GNU assembler and linker.
-
-`alias ("target")'
-     The `alias' attribute causes the declaration to be emitted as an
-     alias for another symbol, which must be specified.  For instance,
-
-          void __f () { /* do something */; }
-          void f () __attribute__ ((weak, alias ("__f")));
-
-     declares `f' to be a weak alias for `__f'.  In C++, the mangled
-     name for the target must be used.
-
-     Not all target machines support this attribute.
-
-`regparm (NUMBER)'
-     On the Intel 386, the `regparm' attribute causes the compiler to
-     pass up to NUMBER integer arguments in registers EAX, EDX, and ECX
-     instead of on the stack.  Functions that take a variable number of
-     arguments will continue to be passed all of their arguments on the
-     stack.
-
-`stdcall'
-     On the Intel 386, the `stdcall' attribute causes the compiler to
-     assume that the called function will pop off the stack space used
-     to pass arguments, unless it takes a variable number of arguments.
-
-     The PowerPC compiler for Windows NT currently ignores the `stdcall'
-     attribute.
-
-`cdecl'
-     On the Intel 386, the `cdecl' attribute causes the compiler to
-     assume that the calling function will pop off the stack space used
-     to pass arguments.  This is useful to override the effects of the
-     `-mrtd' switch.
-
-     The PowerPC compiler for Windows NT currently ignores the `cdecl'
-     attribute.
-
-`longcall'
-     On the RS/6000 and PowerPC, the `longcall' attribute causes the
-     compiler to always call the function via a pointer, so that
-     functions which reside further than 64 megabytes (67,108,864
-     bytes) from the current location can be called.
-
-`dllimport'
-     On the PowerPC running Windows NT, the `dllimport' attribute causes
-     the compiler to call the function via a global pointer to the
-     function pointer that is set up by the Windows NT dll library.
-     The pointer name is formed by combining `__imp_' and the function
-     name.
-
-`dllexport'
-     On the PowerPC running Windows NT, the `dllexport' attribute causes
-     the compiler to provide a global pointer to the function pointer,
-     so that it can be called with the `dllimport' attribute.  The
-     pointer name is formed by combining `__imp_' and the function name.
-
-`exception (EXCEPT-FUNC [, EXCEPT-ARG])'
-     On the PowerPC running Windows NT, the `exception' attribute causes
-     the compiler to modify the structured exception table entry it
-     emits for the declared function.  The string or identifier
-     EXCEPT-FUNC is placed in the third entry of the structured
-     exception table.  It represents a function, which is called by the
-     exception handling mechanism if an exception occurs.  If it was
-     specified, the string or identifier EXCEPT-ARG is placed in the
-     fourth entry of the structured exception table.
-
-`function_vector'
-     Use this option on the H8/300 and H8/300H to indicate that the
-     specified function should be called through the function vector.
-     Calling a function through the function vector will reduce code
-     size, however; the function vector has a limited size (maximum 128
-     entries on the H8/300 and 64 entries on the H8/300H) and shares
-     space with the interrupt vector.
-
-     You must use GAS and GLD from GNU binutils version 2.7 or later for
-     this option to work correctly.
-
-`interrupt_handler'
-     Use this option on the H8/300 and H8/300H to indicate that the
-     specified function is an interrupt handler.  The compiler will
-     generate function entry and exit sequences suitable for use in an
-     interrupt handler when this attribute is present.
-
-`eightbit_data'
-     Use this option on the H8/300 and H8/300H to indicate that the
-     specified variable should be placed into the eight bit data
-     section.  The compiler will generate more efficient code for
-     certain operations on data in the eight bit data area.  Note the
-     eight bit data area is limited to 256 bytes of data.
-
-     You must use GAS and GLD from GNU binutils version 2.7 or later for
-     this option to work correctly.
-
-`tiny_data'
-     Use this option on the H8/300H to indicate that the specified
-     variable should be placed into the tiny data section.  The
-     compiler will generate more efficient code for loads and stores on
-     data in the tiny data section.  Note the tiny data area is limited
-     to slightly under 32kbytes of data.
-
-`interrupt'
-     Use this option on the M32R/D to indicate that the specified
-     function is an interrupt handler.  The compiler will generate
-     function entry and exit sequences suitable for use in an interrupt
-     handler when this attribute is present.
-
-`model (MODEL-NAME)'
-     Use this attribute on the M32R/D to set the addressability of an
-     object, and the code generated for a function.  The identifier
-     MODEL-NAME is one of `small', `medium', or `large', representing
-     each of the code models.
-
-     Small model objects live in the lower 16MB of memory (so that their
-     addresses can be loaded with the `ld24' instruction), and are
-     callable with the `bl' instruction.
-
-     Medium model objects may live anywhere in the 32 bit address space
-     (the compiler will generate `seth/add3' instructions to load their
-     addresses), and are callable with the `bl' instruction.
-
-     Large model objects may live anywhere in the 32 bit address space
-     (the compiler will generate `seth/add3' instructions to load their
-     addresses), and may not be reachable with the `bl' instruction
-     (the compiler will generate the much slower `seth/add3/jl'
-     instruction sequence).
-
-   You can specify multiple attributes in a declaration by separating
-them by commas within the double parentheses or by immediately
-following an attribute declaration with another attribute declaration.
-
-   Some people object to the `__attribute__' feature, suggesting that
-ANSI C's `#pragma' should be used instead.  There are two reasons for
-not doing this.
-
-  1. It is impossible to generate `#pragma' commands from a macro.
-
-  2. There is no telling what the same `#pragma' might mean in another
-     compiler.
-
-   These two reasons apply to almost any application that might be
-proposed for `#pragma'.  It is basically a mistake to use `#pragma' for
-*anything*.
-
-\1f
-File: gcc.info,  Node: Function Prototypes,  Next: C++ Comments,  Prev: Function Attributes,  Up: C Extensions
-
-Prototypes and Old-Style Function Definitions
-=============================================
-
-   GNU C extends ANSI C to allow a function prototype to override a
-later old-style non-prototype definition.  Consider the following
-example:
-
-     /* Use prototypes unless the compiler is old-fashioned.  */
-     #ifdef __STDC__
-     #define P(x) x
-     #else
-     #define P(x) ()
-     #endif
-     
-     /* Prototype function declaration.  */
-     int isroot P((uid_t));
-     
-     /* Old-style function definition.  */
-     int
-     isroot (x)   /* ??? lossage here ??? */
-          uid_t x;
-     {
-       return x == 0;
-     }
-
-   Suppose the type `uid_t' happens to be `short'.  ANSI C does not
-allow this example, because subword arguments in old-style
-non-prototype definitions are promoted.  Therefore in this example the
-function definition's argument is really an `int', which does not match
-the prototype argument type of `short'.
-
-   This restriction of ANSI C makes it hard to write code that is
-portable to traditional C compilers, because the programmer does not
-know whether the `uid_t' type is `short', `int', or `long'.  Therefore,
-in cases like these GNU C allows a prototype to override a later
-old-style definition.  More precisely, in GNU C, a function prototype
-argument type overrides the argument type specified by a later
-old-style definition if the former type is the same as the latter type
-before promotion.  Thus in GNU C the above example is equivalent to the
-following:
-
-     int isroot (uid_t);
-     
-     int
-     isroot (uid_t x)
-     {
-       return x == 0;
-     }
-
-   GNU C++ does not support old-style function definitions, so this
-extension is irrelevant.
-
-\1f
-File: gcc.info,  Node: C++ Comments,  Next: Dollar Signs,  Prev: Function Prototypes,  Up: C Extensions
-
-C++ Style Comments
-==================
-
-   In GNU C, you may use C++ style comments, which start with `//' and
-continue until the end of the line.  Many other C implementations allow
-such comments, and they are likely to be in a future C standard.
-However, C++ style comments are not recognized if you specify `-ansi'
-or `-traditional', since they are incompatible with traditional
-constructs like `dividend//*comment*/divisor'.
-
-\1f
-File: gcc.info,  Node: Dollar Signs,  Next: Character Escapes,  Prev: C++ Comments,  Up: C Extensions
-
-Dollar Signs in Identifier Names
-================================
-
-   In GNU C, you may normally use dollar signs in identifier names.
-This is because many traditional C implementations allow such
-identifiers.  However, dollar signs in identifiers are not supported on
-a few target machines, typically because the target assembler does not
-allow them.
-
-\1f
-File: gcc.info,  Node: Character Escapes,  Next: Variable Attributes,  Prev: Dollar Signs,  Up: C Extensions
-
-The Character <ESC> in Constants
-================================
-
-   You can use the sequence `\e' in a string or character constant to
-stand for the ASCII character <ESC>.
-
-\1f
-File: gcc.info,  Node: Alignment,  Next: Inline,  Prev: Type Attributes,  Up: C Extensions
-
-Inquiring on Alignment of Types or Variables
-============================================
-
-   The keyword `__alignof__' allows you to inquire about how an object
-is aligned, or the minimum alignment usually required by a type.  Its
-syntax is just like `sizeof'.
-
-   For example, if the target machine requires a `double' value to be
-aligned on an 8-byte boundary, then `__alignof__ (double)' is 8.  This
-is true on many RISC machines.  On more traditional machine designs,
-`__alignof__ (double)' is 4 or even 2.
-
-   Some machines never actually require alignment; they allow reference
-to any data type even at an odd addresses.  For these machines,
-`__alignof__' reports the *recommended* alignment of a type.
-
-   When the operand of `__alignof__' is an lvalue rather than a type,
-the value is the largest alignment that the lvalue is known to have.
-It may have this alignment as a result of its data type, or because it
-is part of a structure and inherits alignment from that structure.  For
-example, after this declaration:
-
-     struct foo { int x; char y; } foo1;
-
-the value of `__alignof__ (foo1.y)' is probably 2 or 4, the same as
-`__alignof__ (int)', even though the data type of `foo1.y' does not
-itself demand any alignment.
-
-   A related feature which lets you specify the alignment of an object
-is `__attribute__ ((aligned (ALIGNMENT)))'; see the following section.
-
-\1f
-File: gcc.info,  Node: Variable Attributes,  Next: Type Attributes,  Prev: Character Escapes,  Up: C Extensions
-
-Specifying Attributes of Variables
-==================================
-
-   The keyword `__attribute__' allows you to specify special attributes
-of variables or structure fields.  This keyword is followed by an
-attribute specification inside double parentheses.  Eight attributes
-are currently defined for variables: `aligned', `mode', `nocommon',
-`packed', `section', `transparent_union', `unused', and `weak'.  Other
-attributes are available for functions (*note Function Attributes::.)
-and for types (*note Type Attributes::.).
-
-   You may also specify attributes with `__' preceding and following
-each keyword.  This allows you to use them in header files without
-being concerned about a possible macro of the same name.  For example,
-you may use `__aligned__' instead of `aligned'.
-
-`aligned (ALIGNMENT)'
-     This attribute specifies a minimum alignment for the variable or
-     structure field, measured in bytes.  For example, the declaration:
-
-          int x __attribute__ ((aligned (16))) = 0;
-
-     causes the compiler to allocate the global variable `x' on a
-     16-byte boundary.  On a 68040, this could be used in conjunction
-     with an `asm' expression to access the `move16' instruction which
-     requires 16-byte aligned operands.
-
-     You can also specify the alignment of structure fields.  For
-     example, to create a double-word aligned `int' pair, you could
-     write:
-
-          struct foo { int x[2] __attribute__ ((aligned (8))); };
-
-     This is an alternative to creating a union with a `double' member
-     that forces the union to be double-word aligned.
-
-     It is not possible to specify the alignment of functions; the
-     alignment of functions is determined by the machine's requirements
-     and cannot be changed.  You cannot specify alignment for a typedef
-     name because such a name is just an alias, not a distinct type.
-
-     As in the preceding examples, you can explicitly specify the
-     alignment (in bytes) that you wish the compiler to use for a given
-     variable or structure field.  Alternatively, you can leave out the
-     alignment factor and just ask the compiler to align a variable or
-     field to the maximum useful alignment for the target machine you
-     are compiling for.  For example, you could write:
-
-          short array[3] __attribute__ ((aligned));
-
-     Whenever you leave out the alignment factor in an `aligned'
-     attribute specification, the compiler automatically sets the
-     alignment for the declared variable or field to the largest
-     alignment which is ever used for any data type on the target
-     machine you are compiling for.  Doing this can often make copy
-     operations more efficient, because the compiler can use whatever
-     instructions copy the biggest chunks of memory when performing
-     copies to or from the variables or fields that you have aligned
-     this way.
-
-     The `aligned' attribute can only increase the alignment; but you
-     can decrease it by specifying `packed' as well.  See below.
-
-     Note that the effectiveness of `aligned' attributes may be limited
-     by inherent limitations in your linker.  On many systems, the
-     linker is only able to arrange for variables to be aligned up to a
-     certain maximum alignment.  (For some linkers, the maximum
-     supported alignment may be very very small.)  If your linker is
-     only able to align variables up to a maximum of 8 byte alignment,
-     then specifying `aligned(16)' in an `__attribute__' will still
-     only provide you with 8 byte alignment.  See your linker
-     documentation for further information.
-
-`mode (MODE)'
-     This attribute specifies the data type for the
-     declaration--whichever type corresponds to the mode MODE.  This in
-     effect lets you request an integer or floating point type
-     according to its width.
-
-     You may also specify a mode of `byte' or `__byte__' to indicate
-     the mode corresponding to a one-byte integer, `word' or `__word__'
-     for the mode of a one-word integer, and `pointer' or `__pointer__'
-     for the mode used to represent pointers.
-
-`nocommon'
-     This attribute specifies requests GNU CC not to place a variable
-     "common" but instead to allocate space for it directly.  If you
-     specify the `-fno-common' flag, GNU CC will do this for all
-     variables.
-
-     Specifying the `nocommon' attribute for a variable provides an
-     initialization of zeros.  A variable may only be initialized in one
-     source file.
-
-`packed'
-     The `packed' attribute specifies that a variable or structure field
-     should have the smallest possible alignment--one byte for a
-     variable, and one bit for a field, unless you specify a larger
-     value with the `aligned' attribute.
-
-     Here is a structure in which the field `x' is packed, so that it
-     immediately follows `a':
-
-          struct foo
-          {
-            char a;
-            int x[2] __attribute__ ((packed));
-          };
-
-`section ("section-name")'
-     Normally, the compiler places the objects it generates in sections
-     like `data' and `bss'.  Sometimes, however, you need additional
-     sections, or you need certain particular variables to appear in
-     special sections, for example to map to special hardware.  The
-     `section' attribute specifies that a variable (or function) lives
-     in a particular section.  For example, this small program uses
-     several specific section names:
-
-          struct duart a __attribute__ ((section ("DUART_A"))) = { 0 };
-          struct duart b __attribute__ ((section ("DUART_B"))) = { 0 };
-          char stack[10000] __attribute__ ((section ("STACK"))) = { 0 };
-          int init_data __attribute__ ((section ("INITDATA"))) = 0;
-          
-          main()
-          {
-            /* Initialize stack pointer */
-            init_sp (stack + sizeof (stack));
-          
-            /* Initialize initialized data */
-            memcpy (&init_data, &data, &edata - &data);
-          
-            /* Turn on the serial ports */
-            init_duart (&a);
-            init_duart (&b);
-          }
-
-     Use the `section' attribute with an *initialized* definition of a
-     *global* variable, as shown in the example.  GNU CC issues a
-     warning and otherwise ignores the `section' attribute in
-     uninitialized variable declarations.
-
-     You may only use the `section' attribute with a fully initialized
-     global definition because of the way linkers work.  The linker
-     requires each object be defined once, with the exception that
-     uninitialized variables tentatively go in the `common' (or `bss')
-     section and can be multiply "defined".  You can force a variable
-     to be initialized with the `-fno-common' flag or the `nocommon'
-     attribute.
-
-     Some file formats do not support arbitrary sections so the
-     `section' attribute is not available on all platforms.  If you
-     need to map the entire contents of a module to a particular
-     section, consider using the facilities of the linker instead.
-
-`transparent_union'
-     This attribute, attached to a function parameter which is a union,
-     means that the corresponding argument may have the type of any
-     union member, but the argument is passed as if its type were that
-     of the first union member.  For more details see *Note Type
-     Attributes::.  You can also use this attribute on a `typedef' for
-     a union data type; then it applies to all function parameters with
-     that type.
-
-`unused'
-     This attribute, attached to a variable, means that the variable is
-     meant to be possibly unused.  GNU CC will not produce a warning
-     for this variable.
-
-`weak'
-     The `weak' attribute is described in *Note Function Attributes::.
-
-`model (MODEL-NAME)'
-     Use this attribute on the M32R/D to set the addressability of an
-     object.  The identifier MODEL-NAME is one of `small', `medium', or
-     `large', representing each of the code models.
-
-     Small model objects live in the lower 16MB of memory (so that their
-     addresses can be loaded with the `ld24' instruction).
-
-     Medium and large model objects may live anywhere in the 32 bit
-     address space (the compiler will generate `seth/add3' instructions
-     to load their addresses).
-
-   To specify multiple attributes, separate them by commas within the
-double parentheses: for example, `__attribute__ ((aligned (16),
-packed))'.
-
-\1f
-File: gcc.info,  Node: Type Attributes,  Next: Alignment,  Prev: Variable Attributes,  Up: C Extensions
-
-Specifying Attributes of Types
-==============================
-
-   The keyword `__attribute__' allows you to specify special attributes
-of `struct' and `union' types when you define such types.  This keyword
-is followed by an attribute specification inside double parentheses.
-Three attributes are currently defined for types: `aligned', `packed',
-and `transparent_union'.  Other attributes are defined for functions
-(*note Function Attributes::.) and for variables (*note Variable
-Attributes::.).
-
-   You may also specify any one of these attributes with `__' preceding
-and following its keyword.  This allows you to use these attributes in
-header files without being concerned about a possible macro of the same
-name.  For example, you may use `__aligned__' instead of `aligned'.
-
-   You may specify the `aligned' and `transparent_union' attributes
-either in a `typedef' declaration or just past the closing curly brace
-of a complete enum, struct or union type *definition* and the `packed'
-attribute only past the closing brace of a definition.
-
-`aligned (ALIGNMENT)'
-     This attribute specifies a minimum alignment (in bytes) for
-     variables of the specified type.  For example, the declarations:
-
-          struct S { short f[3]; } __attribute__ ((aligned (8));
-          typedef int more_aligned_int __attribute__ ((aligned (8));
-
-     force the compiler to insure (as far as it can) that each variable
-     whose type is `struct S' or `more_aligned_int' will be allocated
-     and aligned *at least* on a 8-byte boundary.  On a Sparc, having
-     all variables of type `struct S' aligned to 8-byte boundaries
-     allows the compiler to use the `ldd' and `std' (doubleword load and
-     store) instructions when copying one variable of type `struct S' to
-     another, thus improving run-time efficiency.
-
-     Note that the alignment of any given `struct' or `union' type is
-     required by the ANSI C standard to be at least a perfect multiple
-     of the lowest common multiple of the alignments of all of the
-     members of the `struct' or `union' in question.  This means that
-     you *can* effectively adjust the alignment of a `struct' or `union'
-     type by attaching an `aligned' attribute to any one of the members
-     of such a type, but the notation illustrated in the example above
-     is a more obvious, intuitive, and readable way to request the
-     compiler to adjust the alignment of an entire `struct' or `union'
-     type.
-
-     As in the preceding example, you can explicitly specify the
-     alignment (in bytes) that you wish the compiler to use for a given
-     `struct' or `union' type.  Alternatively, you can leave out the
-     alignment factor and just ask the compiler to align a type to the
-     maximum useful alignment for the target machine you are compiling
-     for.  For example, you could write:
-
-          struct S { short f[3]; } __attribute__ ((aligned));
-
-     Whenever you leave out the alignment factor in an `aligned'
-     attribute specification, the compiler automatically sets the
-     alignment for the type to the largest alignment which is ever used
-     for any data type on the target machine you are compiling for.
-     Doing this can often make copy operations more efficient, because
-     the compiler can use whatever instructions copy the biggest chunks
-     of memory when performing copies to or from the variables which
-     have types that you have aligned this way.
-
-     In the example above, if the size of each `short' is 2 bytes, then
-     the size of the entire `struct S' type is 6 bytes.  The smallest
-     power of two which is greater than or equal to that is 8, so the
-     compiler sets the alignment for the entire `struct S' type to 8
-     bytes.
-
-     Note that although you can ask the compiler to select a
-     time-efficient alignment for a given type and then declare only
-     individual stand-alone objects of that type, the compiler's
-     ability to select a time-efficient alignment is primarily useful
-     only when you plan to create arrays of variables having the
-     relevant (efficiently aligned) type.  If you declare or use arrays
-     of variables of an efficiently-aligned type, then it is likely
-     that your program will also be doing pointer arithmetic (or
-     subscripting, which amounts to the same thing) on pointers to the
-     relevant type, and the code that the compiler generates for these
-     pointer arithmetic operations will often be more efficient for
-     efficiently-aligned types than for other types.
-
-     The `aligned' attribute can only increase the alignment; but you
-     can decrease it by specifying `packed' as well.  See below.
-
-     Note that the effectiveness of `aligned' attributes may be limited
-     by inherent limitations in your linker.  On many systems, the
-     linker is only able to arrange for variables to be aligned up to a
-     certain maximum alignment.  (For some linkers, the maximum
-     supported alignment may be very very small.)  If your linker is
-     only able to align variables up to a maximum of 8 byte alignment,
-     then specifying `aligned(16)' in an `__attribute__' will still
-     only provide you with 8 byte alignment.  See your linker
-     documentation for further information.
-
-`packed'
-     This attribute, attached to an `enum', `struct', or `union' type
-     definition, specified that the minimum required memory be used to
-     represent the type.
-
-     Specifying this attribute for `struct' and `union' types is
-     equivalent to specifying the `packed' attribute on each of the
-     structure or union members.  Specifying the `-fshort-enums' flag
-     on the line is equivalent to specifying the `packed' attribute on
-     all `enum' definitions.
-
-     You may only specify this attribute after a closing curly brace on
-     an `enum' definition, not in a `typedef' declaration, unless that
-     declaration also contains the definition of the `enum'.
-
-`transparent_union'
-     This attribute, attached to a `union' type definition, indicates
-     that any function parameter having that union type causes calls to
-     that function to be treated in a special way.
-
-     First, the argument corresponding to a transparent union type can
-     be of any type in the union; no cast is required.  Also, if the
-     union contains a pointer type, the corresponding argument can be a
-     null pointer constant or a void pointer expression; and if the
-     union contains a void pointer type, the corresponding argument can
-     be any pointer expression.  If the union member type is a pointer,
-     qualifiers like `const' on the referenced type must be respected,
-     just as with normal pointer conversions.
-
-     Second, the argument is passed to the function using the calling
-     conventions of first member of the transparent union, not the
-     calling conventions of the union itself.  All members of the union
-     must have the same machine representation; this is necessary for
-     this argument passing to work properly.
-
-     Transparent unions are designed for library functions that have
-     multiple interfaces for compatibility reasons.  For example,
-     suppose the `wait' function must accept either a value of type
-     `int *' to comply with Posix, or a value of type `union wait *' to
-     comply with the 4.1BSD interface.  If `wait''s parameter were
-     `void *', `wait' would accept both kinds of arguments, but it
-     would also accept any other pointer type and this would make
-     argument type checking less useful.  Instead, `<sys/wait.h>' might
-     define the interface as follows:
-
-          typedef union
-            {
-              int *__ip;
-              union wait *__up;
-            } wait_status_ptr_t __attribute__ ((__transparent_union__));
-          
-          pid_t wait (wait_status_ptr_t);
-
-     This interface allows either `int *' or `union wait *' arguments
-     to be passed, using the `int *' calling convention.  The program
-     can call `wait' with arguments of either type:
-
-          int w1 () { int w; return wait (&w); }
-          int w2 () { union wait w; return wait (&w); }
-
-     With this interface, `wait''s implementation might look like this:
-
-          pid_t wait (wait_status_ptr_t p)
-          {
-            return waitpid (-1, p.__ip, 0);
-          }
-
-`unused'
-     When attached to a type (including a `union' or a `struct'), this
-     attribute means that variables of that type are meant to appear
-     possibly unused.  GNU CC will not produce a warning for any
-     variables of that type, even if the variable appears to do
-     nothing.  This is often the case with lock or thread classes,
-     which are usually defined and then not referenced, but contain
-     constructors and destructors that have non-trivial bookeeping
-     functions.
-
-   To specify multiple attributes, separate them by commas within the
-double parentheses: for example, `__attribute__ ((aligned (16),
-packed))'.
-
diff --git a/gcc/intl/cat-compat.c b/gcc/intl/cat-compat.c
deleted file mode 100644 (file)
index 867d901..0000000
+++ /dev/null
@@ -1,262 +0,0 @@
-/* Compatibility code for gettext-using-catgets interface.
-   Copyright (C) 1995, 1997 Free Software Foundation, Inc.
-
-   This program 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 program 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 program; if not, write to the Free Software Foundation,
-   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <string.h>
-#else
-char *getenv ();
-# ifdef HAVE_MALLOC_H
-#  include <malloc.h>
-# endif
-#endif
-
-#ifdef HAVE_NL_TYPES_H
-# include <nl_types.h>
-#endif
-
-#include "libgettext.h"
-
-/* @@ end of prolog @@ */
-
-/* XPG3 defines the result of `setlocale (category, NULL)' as:
-   ``Directs `setlocale()' to query `category' and return the current
-     setting of `local'.''
-   However it does not specify the exact format.  And even worse: POSIX
-   defines this not at all.  So we can use this feature only on selected
-   system (e.g. those using GNU C Library).  */
-#ifdef _LIBC
-# define HAVE_LOCALE_NULL
-#endif
-
-/* The catalog descriptor.  */
-static nl_catd catalog = (nl_catd) -1;
-
-/* Name of the default catalog.  */
-static const char default_catalog_name[] = "messages";
-
-/* Name of currently used catalog.  */
-static const char *catalog_name = default_catalog_name;
-
-/* Get ID for given string.  If not found return -1.  */
-static int msg_to_cat_id PARAMS ((const char *msg));
-
-/* Substitution for systems lacking this function in their C library.  */
-#if !_LIBC && !HAVE_STPCPY
-static char *stpcpy PARAMS ((char *dest, const char *src));
-#endif
-
-
-/* Set currently used domain/catalog.  */
-char *
-textdomain (domainname)
-     const char *domainname;
-{
-  nl_catd new_catalog;
-  char *new_name;
-  size_t new_name_len;
-  char *lang;
-
-#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES \
-    && defined HAVE_LOCALE_NULL
-  lang = setlocale (LC_MESSAGES, NULL);
-#else
-  lang = getenv ("LC_ALL");
-  if (lang == NULL || lang[0] == '\0')
-    {
-      lang = getenv ("LC_MESSAGES");
-      if (lang == NULL || lang[0] == '\0')
-       lang = getenv ("LANG");
-    }
-#endif
-  if (lang == NULL || lang[0] == '\0')
-    lang = "C";
-
-  /* See whether name of currently used domain is asked.  */
-  if (domainname == NULL)
-    return (char *) catalog_name;
-
-  if (domainname[0] == '\0')
-    domainname = default_catalog_name;
-
-  /* Compute length of added path element.  */
-  new_name_len = sizeof (LOCALEDIR) - 1 + 1 + strlen (lang)
-                + sizeof ("/LC_MESSAGES/") - 1 + sizeof (PACKAGE) - 1
-                + sizeof (".cat");
-
-  new_name = (char *) malloc (new_name_len);
-  if (new_name == NULL)
-    return NULL;
-
-  strcpy (new_name, PACKAGE);
-  new_catalog = catopen (new_name, 0);
-
-  if (new_catalog == (nl_catd) -1)
-    {
-      /* NLSPATH search didn't work, try absolute path */
-      sprintf (new_name, "%s/%s/LC_MESSAGES/%s.cat", LOCALEDIR, lang,
-              PACKAGE);
-      new_catalog = catopen (new_name, 0);
-
-      if (new_catalog == (nl_catd) -1)
-       {
-         free (new_name);
-         return (char *) catalog_name;
-       }
-    }
-
-  /* Close old catalog.  */
-  if (catalog != (nl_catd) -1)
-    catclose (catalog);
-  if (catalog_name != default_catalog_name)
-    free ((char *) catalog_name);
-
-  catalog = new_catalog;
-  catalog_name = new_name;
-
-  return (char *) catalog_name;
-}
-
-char *
-bindtextdomain (domainname, dirname)
-     const char *domainname;
-     const char *dirname;
-{
-#if HAVE_SETENV || HAVE_PUTENV
-  char *old_val, *new_val, *cp;
-  size_t new_val_len;
-
-  /* This does not make much sense here but to be compatible do it.  */
-  if (domainname == NULL)
-    return NULL;
-
-  /* Compute length of added path element.  If we use setenv we don't need
-     the first byts for NLSPATH=, but why complicate the code for this
-     peanuts.  */
-  new_val_len = sizeof ("NLSPATH=") - 1 + strlen (dirname)
-               + sizeof ("/%L/LC_MESSAGES/%N.cat");
-
-  old_val = getenv ("NLSPATH");
-  if (old_val == NULL || old_val[0] == '\0')
-    {
-      old_val = NULL;
-      new_val_len += 1 + sizeof (LOCALEDIR) - 1
-                    + sizeof ("/%L/LC_MESSAGES/%N.cat");
-    }
-  else
-    new_val_len += strlen (old_val);
-
-  new_val = (char *) malloc (new_val_len);
-  if (new_val == NULL)
-    return NULL;
-
-# if HAVE_SETENV
-  cp = new_val;
-# else
-  cp = stpcpy (new_val, "NLSPATH=");
-# endif
-
-  cp = stpcpy (cp, dirname);
-  cp = stpcpy (cp, "/%L/LC_MESSAGES/%N.cat:");
-
-  if (old_val == NULL)
-    {
-# if __STDC__
-      stpcpy (cp, LOCALEDIR "/%L/LC_MESSAGES/%N.cat");
-# else
-
-      cp = stpcpy (cp, LOCALEDIR);
-      stpcpy (cp, "/%L/LC_MESSAGES/%N.cat");
-# endif
-    }
-  else
-    stpcpy (cp, old_val);
-
-# if HAVE_SETENV
-  setenv ("NLSPATH", new_val, 1);
-  free (new_val);
-# else
-  putenv (new_val);
-  /* Do *not* free the environment entry we just entered.  It is used
-     from now on.   */
-# endif
-
-#endif
-
-  return (char *) domainname;
-}
-
-#undef gettext
-char *
-gettext (msg)
-     const char *msg;
-{
-  int msgid;
-
-  if (msg == NULL || catalog == (nl_catd) -1)
-    return (char *) msg;
-
-  /* Get the message from the catalog.  We always use set number 1.
-     The message ID is computed by the function `msg_to_cat_id'
-     which works on the table generated by `po-to-tbl'.  */
-  msgid = msg_to_cat_id (msg);
-  if (msgid == -1)
-    return (char *) msg;
-
-  return catgets (catalog, 1, msgid, (char *) msg);
-}
-
-/* Look through the table `_msg_tbl' which has `_msg_tbl_length' entries
-   for the one equal to msg.  If it is found return the ID.  In case when
-   the string is not found return -1.  */
-static int
-msg_to_cat_id (msg)
-     const char *msg;
-{
-  int cnt;
-
-  for (cnt = 0; cnt < _msg_tbl_length; ++cnt)
-    if (strcmp (msg, _msg_tbl[cnt]._msg) == 0)
-      return _msg_tbl[cnt]._msg_number;
-
-  return -1;
-}
-
-
-/* @@ begin of epilog @@ */
-
-/* We don't want libintl.a to depend on any other library.  So we
-   avoid the non-standard function stpcpy.  In GNU C Library this
-   function is available, though.  Also allow the symbol HAVE_STPCPY
-   to be defined.  */
-#if !_LIBC && !HAVE_STPCPY
-static char *
-stpcpy (dest, src)
-     char *dest;
-     const char *src;
-{
-  while ((*dest++ = *src++) != '\0')
-    /* Do nothing. */ ;
-  return dest - 1;
-}
-#endif
diff --git a/gcc/intl/intl-compat.c b/gcc/intl/intl-compat.c
deleted file mode 100644 (file)
index 503efa0..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-/* intl-compat.c - Stub functions to call gettext functions from GNU gettext
-   Library.
-   Copyright (C) 1995 Software Foundation, Inc.
-
-This program 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 program 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 program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "libgettext.h"
-
-/* @@ end of prolog @@ */
-
-
-#undef gettext
-#undef dgettext
-#undef dcgettext
-#undef textdomain
-#undef bindtextdomain
-
-
-char *
-bindtextdomain (domainname, dirname)
-     const char *domainname;
-     const char *dirname;
-{
-  return bindtextdomain__ (domainname, dirname);
-}
-
-
-char *
-dcgettext (domainname, msgid, category)
-     const char *domainname;
-     const char *msgid;
-     int category;
-{
-  return dcgettext__ (domainname, msgid, category);
-}
-
-
-char *
-dgettext (domainname, msgid)
-     const char *domainname;
-     const char *msgid;
-{
-  return dgettext__ (domainname, msgid);
-}
-
-
-char *
-gettext (msgid)
-     const char *msgid;
-{
-  return gettext__ (msgid);
-}
-
-
-char *
-textdomain (domainname)
-     const char *domainname;
-{
-  return textdomain__ (domainname);
-}
diff --git a/gcc/intl/linux-msg.sed b/gcc/intl/linux-msg.sed
deleted file mode 100755 (executable)
index 5918e72..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-# po2msg.sed - Convert Uniforum style .po file to Linux style .msg file
-# Copyright (C) 1995 Free Software Foundation, Inc.
-# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
-#
-# This program 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 program 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 program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-#
-# The first directive in the .msg should be the definition of the
-# message set number.  We use always set number 1.
-#
-1 {
-  i\
-$set 1 # Automatically created by po2msg.sed
-  h
-  s/.*/0/
-  x
-}
-#
-# Mitch's old catalog format does not allow comments.
-#
-# We copy the original message as a comment into the .msg file.
-#
-/^msgid/ {
-  s/msgid[     ]*"//
-#
-# This does not work now with the new format.
-# /"$/! {
-#   s/\\$//
-#   s/$/ ... (more lines following)"/
-# }
-  x
-# The following nice solution is by
-# Bruno <Haible@ma2s2.mathematik.uni-karlsruhe.de>
-  td
-# Increment a decimal number in pattern space.
-# First hide trailing `9' digits.
-  :d
-  s/9\(_*\)$/_\1/
-  td
-# Assure at least one digit is available.
-  s/^\(_*\)$/0\1/
-# Increment the last digit.
-  s/8\(_*\)$/9\1/
-  s/7\(_*\)$/8\1/
-  s/6\(_*\)$/7\1/
-  s/5\(_*\)$/6\1/
-  s/4\(_*\)$/5\1/
-  s/3\(_*\)$/4\1/
-  s/2\(_*\)$/3\1/
-  s/1\(_*\)$/2\1/
-  s/0\(_*\)$/1\1/
-# Convert the hidden `9' digits to `0's.
-  s/_/0/g
-  x
-  G
-  s/\(.*\)"\n\([0-9]*\)/$ #\2 Original Message:(\1)/p
-}
-#
-# The .msg file contains, other then the .po file, only the translations
-# but each given a unique ID.  Starting from 1 and incrementing by 1 for
-# each message we assign them to the messages.
-# It is important that the .po file used to generate the cat-id-tbl.c file
-# (with po-to-tbl) is the same as the one used here.  (At least the order
-# of declarations must not be changed.)
-#
-/^msgstr/ {
-  s/msgstr[    ]*"\(.*\)"/# \1/
-# Clear substitution flag.
-  tb
-# Append the next line.
-  :b
-  N
-# Look whether second part is continuation line.
-  s/\(.*\n\)"\(.*\)"/\1\2/
-# Yes, then branch.
-  ta
-  P
-  D
-# Note that D includes a jump to the start!!
-# We found a continuation line.  But before printing insert '\'.
-  :a
-  s/\(.*\)\(\n.*\)/\1\\\2/
-  P
-# We cannot use D here.
-  s/.*\n\(.*\)/\1/
-  tb
-}
-d
diff --git a/gcc/intl/po2tbl.sed.in b/gcc/intl/po2tbl.sed.in
deleted file mode 100755 (executable)
index b3bcca4..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-# po2tbl.sed - Convert Uniforum style .po file to lookup table for catgets
-# Copyright (C) 1995 Free Software Foundation, Inc.
-# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
-#
-# This program 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 program 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 program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-1 {
-  i\
-/* Automatically generated by po2tbl.sed from @PACKAGE NAME@.pot.  */\
-\
-#if HAVE_CONFIG_H\
-# include <config.h>\
-#endif\
-\
-#include "libgettext.h"\
-\
-const struct _msg_ent _msg_tbl[] = {
-  h
-  s/.*/0/
-  x
-}
-#
-# Write msgid entries in C array form.
-#
-/^msgid/ {
-  s/msgid[     ]*\(".*"\)/  {\1/
-  tb
-# Append the next line
-  :b
-  N
-# Look whether second part is continuation line.
-  s/\(.*\)"\(\n\)"\(.*"\)/\1\2\3/
-# Yes, then branch.
-  ta
-# Because we assume that the input file correctly formed the line
-# just read cannot be again be a msgid line.  So it's safe to ignore
-# it.
-  s/\(.*\)\n.*/\1/
-  bc
-# We found a continuation line.  But before printing insert '\'.
-  :a
-  s/\(.*\)\(\n.*\)/\1\\\2/
-  P
-# We cannot use D here.
-  s/.*\n\(.*\)/\1/
-# Some buggy seds do not clear the `successful substitution since last ``t'''
-# flag on `N', so we do a `t' here to clear it.
-  tb
-# Not reached
-  :c
-  x
-# The following nice solution is by
-# Bruno <Haible@ma2s2.mathematik.uni-karlsruhe.de>
-  td
-# Increment a decimal number in pattern space.
-# First hide trailing `9' digits.
-  :d
-  s/9\(_*\)$/_\1/
-  td
-# Assure at least one digit is available.
-  s/^\(_*\)$/0\1/
-# Increment the last digit.
-  s/8\(_*\)$/9\1/
-  s/7\(_*\)$/8\1/
-  s/6\(_*\)$/7\1/
-  s/5\(_*\)$/6\1/
-  s/4\(_*\)$/5\1/
-  s/3\(_*\)$/4\1/
-  s/2\(_*\)$/3\1/
-  s/1\(_*\)$/2\1/
-  s/0\(_*\)$/1\1/
-# Convert the hidden `9' digits to `0's.
-  s/_/0/g
-  x
-  G
-  s/\(.*\)\n\([0-9]*\)/\1, \2},/
-  s/\(.*\)"$/\1/
-  p
-}
-#
-# Last line.
-#
-$ {
-  i\
-};\
-
-  g
-  s/0*\(.*\)/int _msg_tbl_length = \1;/p
-}
-d
diff --git a/gcc/intl/xopen-msg.sed b/gcc/intl/xopen-msg.sed
deleted file mode 100755 (executable)
index b19c0bb..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-# po2msg.sed - Convert Uniforum style .po file to X/Open style .msg file
-# Copyright (C) 1995 Free Software Foundation, Inc.
-# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
-#
-# This program 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 program 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 program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-#
-# The first directive in the .msg should be the definition of the
-# message set number.  We use always set number 1.
-#
-1 {
-  i\
-$set 1 # Automatically created by po2msg.sed
-  h
-  s/.*/0/
-  x
-}
-#
-# We copy all comments into the .msg file.  Perhaps they can help.
-#
-/^#/ s/^#[     ]*/$ /p
-#
-# We copy the original message as a comment into the .msg file.
-#
-/^msgid/ {
-# Does not work now
-#  /"$/! {
-#    s/\\$//
-#    s/$/ ... (more lines following)"/
-#  }
-  s/^msgid[    ]*"\(.*\)"$/$ Original Message: \1/
-  p
-}
-#
-# The .msg file contains, other then the .po file, only the translations
-# but each given a unique ID.  Starting from 1 and incrementing by 1 for
-# each message we assign them to the messages.
-# It is important that the .po file used to generate the cat-id-tbl.c file
-# (with po-to-tbl) is the same as the one used here.  (At least the order
-# of declarations must not be changed.)
-#
-/^msgstr/ {
-  s/msgstr[    ]*"\(.*\)"/\1/
-  x
-# The following nice solution is by
-# Bruno <Haible@ma2s2.mathematik.uni-karlsruhe.de>
-  td
-# Increment a decimal number in pattern space.
-# First hide trailing `9' digits.
-  :d
-  s/9\(_*\)$/_\1/
-  td
-# Assure at least one digit is available.
-  s/^\(_*\)$/0\1/
-# Increment the last digit.
-  s/8\(_*\)$/9\1/
-  s/7\(_*\)$/8\1/
-  s/6\(_*\)$/7\1/
-  s/5\(_*\)$/6\1/
-  s/4\(_*\)$/5\1/
-  s/3\(_*\)$/4\1/
-  s/2\(_*\)$/3\1/
-  s/1\(_*\)$/2\1/
-  s/0\(_*\)$/1\1/
-# Convert the hidden `9' digits to `0's.
-  s/_/0/g
-  x
-# Bring the line in the format `<number> <message>'
-  G
-  s/^[^\n]*$/& /
-  s/\(.*\)\n\([0-9]*\)/\2 \1/
-# Clear flag from last substitution.
-  tb
-# Append the next line.
-  :b
-  N
-# Look whether second part is a continuation line.
-  s/\(.*\n\)"\(.*\)"/\1\2/
-# Yes, then branch.
-  ta
-  P
-  D
-# Note that `D' includes a jump to the start!!
-# We found a continuation line.  But before printing insert '\'.
-  :a
-  s/\(.*\)\(\n.*\)/\1\\\2/
-  P
-# We cannot use the sed command `D' here
-  s/.*\n\(.*\)/\1/
-  tb
-}
-d
diff --git a/gcc/prefix.c b/gcc/prefix.c
deleted file mode 100644 (file)
index 3ffda1a..0000000
+++ /dev/null
@@ -1,314 +0,0 @@
-/* Utility to update paths from internal to external forms.
-   Copyright (C) 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 Library General Public
-License as published by the Free Software Foundation; either
-version 2 of the License, 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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
-
-/* This file contains routines to update a path, both to canonicalize
-   the directory format and to handle any prefix translation.
-
-   This file must be compiled with -DPREFIX= to specify the "prefix"
-   value used by configure.  If a filename does not begin with this
-   prefix, it will not be affected other than by directory canonicalization.
-
-   Each caller of 'update_path' may specify both a filename and
-   a translation prefix and consist of the name of the package that contains
-   the file ("@GCC", "@BINUTIL", "@GNU", etc).
-
-   If the prefix is not specified, the filename will only undergo
-   directory canonicalization.
-
-   If it is specified, the string given by PREFIX will be replaced
-   by the specified prefix (with a '@' in front unless the prefix begins
-   with a '$') and further translation will be done as follows
-   until none of the two conditions below are met:
-
-   1) If the filename begins with '@', the string between the '@' and
-   the end of the name or the first '/' or directory separator will
-   be considered a "key" and looked up as follows:
-
-   -- If this is a Win32 OS, then the Registry will be examined for
-      an entry of "key" in 
-
-      HKEY_LOCAL_MACHINE\SOFTWARE\Free Software Foundation\
-
-      if found, that value will be used.
-
-   -- If not found (or not a Win32 OS), the environment variable
-      key_ROOT (the value of "key" concatenated with the constant "_ROOT")
-      is tried.  If that fails, then PREFIX (see above) is used.
-
-   2) If the filename begins with a '$', the rest of the string up
-   to the end or the first '/' or directory separator will be used
-   as an environment variable, whose value will be returned.
-
-   Once all this is done, any '/' will be converted to DIR_SEPARATOR,
-   if they are different. 
-
-   NOTE:  using resolve_keyed_path under Win32 requires linking with
-   advapi32.dll.  */
-
-
-#include "config.h"
-#include "gansidecl.h"
-#include "stdarg.h"
-
-#ifdef _WIN32
-#include <windows.h>
-#endif
-
-static char *get_key_value     PROTO((char *));
-static char *translate_name    PROTO((char *));
-static char *concat            PVPROTO((char *, ...));
-static char *save_string       PROTO((char *, int));
-
-#ifdef _WIN32
-static char *lookup_key                PROTO((char *));
-static HKEY reg_key = (HKEY) INVALID_HANDLE_VALUE;
-#endif
-
-extern char *getenv ();
-
-/* Given KEY, as above, return its value.  */
-
-static char *
-get_key_value (key)
-     char *key;
-{
-  char *prefix = 0;
-
-#ifdef _WIN32
-  prefix = lookup_key (key);
-#endif
-
-  if (prefix == 0)
-    prefix = getenv (concat (key, "_ROOT", NULL_PTR));
-
-  if (prefix == 0)
-    prefix = PREFIX;
-
-  return prefix;
-}
-
-/* Concatenate a sequence of strings, returning the result.
-
-   This function is based on the one in libiberty.  */
-
-static char *
-concat VPROTO((char *first, ...))
-{
-  register int length;
-  register char *newstr;
-  register char *end;
-  register char *arg;
-  va_list args;
-#ifndef __STDC__
-  char *first;
-#endif
-
-  /* First compute the size of the result and get sufficient memory.  */
-
-  VA_START (args, first);
-#ifndef __STDC__
-  first = va_arg (args, char *);
-#endif
-
-  arg = first;
-  length = 0;
-
-  while (arg != 0)
-    {
-      length += strlen (arg);
-      arg = va_arg (args, char *);
-    }
-
-  newstr = (char *) malloc (length + 1);
-  va_end (args);
-
-  /* Now copy the individual pieces to the result string.  */
-
-  VA_START (args, first);
-#ifndef __STDC__
-  first = va_arg (args, char *);
-#endif
-
-  end = newstr;
-  arg = first;
-  while (arg != 0)
-    {
-      while (*arg)
-       *end++ = *arg++;
-      arg = va_arg (args, char *);
-    }
-  *end = '\000';
-  va_end (args);
-
-  return (newstr);
-}
-
-/* Return a copy of a string that has been placed in the heap.  */
-
-static char *
-save_string (s, len)
-     char *s;
-     int len;
-{
-  register char *result = (char *) malloc (len + 1);
-
-  bcopy (s, result, len);
-  result[len] = 0;
-  return result;
-}
-
-#ifdef _WIN32
-
-/* Look up "key" in the registry, as above.  */
-
-static char *
-lookup_key (key)
-     char *key;
-{
-  char *dst;
-  DWORD size;
-  DWORD type;
-  LONG res;
-
-  if (reg_key == (HKEY) INVALID_HANDLE_VALUE)
-    {
-      res = RegOpenKeyExA (HKEY_LOCAL_MACHINE, "SOFTWARE", 0,
-                          KEY_READ, &reg_key);
-
-      if (res == ERROR_SUCCESS)
-       res = RegOpenKeyExA (reg_key, "Free Software Foundation", 0,
-                            KEY_READ, &reg_key);
-
-      if (res != ERROR_SUCCESS)
-        {
-          reg_key = (HKEY) INVALID_HANDLE_VALUE;
-          return 0;
-        }
-    }
-
-  size = 32;
-  dst = (char *) malloc (size);
-
-  res = RegQueryValueExA (reg_key, key, 0, &type, dst, &size);
-  if (res == ERROR_MORE_DATA && type == REG_SZ)
-    {
-      dst = (char *) realloc (dst, size);
-      res = RegQueryValueExA (reg_key, key, 0, &type, dst, &size);
-    }
-
-  if (type != REG_SZ || res != ERROR_SUCCESS)
-    {
-      free (dst);
-      dst = 0;
-    }
-
-  return dst;
-}
-#endif
-
-/* If NAME starts with a '@' or '$', apply the translation rules above
-   and return a new name.  Otherwise, return the given name.  */
-
-static char *
-translate_name (name)
-     char *name;
-{
-  char code = name[0];
-  char *key, *prefix;
-  int keylen;
-
-  if (code != '@' && code != '$')
-    return name;
-
-  for (keylen = 0;
-       (name[keylen + 1] != 0 && name[keylen + 1] != '/'
-#ifdef DIR_SEPARATOR
-       && name[keylen + 1] != DIR_SEPARATOR
-#endif
-       );
-       keylen++)
-    ;
-
-  key = alloca (keylen + 1);
-  strncpy (key, &name[1], keylen);
-  key[keylen] = 0;
-
-  name = &name[keylen + 1];
-
-  if (code == '@')
-    {
-      prefix = get_key_value (key);
-      if (prefix == 0)
-       prefix = PREFIX;
-    }
-  else
-    {
-      prefix = getenv (key);
-      if (prefix == 0)
-       prefix = concat ("$", key, NULL_PTR);
-    }
-
-  /* Remove any trailing directory separator from what we got.  */
-  if (prefix[strlen (prefix) - 1] == '/'
-#ifdef DIR_SEPARATOR
-      || prefix[strlen (prefix) - 1] == DIR_SEPARATOR
-#endif
-      )
-    {
-      prefix = save_string (prefix, strlen (prefix));
-      prefix[strlen (prefix) - 1] = 0;
-    }
-
-  return concat (prefix, name, NULL_PTR);
-}
-
-/* Update PATH using KEY if PATH starts with PREFIX.  */
-
-char *
-update_path (path, key)
-     char *path;
-     char *key;
-{
-  if (! strncmp (path, PREFIX, strlen (PREFIX)) && key != 0)
-    {
-      if (key[0] != '$')
-       key = concat ("@", key, NULL_PTR);
-
-      path = concat (key, &path[strlen (PREFIX)], NULL_PTR);
-
-      while (path[0] == '@' || path[0] == '$')
-       path = translate_name (path);
-    }
-      
-#ifdef DIR_SEPARATOR
-  if (DIR_SEPARATOR != '/')
-    {
-      int i;
-      int len = strlen (path);
-
-      path = save_string (path, len);
-      for (i = 0; i < len; i++)
-       if (path[i] == '/')
-         path[i] = DIR_SEPARATOR;
-    }
-#endif
-
-  return path;
-}
diff --git a/libstdc++/stl/algorithm b/libstdc++/stl/algorithm
new file mode 100644 (file)
index 0000000..515e9bd
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef __SGI_STL_ALGORITHM
+#define __SGI_STL_ALGORITHM
+
+#include <stl_algobase.h>
+#include <stl_construct.h>
+#include <stl_tempbuf.h>
+#include <stl_algo.h>
+
+#endif /* __SGI_STL_ALGORITHM */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/deque b/libstdc++/stl/deque
new file mode 100644 (file)
index 0000000..61654ac
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef __SGI_STL_DEQUE
+#define __SGI_STL_DEQUE
+
+#include <stl_algobase.h>
+#include <stl_alloc.h>
+#include <stl_construct.h>
+#include <stl_uninitialized.h>
+#include <stl_deque.h>
+
+#endif /* __SGI_STL_DEQUE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/functional b/libstdc++/stl/functional
new file mode 100644 (file)
index 0000000..d046dbb
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+
+#ifndef __SGI_STL_FUNCTIONAL
+#define __SGI_STL_FUNCTIONAL
+
+#include <stl_config.h>
+#include <stddef.h>
+#include <stl_function.h>
+
+#endif /* __SGI_STL_FUNCTIONAL */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/hash_map b/libstdc++/stl/hash_map
new file mode 100644 (file)
index 0000000..f7421e0
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 1996
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+
+#ifndef __SGI_STL_HASH_MAP
+#define __SGI_STL_HASH_MAP
+
+#ifndef __SGI_STL_INTERNAL_HASHTABLE_H
+#include <stl_hashtable.h>
+#endif 
+
+#include <stl_hash_map.h>
+
+#endif /* __SGI_STL_HASH_MAP */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/hash_set b/libstdc++/stl/hash_set
new file mode 100644 (file)
index 0000000..2244f47
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 1996
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+
+#ifndef __SGI_STL_HASH_SET
+#define __SGI_STL_HASH_SET
+
+#ifndef __SGI_STL_INTERNAL_HASHTABLE_H
+#include <stl_hashtable.h>
+#endif 
+
+#include <stl_hash_set.h>
+
+#endif /* __SGI_STL_HASH_SET */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/iterator b/libstdc++/stl/iterator
new file mode 100644 (file)
index 0000000..90e6c9c
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef __SGI_STL_ITERATOR
+#define __SGI_STL_ITERATOR
+
+#include <stl_config.h>
+#include <stl_relops.h>
+#include <stddef.h>
+#include <iostream.h>
+#include <stl_iterator.h>
+
+#endif /* __SGI_STL_ITERATOR */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/list b/libstdc++/stl/list
new file mode 100644 (file)
index 0000000..5294f39
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef __SGI_STL_LIST
+#define __SGI_STL_LIST
+
+#include <stl_algobase.h>
+#include <stl_alloc.h>
+#include <stl_construct.h>
+#include <stl_uninitialized.h>
+#include <stl_list.h>
+
+#endif /* __SGI_STL_LIST */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/map b/libstdc++/stl/map
new file mode 100644 (file)
index 0000000..4cfb765
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef __SGI_STL_MAP
+#define __SGI_STL_MAP
+
+#ifndef __SGI_STL_INTERNAL_TREE_H
+#include <stl_tree.h>
+#endif
+#include <stl_map.h>
+#include <stl_multimap.h>
+
+#endif /* __SGI_STL_MAP */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/memory b/libstdc++/stl/memory
new file mode 100644 (file)
index 0000000..a806588
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+
+#ifndef __SGI_STL_MEMORY
+#define __SGI_STL_MEMORY
+
+#include <stl_algobase.h>
+#include <stl_alloc.h>
+#include <stl_construct.h>
+#include <stl_tempbuf.h>
+#include <stl_uninitialized.h>
+#include <stl_raw_storage_iter.h>
+
+// Note: auto_ptr is commented out in this release because the details
+//  of the interface are still being discussed by the C++ standardization
+//  committee.  It will be included once the iterface is finalized.
+
+#if 0
+#if defined(_MUTABLE_IS_KEYWORD) && defined(_EXPLICIT_IS_KEYWORD) && \
+    defined(__STL_MEMBER_TEMPLATES)
+
+__STL_BEGIN_NAMESPACE
+
+template <class X> class auto_ptr {
+private:
+  X* ptr;
+  mutable bool owns;
+public:
+  typedef X element_type;
+  explicit auto_ptr(X* p = 0) __STL_NOTHROW : ptr(p), owns(p) {}
+  auto_ptr(const auto_ptr& a) __STL_NOTHROW : ptr(a.ptr), owns(a.owns) {
+    a.owns = 0;
+  }
+  template <class T> auto_ptr(const auto_ptr<T>& a) __STL_NOTHROW
+    : ptr(a.ptr), owns(a.owns) {
+      a.owns = 0;
+  }
+
+  auto_ptr& operator=(const auto_ptr& a) __STL_NOTHROW {
+    if (&a != this) {
+      if (owns)
+        delete ptr;
+      owns = a.owns;
+      ptr = a.ptr;
+      a.owns = 0;
+    }
+  }
+  template <class T> auto_ptr& operator=(const auto_ptr<T>& a) __STL_NOTHROW {
+    if (&a != this) {
+      if (owns)
+        delete ptr;
+      owns = a.owns;
+      ptr = a.ptr;
+      a.owns = 0;
+    }
+  }
+  ~auto_ptr() {
+    if (owns)
+      delete ptr;
+  }
+
+  X& operator*() const __STL_NOTHROW { return *ptr; }
+  X* operator->() const __STL_NOTHROW { return ptr; }
+  X* get() const __STL_NOTHROW { return ptr; }
+  X* release const __STL_NOTHROW { owns = false; return ptr }
+};
+
+__STL_END_NAMESPACE
+#endif /* mutable && explicit && member templates */
+#endif /* 0 */
+
+
+#endif /* __SGI_STL_MEMORY */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/numeric b/libstdc++/stl/numeric
new file mode 100644 (file)
index 0000000..7f048e1
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef __SGI_STL_NUMERIC
+#define __SGI_STL_NUMERIC
+
+#include <stl_config.h>
+#include <stl_relops.h>
+#include <stddef.h>
+#include <iostream.h>
+#include <stl_iterator.h>
+#include <stl_function.h>
+#include <stl_numeric.h>
+
+#endif /* __SGI_STL_NUMERIC */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/pthread_alloc b/libstdc++/stl/pthread_alloc
new file mode 100644 (file)
index 0000000..71df3d3
--- /dev/null
@@ -0,0 +1,347 @@
+/*
+ * Copyright (c) 1996
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef __SGI_STL_PTHREAD_ALLOC
+#define __SGI_STL_PTHREAD_ALLOC
+
+// Pthread-specific node allocator.
+// This is similar to the default allocator, except that free-list
+// information is kept separately for each thread, avoiding locking.
+// This should be reasonably fast even in the presence of threads.
+// The down side is that storage may not be well-utilized.
+// It is not an error to allocate memory in thread A and deallocate
+// it n thread B.  But this effectively transfers ownership of the memory,
+// so that it can only be reallocated by thread B.  Thus this can effectively
+// result in a storage leak if it's done on a regular basis.
+// It can also result in frequent sharing of
+// cache lines among processors, with potentially serious performance
+// consequences.
+
+#include <stl_config.h>
+#include <stl_alloc.h>
+#ifndef __RESTRICT
+#  define __RESTRICT
+#endif
+
+__STL_BEGIN_NAMESPACE
+
+// Note that this class has nonstatic members.  We instantiate it once
+// per thread.
+template <bool dummy>
+class __pthread_alloc_template {
+
+private:
+  enum {ALIGN = 8};
+  enum {MAX_BYTES = 128};  // power of 2
+  enum {NFREELISTS = MAX_BYTES/ALIGN};
+
+  union obj {
+        union obj * free_list_link;
+        char client_data[ALIGN];    /* The client sees this.        */
+  };
+
+  // Per instance state
+  obj* volatile free_list[NFREELISTS]; 
+  __pthread_alloc_template<dummy>* next;       // Free list link
+
+  static size_t ROUND_UP(size_t bytes) {
+       return (((bytes) + ALIGN-1) & ~(ALIGN - 1));
+  }
+  static size_t FREELIST_INDEX(size_t bytes) {
+       return (((bytes) + ALIGN-1)/ALIGN - 1);
+  }
+
+  // Returns an object of size n, and optionally adds to size n free list.
+  void *refill(size_t n);
+  // Allocates a chunk for nobjs of size size.  nobjs may be reduced
+  // if it is inconvenient to allocate the requested number.
+  static char *chunk_alloc(size_t size, int &nobjs);
+
+  // Chunk allocation state. And other shared state.
+  // Protected by chunk_allocator_lock.
+  static pthread_mutex_t chunk_allocator_lock;
+  static char *start_free;
+  static char *end_free;
+  static size_t heap_size;
+  static __pthread_alloc_template<dummy>* free_allocators;
+  static pthread_key_t key;
+  static bool key_initialized;
+       // Pthread key under which allocator is stored. 
+       // Allocator instances that are currently unclaimed by any thread.
+  static void destructor(void *instance);
+       // Function to be called on thread exit to reclaim allocator
+       // instance.
+  static __pthread_alloc_template<dummy> *new_allocator();
+       // Return a recycled or new allocator instance.
+  static __pthread_alloc_template<dummy> *get_allocator_instance();
+       // ensure that the current thread has an associated
+       // allocator instance.
+  class lock {
+      public:
+       lock () { pthread_mutex_lock(&chunk_allocator_lock); }
+       ~lock () { pthread_mutex_unlock(&chunk_allocator_lock); }
+  };
+  friend class lock;
+
+
+public:
+
+  __pthread_alloc_template() : next(0)
+  {
+    memset((void *)free_list, 0, NFREELISTS * sizeof(obj *));
+  }
+
+  /* n must be > 0     */
+  static void * allocate(size_t n)
+  {
+    obj * volatile * my_free_list;
+    obj * __RESTRICT result;
+    __pthread_alloc_template<dummy>* a;
+
+    if (n > MAX_BYTES) {
+       return(malloc(n));
+    }
+    if (!key_initialized ||
+        !(a = (__pthread_alloc_template<dummy>*)
+               pthread_getspecific(key))) {
+       a = get_allocator_instance();
+    }
+    my_free_list = a -> free_list + FREELIST_INDEX(n);
+    result = *my_free_list;
+    if (result == 0) {
+       void *r = a -> refill(ROUND_UP(n));
+       return r;
+    }
+    *my_free_list = result -> free_list_link;
+    return (result);
+  };
+
+  /* p may not be 0 */
+  static void deallocate(void *p, size_t n)
+  {
+    obj *q = (obj *)p;
+    obj * volatile * my_free_list;
+    __pthread_alloc_template<dummy>* a;
+
+    if (n > MAX_BYTES) {
+       free(p);
+       return;
+    }
+    if (!key_initialized ||
+        !(a = (__pthread_alloc_template<dummy>*)
+               pthread_getspecific(key))) {
+       a = get_allocator_instance();
+    }
+    my_free_list = a->free_list + FREELIST_INDEX(n);
+    q -> free_list_link = *my_free_list;
+    *my_free_list = q;
+  }
+
+  static void * reallocate(void *p, size_t old_sz, size_t new_sz);
+
+} ;
+
+typedef __pthread_alloc_template<false> pthread_alloc;
+
+
+template <bool dummy>
+void __pthread_alloc_template<dummy>::destructor(void * instance)
+{
+    __pthread_alloc_template<dummy>* a =
+       (__pthread_alloc_template<dummy>*)instance;
+    a -> next = free_allocators;
+    free_allocators = a;
+}
+
+template <bool dummy>
+__pthread_alloc_template<dummy>*
+__pthread_alloc_template<dummy>::new_allocator()
+{
+    if (0 != free_allocators) {
+       __pthread_alloc_template<dummy>* result = free_allocators;
+       free_allocators = free_allocators -> next;
+       return result;
+    } else {
+       return new __pthread_alloc_template<dummy>;
+    }
+}
+
+template <bool dummy>
+__pthread_alloc_template<dummy>*
+__pthread_alloc_template<dummy>::get_allocator_instance()
+{
+    __pthread_alloc_template<dummy>* result;
+    if (!key_initialized) {
+       /*REFERENCED*/
+       lock lock_instance;
+       if (!key_initialized) {
+           if (pthread_key_create(&key, destructor)) {
+               abort();  // failed
+           }
+           key_initialized = true;
+       }
+    }
+    result = new_allocator();
+    if (pthread_setspecific(key, result)) abort();
+    return result;
+}
+
+/* We allocate memory in large chunks in order to avoid fragmenting    */
+/* the malloc heap too much.                                           */
+/* We assume that size is properly aligned.                            */
+template <bool dummy>
+char *__pthread_alloc_template<dummy>
+::chunk_alloc(size_t size, int &nobjs)
+{
+  {
+    char * result;
+    size_t total_bytes;
+    size_t bytes_left;
+    /*REFERENCED*/
+    lock lock_instance;                // Acquire lock for this routine
+
+    total_bytes = size * nobjs;
+    bytes_left = end_free - start_free;
+    if (bytes_left >= total_bytes) {
+       result = start_free;
+       start_free += total_bytes;
+       return(result);
+    } else if (bytes_left >= size) {
+       nobjs = bytes_left/size;
+       total_bytes = size * nobjs;
+       result = start_free;
+       start_free += total_bytes;
+       return(result);
+    } else {
+       size_t bytes_to_get = 2 * total_bytes + ROUND_UP(heap_size >> 4);
+       // Try to make use of the left-over piece.
+       if (bytes_left > 0) {
+           __pthread_alloc_template<dummy>* a = 
+               (__pthread_alloc_template<dummy>*)pthread_getspecific(key);
+           obj * volatile * my_free_list =
+                       a->free_list + FREELIST_INDEX(bytes_left);
+
+            ((obj *)start_free) -> free_list_link = *my_free_list;
+            *my_free_list = (obj *)start_free;
+       }
+#      ifdef _SGI_SOURCE
+         // Try to get memory that's aligned on something like a
+         // cache line boundary, so as to avoid parceling out
+         // parts of the same line to different threads and thus
+         // possibly different processors.
+         {
+           const int cache_line_size = 128;  // probable upper bound
+           bytes_to_get &= ~(cache_line_size-1);
+           start_free = (char *)memalign(cache_line_size, bytes_to_get); 
+           if (0 == start_free) {
+             start_free = (char *)malloc_alloc::allocate(bytes_to_get);
+           }
+         }
+#      else  /* !SGI_SOURCE */
+         start_free = (char *)malloc_alloc::allocate(bytes_to_get);
+#       endif
+       heap_size += bytes_to_get;
+       end_free = start_free + bytes_to_get;
+    }
+  }
+  // lock is released here
+  return(chunk_alloc(size, nobjs));
+}
+
+
+/* Returns an object of size n, and optionally adds to size n free list.*/
+/* We assume that n is properly aligned.                               */
+/* We hold the allocation lock.                                                */
+template <bool dummy>
+void *__pthread_alloc_template<dummy>
+::refill(size_t n)
+{
+    int nobjs = 128;
+    char * chunk = chunk_alloc(n, nobjs);
+    obj * volatile * my_free_list;
+    obj * result;
+    obj * current_obj, * next_obj;
+    int i;
+
+    if (1 == nobjs)  {
+       return(chunk);
+    }
+    my_free_list = free_list + FREELIST_INDEX(n);
+
+    /* Build free list in chunk */
+      result = (obj *)chunk;
+      *my_free_list = next_obj = (obj *)(chunk + n);
+      for (i = 1; ; i++) {
+       current_obj = next_obj;
+       next_obj = (obj *)((char *)next_obj + n);
+       if (nobjs - 1 == i) {
+           current_obj -> free_list_link = 0;
+           break;
+       } else {
+           current_obj -> free_list_link = next_obj;
+       }
+      }
+    return(result);
+}
+
+template <bool dummy>
+void *__pthread_alloc_template<dummy>
+::reallocate(void *p, size_t old_sz, size_t new_sz)
+{
+    void * result;
+    size_t copy_sz;
+
+    if (old_sz > MAX_BYTES && new_sz > MAX_BYTES) {
+       return(realloc(p, new_sz));
+    }
+    if (ROUND_UP(old_sz) == ROUND_UP(new_sz)) return(p);
+    result = allocate(new_sz);
+    copy_sz = new_sz > old_sz? old_sz : new_sz;
+    memcpy(result, p, copy_sz);
+    deallocate(p, old_sz);
+    return(result);
+}
+
+template <bool dummy>
+__pthread_alloc_template<dummy> *
+__pthread_alloc_template<dummy>::free_allocators = 0;
+
+template <bool dummy>
+pthread_key_t __pthread_alloc_template<dummy>::key;
+
+template <bool dummy>
+bool __pthread_alloc_template<dummy>::key_initialized = false;
+
+template <bool dummy>
+pthread_mutex_t __pthread_alloc_template<dummy>::chunk_allocator_lock
+= PTHREAD_MUTEX_INITIALIZER;
+
+template <bool dummy>
+char *__pthread_alloc_template<dummy>
+::start_free = 0;
+
+template <bool dummy>
+char *__pthread_alloc_template<dummy>
+::end_free = 0;
+
+template <bool dummy>
+size_t __pthread_alloc_template<dummy>
+::heap_size = 0;
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_PTHREAD_ALLOC */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/queue b/libstdc++/stl/queue
new file mode 100644 (file)
index 0000000..f9417fb
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef __SGI_STL_QUEUE
+#define __SGI_STL_QUEUE
+
+#include <stl_algobase.h>
+#include <stl_alloc.h>
+#include <stl_construct.h>
+#include <stl_uninitialized.h>
+#include <stl_vector.h>
+#include <stl_bvector.h>
+#include <stl_heap.h>
+#include <stl_deque.h>
+#include <stl_function.h>
+#include <stl_queue.h>
+
+#endif /* __SGI_STL_QUEUE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/rope b/libstdc++/stl/rope
new file mode 100644 (file)
index 0000000..9ef7382
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef __SGI_STL_ROPE
+#define __SGI_STL_ROPE
+
+#include <stl_algobase.h>
+#include <tempbuf.h>
+#include <stl_algo.h>
+#include <stl_function.h>
+#include <stl_numeric.h>
+#include <stl_alloc.h>
+#include <stl_construct.h>
+#include <stl_uninitialized.h>
+#include <stl_hash_fun.h>
+#include <stl_rope.h>
+
+#endif /* __SGI_STL_ROPE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/set b/libstdc++/stl/set
new file mode 100644 (file)
index 0000000..c836c45
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef __SGI_STL_SET
+#define __SGI_STL_SET
+
+#ifndef __SGI_STL_INTERNAL_TREE_H
+#include <stl_tree.h>
+#endif
+#include <stl_set.h>
+#include <stl_multiset.h>
+
+#endif /* __SGI_STL_SET */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/slist b/libstdc++/stl/slist
new file mode 100644 (file)
index 0000000..c3ec742
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+
+#ifndef __SGI_STL_SLIST
+#define __SGI_STL_SLIST
+
+#include <stl_algobase.h>
+#include <stl_alloc.h>
+#include <stl_construct.h>
+#include <stl_uninitialized.h>
+#include <stl_slist.h>
+
+#endif /* __SGI_STL_SLIST */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stack b/libstdc++/stl/stack
new file mode 100644 (file)
index 0000000..36461d9
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef __SGI_STL_STACK
+#define __SGI_STL_STACK
+
+#include <stl_algobase.h>
+#include <stl_alloc.h>
+#include <stl_construct.h>
+#include <stl_uninitialized.h>
+#include <stl_deque.h>
+#include <stl_stack.h>
+
+#endif /* __SGI_STL_STACK */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_algo.h b/libstdc++/stl/stl_algo.h
new file mode 100644 (file)
index 0000000..6703c2a
--- /dev/null
@@ -0,0 +1,2674 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_ALGO_H
+#define __SGI_STL_INTERNAL_ALGO_H
+
+#include <stl_heap.h>
+
+__STL_BEGIN_NAMESPACE
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1209
+#endif
+
+template <class T>
+inline const T& __median(const T& a, const T& b, const T& c) {
+  if (a < b)
+    if (b < c)
+      return b;
+    else if (a < c)
+      return c;
+    else
+      return a;
+  else if (a < c)
+    return a;
+  else if (b < c)
+    return c;
+  else
+    return b;
+}
+
+template <class T, class Compare>
+inline const T& __median(const T& a, const T& b, const T& c, Compare comp) {
+  if (comp(a, b))
+    if (comp(b, c))
+      return b;
+    else if (comp(a, c))
+      return c;
+    else
+      return a;
+  else if (comp(a, c))
+    return a;
+  else if (comp(b, c))
+    return c;
+  else
+    return b;
+}
+
+template <class InputIterator, class Function>
+Function for_each(InputIterator first, InputIterator last, Function f) {
+  for ( ; first != last; ++first)
+    f(*first);
+  return f;
+}
+
+template <class InputIterator, class T>
+InputIterator find(InputIterator first, InputIterator last, const T& value) {
+  while (first != last && *first != value) ++first;
+  return first;
+}
+
+template <class InputIterator, class Predicate>
+InputIterator find_if(InputIterator first, InputIterator last,
+                      Predicate pred) {
+  while (first != last && !pred(*first)) ++first;
+  return first;
+}
+
+template <class ForwardIterator>
+ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last) {
+  if (first == last) return last;
+  ForwardIterator next = first;
+  while(++next != last) {
+    if (*first == *next) return first;
+    first = next;
+  }
+  return last;
+}
+
+template <class ForwardIterator, class BinaryPredicate>
+ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last,
+                              BinaryPredicate binary_pred) {
+  if (first == last) return last;
+  ForwardIterator next = first;
+  while(++next != last) {
+    if (binary_pred(*first, *next)) return first;
+    first = next;
+  }
+  return last;
+}
+
+template <class InputIterator, class T, class Size>
+void count(InputIterator first, InputIterator last, const T& value,
+           Size& n) {
+  for ( ; first != last; ++first)
+    if (*first == value)
+      ++n;
+}
+
+template <class InputIterator, class Predicate, class Size>
+void count_if(InputIterator first, InputIterator last, Predicate pred,
+              Size& n) {
+  for ( ; first != last; ++first)
+    if (pred(*first))
+      ++n;
+}
+
+#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+template <class InputIterator, class T>
+typename iterator_traits<InputIterator>::difference_type
+count(InputIterator first, InputIterator last, const T& value) {
+  typename iterator_traits<InputIterator>::difference_type n = 0;
+  for ( ; first != last; ++first)
+    if (*first == value)
+      ++n;
+  return n;
+}
+
+template <class InputIterator, class Predicate>
+typename iterator_traits<InputIterator>::difference_type
+count_if(InputIterator first, InputIterator last, Predicate pred) {
+  typename iterator_traits<InputIterator>::difference_type n = 0;
+  for ( ; first != last; ++first)
+    if (pred(*first))
+      ++n;
+  return n;
+}
+
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+template <class ForwardIterator1, class ForwardIterator2, class Distance1,
+          class Distance2>
+ForwardIterator1 __search(ForwardIterator1 first1, ForwardIterator1 last1,
+                          ForwardIterator2 first2, ForwardIterator2 last2,
+                          Distance1*, Distance2*) {
+  Distance1 d1 = 0;
+  distance(first1, last1, d1);
+  Distance2 d2 = 0;
+  distance(first2, last2, d2);
+
+  if (d1 < d2) return last1;
+
+  ForwardIterator1 current1 = first1;
+  ForwardIterator2 current2 = first2;
+
+  while (current2 != last2) 
+    if (*current1 == *current2) {
+      ++current1;
+      ++current2;
+    }
+    else {
+      if (d1 == d2)
+        return last1;
+      else {
+        current1 = ++first1;
+        current2 = first2;
+        --d1;
+      }
+    }
+  return first1;
+}
+
+template <class ForwardIterator1, class ForwardIterator2>
+inline ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
+                               ForwardIterator2 first2, ForwardIterator2 last2)
+{
+  return __search(first1, last1, first2, last2, distance_type(first1),
+                  distance_type(first2));
+}
+
+template <class ForwardIterator1, class ForwardIterator2,
+          class BinaryPredicate, class Distance1, class Distance2>
+ForwardIterator1 __search(ForwardIterator1 first1, ForwardIterator1 last1,
+                          ForwardIterator2 first2, ForwardIterator2 last2,
+                          BinaryPredicate binary_pred, Distance1*, Distance2*) {
+  Distance1 d1 = 0;
+  distance(first1, last1, d1);
+  Distance2 d2 = 0;
+  distance(first2, last2, d2);
+
+  if (d1 < d2) return last1;
+
+  ForwardIterator1 current1 = first1;
+  ForwardIterator2 current2 = first2;
+
+  while (current2 != last2)
+    if (binary_pred(*current1, *current2)) {
+      ++current1;
+      ++current2;
+    }
+    else {
+      if (d1 == d2)
+        return last1;
+      else {
+        current1 = ++first1;
+        current2 = first2;
+        --d1;
+      }
+    }
+  return first1;
+}
+
+template <class ForwardIterator1, class ForwardIterator2,
+          class BinaryPredicate>
+inline ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
+                               ForwardIterator2 first2, ForwardIterator2 last2,
+                               BinaryPredicate binary_pred) {
+  return __search(first1, last1, first2, last2, binary_pred,
+                  distance_type(first1), distance_type(first2));
+}
+
+template <class ForwardIterator, class Integer, class T>
+ForwardIterator search_n(ForwardIterator first, ForwardIterator last,
+                         Integer count, const T& value) {
+  if (count <= 0)
+    return first;
+  else {
+    first = find(first, last, value);
+    while (first != last) {
+      Integer n = count - 1;
+      ForwardIterator i = first;
+      ++i;
+      while (i != last && n != 0 && *i == value) {
+        ++i;
+        --n;
+      }
+      if (n == 0)
+        return first;
+      else
+        first = find(i, last, value);
+    }
+    return last;
+  }
+}
+
+template <class ForwardIterator, class Integer, class T, class BinaryPredicate>
+ForwardIterator search_n(ForwardIterator first, ForwardIterator last,
+                         Integer count, const T& value,
+                         BinaryPredicate binary_pred) {
+  if (count <= 0)
+    return first;
+  else {
+    while (first != last) {
+      if (binary_pred(*first, value)) break;
+      ++first;
+    }
+    while (first != last) {
+      Integer n = count - 1;
+      ForwardIterator i = first;
+      ++i;
+      while (i != last && n != 0 && binary_pred(*i, value)) {
+        ++i;
+        --n;
+      }
+      if (n == 0)
+        return first;
+      else {
+        while (i != last) {
+          if (binary_pred(*i, value)) break;
+          ++i;
+        }
+        first = i;
+      }
+    }
+    return last;
+  }
+} 
+
+template <class ForwardIterator1, class ForwardIterator2>
+ForwardIterator2 swap_ranges(ForwardIterator1 first1, ForwardIterator1 last1,
+                             ForwardIterator2 first2) {
+  for ( ; first1 != last1; ++first1, ++first2)
+    iter_swap(first1, first2);
+  return first2;
+}
+
+template <class InputIterator, class OutputIterator, class UnaryOperation>
+OutputIterator transform(InputIterator first, InputIterator last,
+                         OutputIterator result, UnaryOperation op) {
+  for ( ; first != last; ++first, ++result)
+    *result = op(*first);
+  return result;
+}
+
+template <class InputIterator1, class InputIterator2, class OutputIterator,
+          class BinaryOperation>
+OutputIterator transform(InputIterator1 first1, InputIterator1 last1,
+                         InputIterator2 first2, OutputIterator result,
+                         BinaryOperation binary_op) {
+  for ( ; first1 != last1; ++first1, ++first2, ++result)
+    *result = binary_op(*first1, *first2);
+  return result;
+}
+
+template <class ForwardIterator, class T>
+void replace(ForwardIterator first, ForwardIterator last, const T& old_value,
+             const T& new_value) {
+  for ( ; first != last; ++first)
+    if (*first == old_value) *first = new_value;
+}
+
+template <class ForwardIterator, class Predicate, class T>
+void replace_if(ForwardIterator first, ForwardIterator last, Predicate pred,
+                const T& new_value) {
+  for ( ; first != last; ++first)
+    if (pred(*first)) *first = new_value;
+}
+
+template <class InputIterator, class OutputIterator, class T>
+OutputIterator replace_copy(InputIterator first, InputIterator last,
+                            OutputIterator result, const T& old_value,
+                            const T& new_value) {
+  for ( ; first != last; ++first, ++result)
+    *result = *first == old_value ? new_value : *first;
+  return result;
+}
+
+template <class Iterator, class OutputIterator, class Predicate, class T>
+OutputIterator replace_copy_if(Iterator first, Iterator last,
+                               OutputIterator result, Predicate pred,
+                               const T& new_value) {
+  for ( ; first != last; ++first, ++result)
+    *result = pred(*first) ? new_value : *first;
+  return result;
+}
+
+template <class ForwardIterator, class Generator>
+void generate(ForwardIterator first, ForwardIterator last, Generator gen) {
+  for ( ; first != last; ++first)
+    *first = gen();
+}
+
+template <class OutputIterator, class Size, class Generator>
+OutputIterator generate_n(OutputIterator first, Size n, Generator gen) {
+  for ( ; n > 0; --n, ++first)
+    *first = gen();
+  return first;
+}
+
+template <class InputIterator, class OutputIterator, class T>
+OutputIterator remove_copy(InputIterator first, InputIterator last,
+                           OutputIterator result, const T& value) {
+  for ( ; first != last; ++first)
+    if (*first != value) {
+      *result = *first;
+      ++result;
+    }
+  return result;
+}
+
+template <class InputIterator, class OutputIterator, class Predicate>
+OutputIterator remove_copy_if(InputIterator first, InputIterator last,
+                              OutputIterator result, Predicate pred) {
+  for ( ; first != last; ++first)
+    if (!pred(*first)) {
+      *result = *first;
+      ++result;
+    }
+  return result;
+}
+
+template <class ForwardIterator, class T>
+ForwardIterator remove(ForwardIterator first, ForwardIterator last,
+                       const T& value) {
+  first = find(first, last, value);
+  ForwardIterator next = first;
+  return first == last ? first : remove_copy(++next, last, first, value);
+}
+
+template <class ForwardIterator, class Predicate>
+ForwardIterator remove_if(ForwardIterator first, ForwardIterator last,
+                          Predicate pred) {
+  first = find_if(first, last, pred);
+  ForwardIterator next = first;
+  return first == last ? first : remove_copy_if(++next, last, first, pred);
+}
+
+template <class InputIterator, class ForwardIterator>
+ForwardIterator __unique_copy(InputIterator first, InputIterator last,
+                              ForwardIterator result, forward_iterator_tag) {
+  *result = *first;
+  while (++first != last)
+    if (*result != *first) *++result = *first;
+  return ++result;
+}
+
+
+template <class InputIterator, class OutputIterator, class T>
+OutputIterator __unique_copy(InputIterator first, InputIterator last,
+                             OutputIterator result, T*) {
+  T value = *first;
+  *result = value;
+  while (++first != last)
+    if (value != *first) {
+      value = *first;
+      *++result = value;
+    }
+  return ++result;
+}
+
+template <class InputIterator, class OutputIterator>
+inline OutputIterator __unique_copy(InputIterator first, InputIterator last,
+                                    OutputIterator result, 
+                                    output_iterator_tag) {
+  return __unique_copy(first, last, result, value_type(first));
+}
+
+template <class InputIterator, class OutputIterator>
+inline OutputIterator unique_copy(InputIterator first, InputIterator last,
+                                  OutputIterator result) {
+  if (first == last) return result;
+  return __unique_copy(first, last, result, iterator_category(result));
+}
+template <class InputIterator, class ForwardIterator, class BinaryPredicate>
+ForwardIterator __unique_copy(InputIterator first, InputIterator last,
+                              ForwardIterator result, 
+                              BinaryPredicate binary_pred,
+                              forward_iterator_tag) {
+  *result = *first;
+  while (++first != last)
+    if (!binary_pred(*result, *first)) *++result = *first;
+  return ++result;
+}
+
+template <class InputIterator, class OutputIterator, class BinaryPredicate,
+          class T>
+OutputIterator __unique_copy(InputIterator first, InputIterator last,
+                             OutputIterator result,
+                             BinaryPredicate binary_pred, T*) {
+  T value = *first;
+  *result = value;
+  while (++first != last)
+    if (!binary_pred(value, *first)) {
+      value = *first;
+      *++result = value;
+    }
+  return ++result;
+}
+
+template <class InputIterator, class OutputIterator, class BinaryPredicate>
+inline OutputIterator __unique_copy(InputIterator first, InputIterator last,
+                                    OutputIterator result,
+                                    BinaryPredicate binary_pred,
+                                    output_iterator_tag) {
+  return __unique_copy(first, last, result, binary_pred, value_type(first));
+}
+
+template <class InputIterator, class OutputIterator, class BinaryPredicate>
+inline OutputIterator unique_copy(InputIterator first, InputIterator last,
+                                  OutputIterator result,
+                                  BinaryPredicate binary_pred) {
+  if (first == last) return result;
+  return __unique_copy(first, last, result, binary_pred,
+                       iterator_category(result));
+}
+
+template <class ForwardIterator>
+ForwardIterator unique(ForwardIterator first, ForwardIterator last) {
+  first = adjacent_find(first, last);
+  return unique_copy(first, last, first);
+}
+
+template <class ForwardIterator, class BinaryPredicate>
+ForwardIterator unique(ForwardIterator first, ForwardIterator last,
+                       BinaryPredicate binary_pred) {
+  first = adjacent_find(first, last, binary_pred);
+  return unique_copy(first, last, first, binary_pred);
+}
+
+template <class BidirectionalIterator>
+void __reverse(BidirectionalIterator first, BidirectionalIterator last, 
+               bidirectional_iterator_tag) {
+  while (true)
+    if (first == last || first == --last)
+      return;
+    else
+      iter_swap(first++, last);
+}
+
+template <class RandomAccessIterator>
+void __reverse(RandomAccessIterator first, RandomAccessIterator last,
+               random_access_iterator_tag) {
+  while (first < last) iter_swap(first++, --last);
+}
+
+template <class BidirectionalIterator>
+inline void reverse(BidirectionalIterator first, BidirectionalIterator last) {
+  __reverse(first, last, iterator_category(first));
+}
+
+template <class BidirectionalIterator, class OutputIterator>
+OutputIterator reverse_copy(BidirectionalIterator first,
+                            BidirectionalIterator last,
+                            OutputIterator result) {
+  while (first != last) {
+    --last;
+    *result = *last;
+    ++result;
+  }
+  return result;
+}
+
+template <class ForwardIterator, class Distance>
+void __rotate(ForwardIterator first, ForwardIterator middle,
+              ForwardIterator last, Distance*, forward_iterator_tag) {
+  for (ForwardIterator i = middle; ;) {
+    iter_swap(first, i);
+    ++first;
+    ++i;
+    if (first == middle) {
+      if (i == last) return;
+      middle = i;
+    }
+    else if (i == last)
+      i = middle;
+  }
+}
+
+template <class BidirectionalIterator, class Distance>
+void __rotate(BidirectionalIterator first, BidirectionalIterator middle,
+              BidirectionalIterator last, Distance*,
+              bidirectional_iterator_tag) {
+  reverse(first, middle);
+  reverse(middle, last);
+  reverse(first, last);
+}
+
+template <class EuclideanRingElement>
+EuclideanRingElement __gcd(EuclideanRingElement m, EuclideanRingElement n)
+{
+  while (n != 0) {
+    EuclideanRingElement t = m % n;
+    m = n;
+    n = t;
+  }
+  return m;
+}
+
+template <class RandomAccessIterator, class Distance, class T>
+void __rotate_cycle(RandomAccessIterator first, RandomAccessIterator last,
+                    RandomAccessIterator initial, Distance shift, T*) {
+  T value = *initial;
+  RandomAccessIterator ptr1 = initial;
+  RandomAccessIterator ptr2 = ptr1 + shift;
+  while (ptr2 != initial) {
+    *ptr1 = *ptr2;
+    ptr1 = ptr2;
+    if (last - ptr2 > shift)
+      ptr2 += shift;
+    else
+      ptr2 = first + (shift - (last - ptr2));
+  }
+  *ptr1 = value;
+}
+
+template <class RandomAccessIterator, class Distance>
+void __rotate(RandomAccessIterator first, RandomAccessIterator middle,
+              RandomAccessIterator last, Distance*,
+              random_access_iterator_tag) {
+  Distance n = __gcd(last - first, middle - first);
+  while (n--)
+    __rotate_cycle(first, last, first + n, middle - first,
+                   value_type(first));
+}
+
+template <class ForwardIterator>
+inline void rotate(ForwardIterator first, ForwardIterator middle,
+                   ForwardIterator last) {
+  if (first == middle || middle == last) return;
+  __rotate(first, middle, last, distance_type(first),
+           iterator_category(first));
+}
+
+template <class ForwardIterator, class OutputIterator>
+OutputIterator rotate_copy(ForwardIterator first, ForwardIterator middle,
+                           ForwardIterator last, OutputIterator result) {
+  return copy(first, middle, copy(middle, last, result));
+}
+
+template <class RandomAccessIterator, class Distance>
+void __random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
+                      Distance*) {
+  if (first == last) return;
+  for (RandomAccessIterator i = first + 1; i != last; ++i) 
+#ifdef __STL_NO_DRAND48
+    iter_swap(i, first + Distance(rand() % ((i - first) + 1)));
+#else
+  iter_swap(i, first + Distance(lrand48() % ((i - first) + 1)));
+#endif
+}
+
+template <class RandomAccessIterator>
+inline void random_shuffle(RandomAccessIterator first,
+                           RandomAccessIterator last) {
+  __random_shuffle(first, last, distance_type(first));
+}
+
+template <class RandomAccessIterator, class RandomNumberGenerator>
+void random_shuffle(RandomAccessIterator first, RandomAccessIterator last,
+                    RandomNumberGenerator& rand) {
+  if (first == last) return;
+  for (RandomAccessIterator i = first + 1; i != last; ++i)
+    iter_swap(i, first + rand((i - first) + 1));
+}
+
+template <class ForwardIterator, class OutputIterator, class Distance>
+OutputIterator random_sample_n(ForwardIterator first, ForwardIterator last,
+                               OutputIterator out, const Distance n)
+{
+  Distance remaining = 0;
+  distance(first, last, remaining);
+  Distance m = min(n, remaining);
+
+  while (m > 0) {
+#ifdef __STL_NO_DRAND48
+    if (rand() % remaining < m) {
+#else
+    if (lrand48() % remaining < m) {
+#endif
+      *out = *first;
+      ++out;
+      --m;
+    }
+
+    --remaining;
+    ++first;
+  }
+  return out;
+}
+
+template <class ForwardIterator, class OutputIterator, class Distance,
+          class RandomNumberGenerator>
+OutputIterator random_sample_n(ForwardIterator first, ForwardIterator last,
+                               OutputIterator out, const Distance n,
+                               RandomNumberGenerator& rand)
+{
+  Distance remaining = 0;
+  distance(first, last, remaining);
+  Distance m = min(n, remaining);
+
+  while (m > 0) {
+    if (rand(remaining) < m) {
+      *out = *first;
+      ++out;
+      --m;
+    }
+
+    --remaining;
+    ++first;
+  }
+  return out;
+}
+
+template <class InputIterator, class RandomAccessIterator, class Distance>
+RandomAccessIterator __random_sample(InputIterator first, InputIterator last,
+                                     RandomAccessIterator out,
+                                     const Distance n)
+{
+  Distance m = 0;
+  Distance t = n;
+  for ( ; first != last && m < n; ++m, ++first) 
+    out[m] = *first;
+
+  while (first != last) {
+    ++t;
+#ifdef __STL_NO_DRAND48
+    Distance M = rand() % t;
+#else
+    Distance M = lrand48() % t;
+#endif
+    if (M < n)
+      out[M] = *first;
+    ++first;
+  }
+
+  return out + m;
+}
+
+template <class InputIterator, class RandomAccessIterator,
+          class RandomNumberGenerator, class Distance>
+RandomAccessIterator __random_sample(InputIterator first, InputIterator last,
+                                     RandomAccessIterator out,
+                                     RandomNumberGenerator& rand,
+                                     const Distance n)
+{
+  Distance m = 0;
+  Distance t = n;
+  for ( ; first != last && m < n; ++m, ++first)
+    out[m] = *first;
+
+  while (first != last) {
+    ++t;
+    Distance M = rand(t);
+    if (M < n)
+      out[M] = *first;
+    ++first;
+  }
+
+  return out + m;
+}
+
+template <class InputIterator, class RandomAccessIterator>
+inline RandomAccessIterator
+random_sample(InputIterator first, InputIterator last,
+              RandomAccessIterator out_first, RandomAccessIterator out_last) 
+{
+  return __random_sample(first, last, out_first, out_last - out_first);
+}
+
+template <class InputIterator, class RandomAccessIterator, 
+          class RandomNumberGenerator>
+inline RandomAccessIterator
+random_sample(InputIterator first, InputIterator last,
+              RandomAccessIterator out_first, RandomAccessIterator out_last,
+              RandomNumberGenerator& rand) 
+{
+  return __random_sample(first, last, out_first, rand, out_last - out_first);
+}
+
+
+
+template <class BidirectionalIterator, class Predicate>
+BidirectionalIterator partition(BidirectionalIterator first,
+                                BidirectionalIterator last, Predicate pred) {
+  while (true) {
+    while (true)
+      if (first == last)
+        return first;
+      else if (pred(*first))
+        ++first;
+      else
+        break;
+    --last;
+    while (true)
+      if (first == last)
+        return first;
+      else if (!pred(*last))
+        --last;
+      else
+        break;
+    iter_swap(first, last);
+    ++first;
+  }
+}
+
+template <class ForwardIterator, class Predicate, class Distance>
+ForwardIterator __inplace_stable_partition(ForwardIterator first,
+                                           ForwardIterator last,
+                                           Predicate pred, Distance len) {
+  if (len == 1) return pred(*first) ? last : first;
+  ForwardIterator middle = first;
+  advance(middle, len / 2);
+  ForwardIterator 
+    first_cut = __inplace_stable_partition(first, middle, pred, len / 2);
+  ForwardIterator 
+    second_cut = __inplace_stable_partition(middle, last, pred,
+                                            len - len / 2);
+  rotate(first_cut, middle, second_cut);
+  len = 0;
+  distance(middle, second_cut, len);
+  advance(first_cut, len);
+  return first_cut;
+}
+
+template <class ForwardIterator, class Pointer, class Predicate, 
+          class Distance>
+ForwardIterator __stable_partition_adaptive(ForwardIterator first,
+                                            ForwardIterator last,
+                                            Predicate pred, Distance len,
+                                            Pointer buffer,
+                                            Distance buffer_size) {
+  if (len <= buffer_size) {
+    ForwardIterator result1 = first;
+    Pointer result2 = buffer;
+    for ( ; first != last ; ++first)
+      if (pred(*first)) {
+        *result1 = *first;
+        ++result1;
+      }
+      else {
+        *result2 = *first;
+        ++result2;
+      }
+    copy(buffer, result2, result1);
+    return result1;
+  }
+  else {
+    ForwardIterator middle = first;
+    advance(middle, len / 2);
+    ForwardIterator first_cut =
+      __stable_partition_adaptive(first, middle, pred, len / 2,
+                                  buffer, buffer_size);
+    ForwardIterator second_cut =
+      __stable_partition_adaptive(middle, last, pred, len - len / 2,
+                                  buffer, buffer_size);
+
+    rotate(first_cut, middle, second_cut);
+    len = 0;
+    distance(middle, second_cut, len);
+    advance(first_cut, len);
+    return first_cut;
+  }
+}
+
+template <class ForwardIterator, class Predicate, class T, class Distance>
+inline ForwardIterator __stable_partition_aux(ForwardIterator first,
+                                              ForwardIterator last, 
+                                              Predicate pred, T*, Distance*) {
+  temporary_buffer<ForwardIterator, T> buf(first, last);
+  if (buf.size() > 0)
+    return __stable_partition_adaptive(first, last, pred,
+                                       Distance(buf.requested_size()),
+                                       buf.begin(), buf.size());
+  else
+    return __inplace_stable_partition(first, last, pred, 
+                                      Distance(buf.requested_size()));
+}
+
+template <class ForwardIterator, class Predicate>
+inline ForwardIterator stable_partition(ForwardIterator first,
+                                        ForwardIterator last, 
+                                        Predicate pred) {
+  if (first == last)
+    return first;
+  else
+    return __stable_partition_aux(first, last, pred,
+                                  value_type(first), distance_type(first));
+}
+
+template <class RandomAccessIterator, class T>
+RandomAccessIterator __unguarded_partition(RandomAccessIterator first, 
+                                           RandomAccessIterator last, 
+                                           T pivot) {
+  while (true) {
+    while (*first < pivot) ++first;
+    --last;
+    while (pivot < *last) --last;
+    if (!(first < last)) return first;
+    iter_swap(first, last);
+    ++first;
+  }
+}    
+
+template <class RandomAccessIterator, class T, class Compare>
+RandomAccessIterator __unguarded_partition(RandomAccessIterator first, 
+                                           RandomAccessIterator last, 
+                                           T pivot, Compare comp) {
+  while (1) {
+    while (comp(*first, pivot)) ++first;
+    --last;
+    while (comp(pivot, *last)) --last;
+    if (!(first < last)) return first;
+    iter_swap(first, last);
+    ++first;
+  }
+}
+
+const int __stl_threshold = 16;
+
+
+template <class RandomAccessIterator, class T>
+void __unguarded_linear_insert(RandomAccessIterator last, T value) {
+  RandomAccessIterator next = last;
+  --next;
+  while (value < *next) {
+    *last = *next;
+    last = next;
+    --next;
+  }
+  *last = value;
+}
+
+template <class RandomAccessIterator, class T, class Compare>
+void __unguarded_linear_insert(RandomAccessIterator last, T value, 
+                               Compare comp) {
+  RandomAccessIterator next = last;
+  --next;  
+  while (comp(value , *next)) {
+    *last = *next;
+    last = next;
+    --next;
+  }
+  *last = value;
+}
+
+template <class RandomAccessIterator, class T>
+inline void __linear_insert(RandomAccessIterator first, 
+                            RandomAccessIterator last, T*) {
+  T value = *last;
+  if (value < *first) {
+    copy_backward(first, last, last + 1);
+    *first = value;
+  }
+  else
+    __unguarded_linear_insert(last, value);
+}
+
+template <class RandomAccessIterator, class T, class Compare>
+inline void __linear_insert(RandomAccessIterator first, 
+                            RandomAccessIterator last, T*, Compare comp) {
+  T value = *last;
+  if (comp(value, *first)) {
+    copy_backward(first, last, last + 1);
+    *first = value;
+  }
+  else
+    __unguarded_linear_insert(last, value, comp);
+}
+
+template <class RandomAccessIterator>
+void __insertion_sort(RandomAccessIterator first, RandomAccessIterator last) {
+  if (first == last) return; 
+  for (RandomAccessIterator i = first + 1; i != last; ++i)
+    __linear_insert(first, i, value_type(first));
+}
+
+template <class RandomAccessIterator, class Compare>
+void __insertion_sort(RandomAccessIterator first,
+                      RandomAccessIterator last, Compare comp) {
+  if (first == last) return;
+  for (RandomAccessIterator i = first + 1; i != last; ++i)
+    __linear_insert(first, i, value_type(first), comp);
+}
+
+template <class RandomAccessIterator, class T>
+void __unguarded_insertion_sort_aux(RandomAccessIterator first, 
+                                    RandomAccessIterator last, T*) {
+  for (RandomAccessIterator i = first; i != last; ++i)
+    __unguarded_linear_insert(i, T(*i));
+}
+
+template <class RandomAccessIterator>
+inline void __unguarded_insertion_sort(RandomAccessIterator first, 
+                                RandomAccessIterator last) {
+  __unguarded_insertion_sort_aux(first, last, value_type(first));
+}
+
+template <class RandomAccessIterator, class T, class Compare>
+void __unguarded_insertion_sort_aux(RandomAccessIterator first, 
+                                    RandomAccessIterator last,
+                                    T*, Compare comp) {
+  for (RandomAccessIterator i = first; i != last; ++i)
+    __unguarded_linear_insert(i, T(*i), comp);
+}
+
+template <class RandomAccessIterator, class Compare>
+inline void __unguarded_insertion_sort(RandomAccessIterator first, 
+                                       RandomAccessIterator last,
+                                       Compare comp) {
+  __unguarded_insertion_sort_aux(first, last, value_type(first), comp);
+}
+
+template <class RandomAccessIterator>
+void __final_insertion_sort(RandomAccessIterator first, 
+                            RandomAccessIterator last) {
+  if (last - first > __stl_threshold) {
+    __insertion_sort(first, first + __stl_threshold);
+    __unguarded_insertion_sort(first + __stl_threshold, last);
+  }
+  else
+    __insertion_sort(first, last);
+}
+
+template <class RandomAccessIterator, class Compare>
+void __final_insertion_sort(RandomAccessIterator first, 
+                            RandomAccessIterator last, Compare comp) {
+  if (last - first > __stl_threshold) {
+    __insertion_sort(first, first + __stl_threshold, comp);
+    __unguarded_insertion_sort(first + __stl_threshold, last, comp);
+  }
+  else
+    __insertion_sort(first, last, comp);
+}
+
+template <class Size>
+inline Size __lg(Size n) {
+  Size k;
+  for (k = 0; n != 1; n >>= 1) ++k;
+  return k;
+}
+
+template <class RandomAccessIterator, class T, class Size>
+void __introsort_loop(RandomAccessIterator first,
+                      RandomAccessIterator last, T*,
+                      Size depth_limit) {
+  while (last - first > __stl_threshold) {
+    if (depth_limit == 0) {
+      partial_sort(first, last, last);
+      return;
+    }
+    --depth_limit;
+    RandomAccessIterator cut = __unguarded_partition
+      (first, last, T(__median(*first, *(first + (last - first)/2),
+                               *(last - 1))));
+    __introsort_loop(cut, last, value_type(first), depth_limit);
+    last = cut;
+  }
+}
+
+template <class RandomAccessIterator, class T, class Size, class Compare>
+void __introsort_loop(RandomAccessIterator first,
+                      RandomAccessIterator last, T*,
+                      Size depth_limit, Compare comp) {
+  while (last - first > __stl_threshold) {
+    if (depth_limit == 0) {
+      partial_sort(first, last, last, comp);
+      return;
+    }
+    --depth_limit;
+    RandomAccessIterator cut = __unguarded_partition
+      (first, last, T(__median(*first, *(first + (last - first)/2),
+                               *(last - 1), comp)), comp);
+    __introsort_loop(cut, last, value_type(first), depth_limit, comp);
+    last = cut;
+  }
+}
+
+template <class RandomAccessIterator>
+inline void sort(RandomAccessIterator first, RandomAccessIterator last) {
+  if (first != last) {
+    __introsort_loop(first, last, value_type(first), __lg(last - first) * 2);
+    __final_insertion_sort(first, last);
+  }
+}
+
+template <class RandomAccessIterator, class Compare>
+inline void sort(RandomAccessIterator first, RandomAccessIterator last,
+                 Compare comp) {
+  if (first != last) {
+    __introsort_loop(first, last, value_type(first), __lg(last - first) * 2,
+                     comp);
+    __final_insertion_sort(first, last, comp);
+  }
+}
+
+
+template <class RandomAccessIterator>
+void __inplace_stable_sort(RandomAccessIterator first,
+                           RandomAccessIterator last) {
+  if (last - first < 15) {
+    __insertion_sort(first, last);
+    return;
+  }
+  RandomAccessIterator middle = first + (last - first) / 2;
+  __inplace_stable_sort(first, middle);
+  __inplace_stable_sort(middle, last);
+  __merge_without_buffer(first, middle, last, middle - first, last - middle);
+}
+
+template <class RandomAccessIterator, class Compare>
+void __inplace_stable_sort(RandomAccessIterator first,
+                           RandomAccessIterator last, Compare comp) {
+  if (last - first < 15) {
+    __insertion_sort(first, last, comp);
+    return;
+  }
+  RandomAccessIterator middle = first + (last - first) / 2;
+  __inplace_stable_sort(first, middle, comp);
+  __inplace_stable_sort(middle, last, comp);
+  __merge_without_buffer(first, middle, last, middle - first,
+                         last - middle, comp);
+}
+
+template <class RandomAccessIterator1, class RandomAccessIterator2,
+          class Distance>
+void __merge_sort_loop(RandomAccessIterator1 first,
+                       RandomAccessIterator1 last, 
+                       RandomAccessIterator2 result, Distance step_size) {
+  Distance two_step = 2 * step_size;
+
+  while (last - first >= two_step) {
+    result = merge(first, first + step_size,
+                   first + step_size, first + two_step, result);
+    first += two_step;
+  }
+
+  step_size = min(Distance(last - first), step_size);
+  merge(first, first + step_size, first + step_size, last, result);
+}
+
+template <class RandomAccessIterator1, class RandomAccessIterator2,
+          class Distance, class Compare>
+void __merge_sort_loop(RandomAccessIterator1 first,
+                       RandomAccessIterator1 last, 
+                       RandomAccessIterator2 result, Distance step_size,
+                       Compare comp) {
+  Distance two_step = 2 * step_size;
+
+  while (last - first >= two_step) {
+    result = merge(first, first + step_size,
+                   first + step_size, first + two_step, result, comp);
+    first += two_step;
+  }
+  step_size = min(Distance(last - first), step_size);
+
+  merge(first, first + step_size, first + step_size, last, result, comp);
+}
+
+const int __stl_chunk_size = 7;
+        
+template <class RandomAccessIterator, class Distance>
+void __chunk_insertion_sort(RandomAccessIterator first, 
+                            RandomAccessIterator last, Distance chunk_size) {
+  while (last - first >= chunk_size) {
+    __insertion_sort(first, first + chunk_size);
+    first += chunk_size;
+  }
+  __insertion_sort(first, last);
+}
+
+template <class RandomAccessIterator, class Distance, class Compare>
+void __chunk_insertion_sort(RandomAccessIterator first, 
+                            RandomAccessIterator last,
+                            Distance chunk_size, Compare comp) {
+  while (last - first >= chunk_size) {
+    __insertion_sort(first, first + chunk_size, comp);
+    first += chunk_size;
+  }
+  __insertion_sort(first, last, comp);
+}
+
+template <class RandomAccessIterator, class Pointer, class Distance>
+void __merge_sort_with_buffer(RandomAccessIterator first, 
+                              RandomAccessIterator last,
+                              Pointer buffer, Distance*) {
+  Distance len = last - first;
+  Pointer buffer_last = buffer + len;
+
+  Distance step_size = __stl_chunk_size;
+  __chunk_insertion_sort(first, last, step_size);
+
+  while (step_size < len) {
+    __merge_sort_loop(first, last, buffer, step_size);
+    step_size *= 2;
+    __merge_sort_loop(buffer, buffer_last, first, step_size);
+    step_size *= 2;
+  }
+}
+
+template <class RandomAccessIterator, class Pointer, class Distance,
+          class Compare>
+void __merge_sort_with_buffer(RandomAccessIterator first, 
+                              RandomAccessIterator last, Pointer buffer,
+                              Distance*, Compare comp) {
+  Distance len = last - first;
+  Pointer buffer_last = buffer + len;
+
+  Distance step_size = __stl_chunk_size;
+  __chunk_insertion_sort(first, last, step_size, comp);
+
+  while (step_size < len) {
+    __merge_sort_loop(first, last, buffer, step_size, comp);
+    step_size *= 2;
+    __merge_sort_loop(buffer, buffer_last, first, step_size, comp);
+    step_size *= 2;
+  }
+}
+
+template <class RandomAccessIterator, class Pointer, class Distance>
+void __stable_sort_adaptive(RandomAccessIterator first, 
+                            RandomAccessIterator last, Pointer buffer,
+                            Distance buffer_size) {
+  Distance len = (last - first + 1) / 2;
+  RandomAccessIterator middle = first + len;
+  if (len > buffer_size) {
+    __stable_sort_adaptive(first, middle, buffer, buffer_size);
+    __stable_sort_adaptive(middle, last, buffer, buffer_size);
+  } else {
+    __merge_sort_with_buffer(first, middle, buffer, (Distance*)0);
+    __merge_sort_with_buffer(middle, last, buffer, (Distance*)0);
+  }
+  __merge_adaptive(first, middle, last, Distance(middle - first), 
+                   Distance(last - middle), buffer, buffer_size);
+}
+
+template <class RandomAccessIterator, class Pointer, class Distance, 
+          class Compare>
+void __stable_sort_adaptive(RandomAccessIterator first, 
+                            RandomAccessIterator last, Pointer buffer,
+                            Distance buffer_size, Compare comp) {
+  Distance len = (last - first + 1) / 2;
+  RandomAccessIterator middle = first + len;
+  if (len > buffer_size) {
+    __stable_sort_adaptive(first, middle, buffer, buffer_size, 
+                           comp);
+    __stable_sort_adaptive(middle, last, buffer, buffer_size, 
+                           comp);
+  } else {
+    __merge_sort_with_buffer(first, middle, buffer, (Distance*)0, comp);
+    __merge_sort_with_buffer(middle, last, buffer, (Distance*)0, comp);
+  }
+  __merge_adaptive(first, middle, last, Distance(middle - first), 
+                   Distance(last - middle), buffer, buffer_size,
+                   comp);
+}
+
+template <class RandomAccessIterator, class T, class Distance>
+inline void __stable_sort_aux(RandomAccessIterator first,
+                              RandomAccessIterator last, T*, Distance*) {
+  temporary_buffer<RandomAccessIterator, T> buf(first, last);
+  if (buf.begin() == 0)
+    __inplace_stable_sort(first, last);
+  else 
+    __stable_sort_adaptive(first, last, buf.begin(), Distance(buf.size()));
+}
+
+template <class RandomAccessIterator, class T, class Distance, class Compare>
+inline void __stable_sort_aux(RandomAccessIterator first,
+                              RandomAccessIterator last, T*, Distance*,
+                              Compare comp) {
+  temporary_buffer<RandomAccessIterator, T> buf(first, last);
+  if (buf.begin() == 0)
+    __inplace_stable_sort(first, last, comp);
+  else 
+    __stable_sort_adaptive(first, last, buf.begin(), Distance(buf.size()),
+                           comp);
+}
+
+template <class RandomAccessIterator>
+inline void stable_sort(RandomAccessIterator first,
+                        RandomAccessIterator last) {
+  __stable_sort_aux(first, last, value_type(first), distance_type(first));
+}
+
+template <class RandomAccessIterator, class Compare>
+inline void stable_sort(RandomAccessIterator first,
+                        RandomAccessIterator last, Compare comp) {
+  __stable_sort_aux(first, last, value_type(first), distance_type(first), 
+                    comp);
+}
+
+template <class RandomAccessIterator, class T>
+void __partial_sort(RandomAccessIterator first, RandomAccessIterator middle,
+                    RandomAccessIterator last, T*) {
+  make_heap(first, middle);
+  for (RandomAccessIterator i = middle; i < last; ++i)
+    if (*i < *first) 
+      __pop_heap(first, middle, i, T(*i), distance_type(first));
+  sort_heap(first, middle);
+}
+
+template <class RandomAccessIterator>
+inline void partial_sort(RandomAccessIterator first,
+                         RandomAccessIterator middle,
+                         RandomAccessIterator last) {
+  __partial_sort(first, middle, last, value_type(first));
+}
+
+template <class RandomAccessIterator, class T, class Compare>
+void __partial_sort(RandomAccessIterator first, RandomAccessIterator middle,
+                    RandomAccessIterator last, T*, Compare comp) {
+  make_heap(first, middle, comp);
+  for (RandomAccessIterator i = middle; i < last; ++i)
+    if (comp(*i, *first))
+      __pop_heap(first, middle, i, T(*i), comp, distance_type(first));
+  sort_heap(first, middle, comp);
+}
+
+template <class RandomAccessIterator, class Compare>
+inline void partial_sort(RandomAccessIterator first,
+                         RandomAccessIterator middle,
+                         RandomAccessIterator last, Compare comp) {
+  __partial_sort(first, middle, last, value_type(first), comp);
+}
+
+template <class InputIterator, class RandomAccessIterator, class Distance,
+          class T>
+RandomAccessIterator __partial_sort_copy(InputIterator first,
+                                         InputIterator last,
+                                         RandomAccessIterator result_first,
+                                         RandomAccessIterator result_last, 
+                                         Distance*, T*) {
+  if (result_first == result_last) return result_last;
+  RandomAccessIterator result_real_last = result_first;
+  while(first != last && result_real_last != result_last) {
+    *result_real_last = *first;
+    ++result_real_last;
+    ++first;
+  }
+  make_heap(result_first, result_real_last);
+  while (first != last) {
+    if (*first < *result_first) 
+      __adjust_heap(result_first, Distance(0),
+                    Distance(result_real_last - result_first), T(*first));
+    ++first;
+  }
+  sort_heap(result_first, result_real_last);
+  return result_real_last;
+}
+
+template <class InputIterator, class RandomAccessIterator>
+inline RandomAccessIterator
+partial_sort_copy(InputIterator first, InputIterator last,
+                  RandomAccessIterator result_first,
+                  RandomAccessIterator result_last) {
+  return __partial_sort_copy(first, last, result_first, result_last, 
+                             distance_type(result_first), value_type(first));
+}
+
+template <class InputIterator, class RandomAccessIterator, class Compare,
+          class Distance, class T>
+RandomAccessIterator __partial_sort_copy(InputIterator first,
+                                         InputIterator last,
+                                         RandomAccessIterator result_first,
+                                         RandomAccessIterator result_last,
+                                         Compare comp, Distance*, T*) {
+  if (result_first == result_last) return result_last;
+  RandomAccessIterator result_real_last = result_first;
+  while(first != last && result_real_last != result_last) {
+    *result_real_last = *first;
+    ++result_real_last;
+    ++first;
+  }
+  make_heap(result_first, result_real_last, comp);
+  while (first != last) {
+    if (comp(*first, *result_first))
+      __adjust_heap(result_first, Distance(0),
+                    Distance(result_real_last - result_first), T(*first),
+                    comp);
+    ++first;
+  }
+  sort_heap(result_first, result_real_last, comp);
+  return result_real_last;
+}
+
+template <class InputIterator, class RandomAccessIterator, class Compare>
+inline RandomAccessIterator
+partial_sort_copy(InputIterator first, InputIterator last,
+                  RandomAccessIterator result_first,
+                  RandomAccessIterator result_last, Compare comp) {
+  return __partial_sort_copy(first, last, result_first, result_last, comp,
+                             distance_type(result_first), value_type(first));
+}
+
+template <class RandomAccessIterator, class T>
+void __nth_element(RandomAccessIterator first, RandomAccessIterator nth,
+                   RandomAccessIterator last, T*) {
+  while (last - first > 3) {
+    RandomAccessIterator cut = __unguarded_partition
+      (first, last, T(__median(*first, *(first + (last - first)/2),
+                               *(last - 1))));
+    if (cut <= nth)
+      first = cut;
+    else 
+      last = cut;
+  }
+  __insertion_sort(first, last);
+}
+
+template <class RandomAccessIterator>
+inline void nth_element(RandomAccessIterator first, RandomAccessIterator nth,
+                        RandomAccessIterator last) {
+  __nth_element(first, nth, last, value_type(first));
+}
+
+template <class RandomAccessIterator, class T, class Compare>
+void __nth_element(RandomAccessIterator first, RandomAccessIterator nth,
+                   RandomAccessIterator last, T*, Compare comp) {
+  while (last - first > 3) {
+    RandomAccessIterator cut = __unguarded_partition
+      (first, last, T(__median(*first, *(first + (last - first)/2), 
+                               *(last - 1), comp)), comp);
+    if (cut <= nth)
+      first = cut;
+    else 
+      last = cut;
+  }
+  __insertion_sort(first, last, comp);
+}
+
+template <class RandomAccessIterator, class Compare>
+inline void nth_element(RandomAccessIterator first, RandomAccessIterator nth,
+                 RandomAccessIterator last, Compare comp) {
+  __nth_element(first, nth, last, value_type(first), comp);
+}
+
+template <class ForwardIterator, class T, class Distance>
+ForwardIterator __lower_bound(ForwardIterator first, ForwardIterator last,
+                              const T& value, Distance*,
+                              forward_iterator_tag) {
+  Distance len = 0;
+  distance(first, last, len);
+  Distance half;
+  ForwardIterator middle;
+
+  while (len > 0) {
+    half = len >> 1;
+    middle = first;
+    advance(middle, half);
+    if (*middle < value) {
+      first = middle;
+      ++first;
+      len = len - half - 1;
+    }
+    else
+      len = half;
+  }
+  return first;
+}
+
+template <class RandomAccessIterator, class T, class Distance>
+RandomAccessIterator __lower_bound(RandomAccessIterator first,
+                                   RandomAccessIterator last, const T& value,
+                                   Distance*, random_access_iterator_tag) {
+  Distance len = last - first;
+  Distance half;
+  RandomAccessIterator middle;
+
+  while (len > 0) {
+    half = len >> 1;
+    middle = first + half;
+    if (*middle < value) {
+      first = middle + 1;
+      len = len - half - 1;
+    }
+    else
+      len = half;
+  }
+  return first;
+}
+
+template <class ForwardIterator, class T>
+inline ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
+                                   const T& value) {
+  return __lower_bound(first, last, value, distance_type(first),
+                       iterator_category(first));
+}
+
+template <class ForwardIterator, class T, class Compare, class Distance>
+ForwardIterator __lower_bound(ForwardIterator first, ForwardIterator last,
+                              const T& value, Compare comp, Distance*,
+                              forward_iterator_tag) {
+  Distance len = 0;
+  distance(first, last, len);
+  Distance half;
+  ForwardIterator middle;
+
+  while (len > 0) {
+    half = len >> 1;
+    middle = first;
+    advance(middle, half);
+    if (comp(*middle, value)) {
+      first = middle;
+      ++first;
+      len = len - half - 1;
+    }
+    else
+      len = half;
+  }
+  return first;
+}
+
+template <class RandomAccessIterator, class T, class Compare, class Distance>
+RandomAccessIterator __lower_bound(RandomAccessIterator first,
+                                   RandomAccessIterator last,
+                                   const T& value, Compare comp, Distance*,
+                                   random_access_iterator_tag) {
+  Distance len = last - first;
+  Distance half;
+  RandomAccessIterator middle;
+
+  while (len > 0) {
+    half = len >> 1;
+    middle = first + half;
+    if (comp(*middle, value)) {
+      first = middle + 1;
+      len = len - half - 1;
+    }
+    else
+      len = half;
+  }
+  return first;
+}
+
+template <class ForwardIterator, class T, class Compare>
+inline ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
+                                   const T& value, Compare comp) {
+  return __lower_bound(first, last, value, comp, distance_type(first),
+                       iterator_category(first));
+}
+
+template <class ForwardIterator, class T, class Distance>
+ForwardIterator __upper_bound(ForwardIterator first, ForwardIterator last,
+                              const T& value, Distance*,
+                              forward_iterator_tag) {
+  Distance len = 0;
+  distance(first, last, len);
+  Distance half;
+  ForwardIterator middle;
+
+  while (len > 0) {
+    half = len >> 1;
+    middle = first;
+    advance(middle, half);
+    if (value < *middle)
+      len = half;
+    else {
+      first = middle;
+      ++first;
+      len = len - half - 1;
+    }
+  }
+  return first;
+}
+
+template <class RandomAccessIterator, class T, class Distance>
+RandomAccessIterator __upper_bound(RandomAccessIterator first,
+                                   RandomAccessIterator last, const T& value,
+                                   Distance*, random_access_iterator_tag) {
+  Distance len = last - first;
+  Distance half;
+  RandomAccessIterator middle;
+
+  while (len > 0) {
+    half = len >> 1;
+    middle = first + half;
+    if (value < *middle)
+      len = half;
+    else {
+      first = middle + 1;
+      len = len - half - 1;
+    }
+  }
+  return first;
+}
+
+template <class ForwardIterator, class T>
+inline ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,
+                                   const T& value) {
+  return __upper_bound(first, last, value, distance_type(first),
+                       iterator_category(first));
+}
+
+template <class ForwardIterator, class T, class Compare, class Distance>
+ForwardIterator __upper_bound(ForwardIterator first, ForwardIterator last,
+                              const T& value, Compare comp, Distance*,
+                              forward_iterator_tag) {
+  Distance len = 0;
+  distance(first, last, len);
+  Distance half;
+  ForwardIterator middle;
+
+  while (len > 0) {
+    half = len >> 1;
+    middle = first;
+    advance(middle, half);
+    if (comp(value, *middle))
+      len = half;
+    else {
+      first = middle;
+      ++first;
+      len = len - half - 1;
+    }
+  }
+  return first;
+}
+
+template <class RandomAccessIterator, class T, class Compare, class Distance>
+RandomAccessIterator __upper_bound(RandomAccessIterator first,
+                                   RandomAccessIterator last,
+                                   const T& value, Compare comp, Distance*,
+                                   random_access_iterator_tag) {
+  Distance len = last - first;
+  Distance half;
+  RandomAccessIterator middle;
+
+  while (len > 0) {
+    half = len >> 1;
+    middle = first + half;
+    if (comp(value, *middle))
+      len = half;
+    else {
+      first = middle + 1;
+      len = len - half - 1;
+    }
+  }
+  return first;
+}
+
+template <class ForwardIterator, class T, class Compare>
+inline ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,
+                                   const T& value, Compare comp) {
+  return __upper_bound(first, last, value, comp, distance_type(first),
+                       iterator_category(first));
+}
+
+template <class ForwardIterator, class T, class Distance>
+pair<ForwardIterator, ForwardIterator>
+__equal_range(ForwardIterator first, ForwardIterator last, const T& value,
+              Distance*, forward_iterator_tag) {
+  Distance len = 0;
+  distance(first, last, len);
+  Distance half;
+  ForwardIterator middle, left, right;
+
+  while (len > 0) {
+    half = len >> 1;
+    middle = first;
+    advance(middle, half);
+    if (*middle < value) {
+      first = middle;
+      ++first;
+      len = len - half - 1;
+    }
+    else if (value < *middle)
+      len = half;
+    else {
+      left = lower_bound(first, middle, value);
+      advance(first, len);
+      right = upper_bound(++middle, first, value);
+      return pair<ForwardIterator, ForwardIterator>(left, right);
+    }
+  }
+  return pair<ForwardIterator, ForwardIterator>(first, first);
+}
+
+template <class RandomAccessIterator, class T, class Distance>
+pair<RandomAccessIterator, RandomAccessIterator>
+__equal_range(RandomAccessIterator first, RandomAccessIterator last,
+              const T& value, Distance*, random_access_iterator_tag) {
+  Distance len = last - first;
+  Distance half;
+  RandomAccessIterator middle, left, right;
+
+  while (len > 0) {
+    half = len >> 1;
+    middle = first + half;
+    if (*middle < value) {
+      first = middle + 1;
+      len = len - half - 1;
+    }
+    else if (value < *middle)
+      len = half;
+    else {
+      left = lower_bound(first, middle, value);
+      right = upper_bound(++middle, first + len, value);
+      return pair<RandomAccessIterator, RandomAccessIterator>(left,
+                                                              right);
+    }
+  }
+  return pair<RandomAccessIterator, RandomAccessIterator>(first, first);
+}
+
+template <class ForwardIterator, class T>
+inline pair<ForwardIterator, ForwardIterator>
+equal_range(ForwardIterator first, ForwardIterator last, const T& value) {
+  return __equal_range(first, last, value, distance_type(first),
+                       iterator_category(first));
+}
+
+template <class ForwardIterator, class T, class Compare, class Distance>
+pair<ForwardIterator, ForwardIterator>
+__equal_range(ForwardIterator first, ForwardIterator last, const T& value,
+              Compare comp, Distance*, forward_iterator_tag) {
+  Distance len = 0;
+  distance(first, last, len);
+  Distance half;
+  ForwardIterator middle, left, right;
+
+  while (len > 0) {
+    half = len >> 1;
+    middle = first;
+    advance(middle, half);
+    if (comp(*middle, value)) {
+      first = middle;
+      ++first;
+      len = len - half - 1;
+    }
+    else if (comp(value, *middle))
+      len = half;
+    else {
+      left = lower_bound(first, middle, value, comp);
+      advance(first, len);
+      right = upper_bound(++middle, first, value, comp);
+      return pair<ForwardIterator, ForwardIterator>(left, right);
+    }
+  }
+  return pair<ForwardIterator, ForwardIterator>(first, first);
+}           
+
+template <class RandomAccessIterator, class T, class Compare, class Distance>
+pair<RandomAccessIterator, RandomAccessIterator>
+__equal_range(RandomAccessIterator first, RandomAccessIterator last,
+              const T& value, Compare comp, Distance*,
+              random_access_iterator_tag) {
+  Distance len = last - first;
+  Distance half;
+  RandomAccessIterator middle, left, right;
+
+  while (len > 0) {
+    half = len >> 1;
+    middle = first + half;
+    if (comp(*middle, value)) {
+      first = middle + 1;
+      len = len - half - 1;
+    }
+    else if (comp(value, *middle))
+      len = half;
+    else {
+      left = lower_bound(first, middle, value, comp);
+      right = upper_bound(++middle, first + len, value, comp);
+      return pair<RandomAccessIterator, RandomAccessIterator>(left,
+                                                              right);
+    }
+  }
+  return pair<RandomAccessIterator, RandomAccessIterator>(first, first);
+}           
+
+template <class ForwardIterator, class T, class Compare>
+inline pair<ForwardIterator, ForwardIterator>
+equal_range(ForwardIterator first, ForwardIterator last, const T& value,
+            Compare comp) {
+  return __equal_range(first, last, value, comp, distance_type(first),
+                       iterator_category(first));
+}    
+
+template <class ForwardIterator, class T>
+bool binary_search(ForwardIterator first, ForwardIterator last,
+                   const T& value) {
+  ForwardIterator i = lower_bound(first, last, value);
+  return i != last && !(value < *i);
+}
+
+template <class ForwardIterator, class T, class Compare>
+bool binary_search(ForwardIterator first, ForwardIterator last, const T& value,
+                   Compare comp) {
+  ForwardIterator i = lower_bound(first, last, value, comp);
+  return i != last && !comp(value, *i);
+}
+
+template <class InputIterator1, class InputIterator2, class OutputIterator>
+OutputIterator merge(InputIterator1 first1, InputIterator1 last1,
+                     InputIterator2 first2, InputIterator2 last2,
+                     OutputIterator result) {
+  while (first1 != last1 && first2 != last2) {
+    if (*first2 < *first1) {
+      *result = *first2;
+      ++first2;
+    }
+    else {
+      *result = *first1;
+      ++first1;
+    }
+    ++result;
+  }
+  return copy(first2, last2, copy(first1, last1, result));
+}
+
+template <class InputIterator1, class InputIterator2, class OutputIterator,
+          class Compare>
+OutputIterator merge(InputIterator1 first1, InputIterator1 last1,
+                     InputIterator2 first2, InputIterator2 last2,
+                     OutputIterator result, Compare comp) {
+  while (first1 != last1 && first2 != last2) {
+    if (comp(*first2, *first1)) {
+      *result = *first2;
+      ++first2;
+    }
+    else {
+      *result = *first1;
+      ++first1;
+    }
+    ++result;
+  }
+  return copy(first2, last2, copy(first1, last1, result));
+}
+
+template <class BidirectionalIterator, class Distance>
+void __merge_without_buffer(BidirectionalIterator first,
+                            BidirectionalIterator middle,
+                            BidirectionalIterator last,
+                            Distance len1, Distance len2) {
+  if (len1 == 0 || len2 == 0) return;
+  if (len1 + len2 == 2) {
+    if (*middle < *first) iter_swap(first, middle);
+    return;
+  }
+  BidirectionalIterator first_cut = first;
+  BidirectionalIterator second_cut = middle;
+  Distance len11 = 0;
+  Distance len22 = 0;
+  if (len1 > len2) {
+    len11 = len1 / 2;
+    advance(first_cut, len11);
+    second_cut = lower_bound(middle, last, *first_cut);
+    distance(middle, second_cut, len22);
+  }
+  else {
+    len22 = len2 / 2;
+    advance(second_cut, len22);
+    first_cut = upper_bound(first, middle, *second_cut);
+    distance(first, first_cut, len11);
+  }
+  rotate(first_cut, middle, second_cut);
+  BidirectionalIterator new_middle = first_cut;
+  advance(new_middle, len22);
+  __merge_without_buffer(first, first_cut, new_middle, len11, len22);
+  __merge_without_buffer(new_middle, second_cut, last, len1 - len11,
+                         len2 - len22);
+}
+
+template <class BidirectionalIterator, class Distance, class Compare>
+void __merge_without_buffer(BidirectionalIterator first,
+                            BidirectionalIterator middle,
+                            BidirectionalIterator last,
+                            Distance len1, Distance len2, Compare comp) {
+  if (len1 == 0 || len2 == 0) return;
+  if (len1 + len2 == 2) {
+    if (comp(*middle, *first)) iter_swap(first, middle);
+    return;
+  }
+  BidirectionalIterator first_cut = first;
+  BidirectionalIterator second_cut = middle;
+  Distance len11 = 0;
+  Distance len22 = 0;
+  if (len1 > len2) {
+    len11 = len1 / 2;
+    advance(first_cut, len11);
+    second_cut = lower_bound(middle, last, *first_cut, comp);
+    distance(middle, second_cut, len22);
+  }
+  else {
+    len22 = len2 / 2;
+    advance(second_cut, len22);
+    first_cut = upper_bound(first, middle, *second_cut, comp);
+    distance(first, first_cut, len11);
+  }
+  rotate(first_cut, middle, second_cut);
+  BidirectionalIterator new_middle = first_cut;
+  advance(new_middle, len22);
+  __merge_without_buffer(first, first_cut, new_middle, len11, len22, comp);
+  __merge_without_buffer(new_middle, second_cut, last, len1 - len11,
+                         len2 - len22, comp);
+}
+
+template <class BidirectionalIterator1, class BidirectionalIterator2,
+          class Distance>
+BidirectionalIterator1 __rotate_adaptive(BidirectionalIterator1 first,
+                                         BidirectionalIterator1 middle,
+                                         BidirectionalIterator1 last,
+                                         Distance len1, Distance len2,
+                                         BidirectionalIterator2 buffer,
+                                         Distance buffer_size) {
+  BidirectionalIterator2 buffer_end;
+  if (len1 > len2 && len2 <= buffer_size) {
+    buffer_end = copy(middle, last, buffer);
+    copy_backward(first, middle, last);
+    return copy(buffer, buffer_end, first);
+  } else if (len1 <= buffer_size) {
+    buffer_end = copy(first, middle, buffer);
+    copy(middle, last, first);
+    return copy_backward(buffer, buffer_end, last);
+  } else  {
+    rotate(first, middle, last);
+    advance(first, len2);
+    return first;
+  }
+}
+
+template <class BidirectionalIterator1, class BidirectionalIterator2,
+          class BidirectionalIterator3>
+BidirectionalIterator3 __merge_backward(BidirectionalIterator1 first1,
+                                        BidirectionalIterator1 last1,
+                                        BidirectionalIterator2 first2,
+                                        BidirectionalIterator2 last2,
+                                        BidirectionalIterator3 result) {
+  if (first1 == last1) return copy_backward(first2, last2, result);
+  if (first2 == last2) return copy_backward(first1, last1, result);
+  --last1;
+  --last2;
+  while (true) {
+    if (*last2 < *last1) {
+      *--result = *last1;
+      if (first1 == last1) return copy_backward(first2, ++last2, result);
+      --last1;
+    }
+    else {
+      *--result = *last2;
+      if (first2 == last2) return copy_backward(first1, ++last1, result);
+      --last2;
+    }
+  }
+}
+
+template <class BidirectionalIterator1, class BidirectionalIterator2,
+          class BidirectionalIterator3, class Compare>
+BidirectionalIterator3 __merge_backward(BidirectionalIterator1 first1,
+                                        BidirectionalIterator1 last1,
+                                        BidirectionalIterator2 first2,
+                                        BidirectionalIterator2 last2,
+                                        BidirectionalIterator3 result,
+                                        Compare comp) {
+  if (first1 == last1) return copy_backward(first2, last2, result);
+  if (first2 == last2) return copy_backward(first1, last1, result);
+  --last1;
+  --last2;
+  while (true) {
+    if (comp(*last2, *last1)) {
+      *--result = *last1;
+      if (first1 == last1) return copy_backward(first2, ++last2, result);
+      --last1;
+    }
+    else {
+      *--result = *last2;
+      if (first2 == last2) return copy_backward(first1, ++last1, result);
+      --last2;
+    }
+  }
+}
+
+template <class BidirectionalIterator, class Distance, class Pointer>
+void __merge_adaptive(BidirectionalIterator first, 
+                      BidirectionalIterator middle, 
+                      BidirectionalIterator last, Distance len1, Distance len2,
+                      Pointer buffer, Distance buffer_size) {
+  if (len1 <= len2 && len1 <= buffer_size) {
+    Pointer end_buffer = copy(first, middle, buffer);
+    merge(buffer, end_buffer, middle, last, first);
+  }
+  else if (len2 <= buffer_size) {
+    Pointer end_buffer = copy(middle, last, buffer);
+    __merge_backward(first, middle, buffer, end_buffer, last);
+  }
+  else {
+    BidirectionalIterator first_cut = first;
+    BidirectionalIterator second_cut = middle;
+    Distance len11 = 0;
+    Distance len22 = 0;
+    if (len1 > len2) {
+      len11 = len1 / 2;
+      advance(first_cut, len11);
+      second_cut = lower_bound(middle, last, *first_cut);
+      distance(middle, second_cut, len22);   
+    }
+    else {
+      len22 = len2 / 2;
+      advance(second_cut, len22);
+      first_cut = upper_bound(first, middle, *second_cut);
+      distance(first, first_cut, len11);
+    }
+    BidirectionalIterator new_middle =
+      __rotate_adaptive(first_cut, middle, second_cut, len1 - len11,
+                        len22, buffer, buffer_size);
+    __merge_adaptive(first, first_cut, new_middle, len11, len22, buffer,
+                     buffer_size);
+    __merge_adaptive(new_middle, second_cut, last, len1 - len11,
+                     len2 - len22, buffer, buffer_size);
+  }
+}
+
+template <class BidirectionalIterator, class Distance, class Pointer,
+          class Compare>
+void __merge_adaptive(BidirectionalIterator first, 
+                      BidirectionalIterator middle, 
+                      BidirectionalIterator last, Distance len1, Distance len2,
+                      Pointer buffer, Distance buffer_size, Compare comp) {
+  if (len1 <= len2 && len1 <= buffer_size) {
+    Pointer end_buffer = copy(first, middle, buffer);
+    merge(buffer, end_buffer, middle, last, first, comp);
+  }
+  else if (len2 <= buffer_size) {
+    Pointer end_buffer = copy(middle, last, buffer);
+    __merge_backward(first, middle, buffer, end_buffer, last, comp);
+  }
+  else {
+    BidirectionalIterator first_cut = first;
+    BidirectionalIterator second_cut = middle;
+    Distance len11 = 0;
+    Distance len22 = 0;
+    if (len1 > len2) {
+      len11 = len1 / 2;
+      advance(first_cut, len11);
+      second_cut = lower_bound(middle, last, *first_cut, comp);
+      distance(middle, second_cut, len22);   
+    }
+    else {
+      len22 = len2 / 2;
+      advance(second_cut, len22);
+      first_cut = upper_bound(first, middle, *second_cut, comp);
+      distance(first, first_cut, len11);
+    }
+    BidirectionalIterator new_middle =
+      __rotate_adaptive(first_cut, middle, second_cut, len1 - len11,
+                        len22, buffer, buffer_size);
+    __merge_adaptive(first, first_cut, new_middle, len11, len22, buffer,
+                     buffer_size, comp);
+    __merge_adaptive(new_middle, second_cut, last, len1 - len11,
+                     len2 - len22, buffer, buffer_size, comp);
+  }
+}
+
+template <class BidirectionalIterator, class T, class Distance>
+inline void __inplace_merge_aux(BidirectionalIterator first,
+                                BidirectionalIterator middle,
+                                BidirectionalIterator last, T*, Distance*) {
+  Distance len1 = 0;
+  distance(first, middle, len1);
+  Distance len2 = 0;
+  distance(middle, last, len2);
+
+  temporary_buffer<BidirectionalIterator, T> buf(first, last);
+  if (buf.begin() == 0)
+    __merge_without_buffer(first, middle, last, len1, len2);
+  else
+    __merge_adaptive(first, middle, last, len1, len2,
+                     buf.begin(), Distance(buf.size()));
+}
+
+template <class BidirectionalIterator, class T, class Distance, class Compare>
+inline void __inplace_merge_aux(BidirectionalIterator first,
+                                BidirectionalIterator middle,
+                                BidirectionalIterator last, T*, Distance*,
+                                Compare comp) {
+  Distance len1 = 0;
+  distance(first, middle, len1);
+  Distance len2 = 0;
+  distance(middle, last, len2);
+
+  temporary_buffer<BidirectionalIterator, T> buf(first, last);
+  if (buf.begin() == 0)
+    __merge_without_buffer(first, middle, last, len1, len2, comp);
+  else
+    __merge_adaptive(first, middle, last, len1, len2,
+                     buf.begin(), Distance(buf.size()),
+                     comp);
+}
+
+template <class BidirectionalIterator>
+inline void inplace_merge(BidirectionalIterator first,
+                          BidirectionalIterator middle,
+                          BidirectionalIterator last) {
+  if (first == middle || middle == last) return;
+  __inplace_merge_aux(first, middle, last, value_type(first),
+                      distance_type(first));
+}
+
+template <class BidirectionalIterator, class Compare>
+inline void inplace_merge(BidirectionalIterator first,
+                          BidirectionalIterator middle,
+                          BidirectionalIterator last, Compare comp) {
+  if (first == middle || middle == last) return;
+  __inplace_merge_aux(first, middle, last, value_type(first),
+                      distance_type(first), comp);
+}
+
+template <class InputIterator1, class InputIterator2>
+bool includes(InputIterator1 first1, InputIterator1 last1,
+              InputIterator2 first2, InputIterator2 last2) {
+  while (first1 != last1 && first2 != last2)
+    if (*first2 < *first1)
+      return false;
+    else if(*first1 < *first2) 
+      ++first1;
+    else
+      ++first1, ++first2;
+
+  return first2 == last2;
+}
+
+template <class InputIterator1, class InputIterator2, class Compare>
+bool includes(InputIterator1 first1, InputIterator1 last1,
+              InputIterator2 first2, InputIterator2 last2, Compare comp) {
+  while (first1 != last1 && first2 != last2)
+    if (comp(*first2, *first1))
+      return false;
+    else if(comp(*first1, *first2)) 
+      ++first1;
+    else
+      ++first1, ++first2;
+
+  return first2 == last2;
+}
+
+template <class InputIterator1, class InputIterator2, class OutputIterator>
+OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
+                         InputIterator2 first2, InputIterator2 last2,
+                         OutputIterator result) {
+  while (first1 != last1 && first2 != last2) {
+    if (*first1 < *first2) {
+      *result = *first1;
+      ++first1;
+    }
+    else if (*first2 < *first1) {
+      *result = *first2;
+      ++first2;
+    }
+    else {
+      *result = *first1;
+      ++first1;
+      ++first2;
+    }
+    ++result;
+  }
+  return copy(first2, last2, copy(first1, last1, result));
+}
+
+template <class InputIterator1, class InputIterator2, class OutputIterator,
+          class Compare>
+OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
+                         InputIterator2 first2, InputIterator2 last2,
+                         OutputIterator result, Compare comp) {
+  while (first1 != last1 && first2 != last2) {
+    if (comp(*first1, *first2)) {
+      *result = *first1;
+      ++first1;
+    }
+    else if (comp(*first2, *first1)) {
+      *result = *first2;
+      ++first2;
+    }
+    else {
+      *result = *first1;
+      ++first1;
+      ++first2;
+    }
+    ++result;
+  }
+  return copy(first2, last2, copy(first1, last1, result));
+}
+
+template <class InputIterator1, class InputIterator2, class OutputIterator>
+OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,
+                                InputIterator2 first2, InputIterator2 last2,
+                                OutputIterator result) {
+  while (first1 != last1 && first2 != last2) 
+    if (*first1 < *first2) 
+      ++first1;
+    else if (*first2 < *first1) 
+      ++first2;
+    else {
+      *result = *first1;
+      ++first1;
+      ++first2;
+      ++result;
+    }
+  return result;
+}
+
+template <class InputIterator1, class InputIterator2, class OutputIterator,
+          class Compare>
+OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,
+                                InputIterator2 first2, InputIterator2 last2,
+                                OutputIterator result, Compare comp) {
+  while (first1 != last1 && first2 != last2)
+    if (comp(*first1, *first2))
+      ++first1;
+    else if (comp(*first2, *first1))
+      ++first2;
+    else {
+      *result = *first1;
+      ++first1;
+      ++first2;
+      ++result;
+    }
+  return result;
+}
+
+template <class InputIterator1, class InputIterator2, class OutputIterator>
+OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1,
+                              InputIterator2 first2, InputIterator2 last2,
+                              OutputIterator result) {
+  while (first1 != last1 && first2 != last2)
+    if (*first1 < *first2) {
+      *result = *first1;
+      ++first1;
+      ++result;
+    }
+    else if (*first2 < *first1)
+      ++first2;
+    else {
+      ++first1;
+      ++first2;
+    }
+  return copy(first1, last1, result);
+}
+
+template <class InputIterator1, class InputIterator2, class OutputIterator, 
+          class Compare>
+OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1,
+                              InputIterator2 first2, InputIterator2 last2, 
+                              OutputIterator result, Compare comp) {
+  while (first1 != last1 && first2 != last2)
+    if (comp(*first1, *first2)) {
+      *result = *first1;
+      ++first1;
+      ++result;
+    }
+    else if (comp(*first2, *first1))
+      ++first2;
+    else {
+      ++first1;
+      ++first2;
+    }
+  return copy(first1, last1, result);
+}
+
+template <class InputIterator1, class InputIterator2, class OutputIterator>
+OutputIterator set_symmetric_difference(InputIterator1 first1,
+                                        InputIterator1 last1,
+                                        InputIterator2 first2,
+                                        InputIterator2 last2,
+                                        OutputIterator result) {
+  while (first1 != last1 && first2 != last2)
+    if (*first1 < *first2) {
+      *result = *first1;
+      ++first1;
+      ++result;
+    }
+    else if (*first2 < *first1) {
+      *result = *first2;
+      ++first2;
+      ++result;
+    }
+    else {
+      ++first1;
+      ++first2;
+    }
+  return copy(first2, last2, copy(first1, last1, result));
+}
+
+template <class InputIterator1, class InputIterator2, class OutputIterator,
+          class Compare>
+OutputIterator set_symmetric_difference(InputIterator1 first1,
+                                        InputIterator1 last1,
+                                        InputIterator2 first2,
+                                        InputIterator2 last2,
+                                        OutputIterator result, Compare comp) {
+  while (first1 != last1 && first2 != last2)
+    if (comp(*first1, *first2)) {
+      *result = *first1;
+      ++first1;
+      ++result;
+    }
+    else if (comp(*first2, *first1)) {
+      *result = *first2;
+      ++first2;
+      ++result;
+    }
+    else {
+      ++first1;
+      ++first2;
+    }
+  return copy(first2, last2, copy(first1, last1, result));
+}
+
+template <class ForwardIterator>
+ForwardIterator max_element(ForwardIterator first, ForwardIterator last) {
+  if (first == last) return first;
+  ForwardIterator result = first;
+  while (++first != last) 
+    if (*result < *first) result = first;
+  return result;
+}
+
+template <class ForwardIterator, class Compare>
+ForwardIterator max_element(ForwardIterator first, ForwardIterator last,
+                            Compare comp) {
+  if (first == last) return first;
+  ForwardIterator result = first;
+  while (++first != last) 
+    if (comp(*result, *first)) result = first;
+  return result;
+}
+
+template <class ForwardIterator>
+ForwardIterator min_element(ForwardIterator first, ForwardIterator last) {
+  if (first == last) return first;
+  ForwardIterator result = first;
+  while (++first != last) 
+    if (*first < *result) result = first;
+  return result;
+}
+
+template <class ForwardIterator, class Compare>
+ForwardIterator min_element(ForwardIterator first, ForwardIterator last,
+                            Compare comp) {
+  if (first == last) return first;
+  ForwardIterator result = first;
+  while (++first != last) 
+    if (comp(*first, *result)) result = first;
+  return result;
+}
+
+template <class BidirectionalIterator>
+bool next_permutation(BidirectionalIterator first,
+                      BidirectionalIterator last) {
+  if (first == last) return false;
+  BidirectionalIterator i = first;
+  ++i;
+  if (i == last) return false;
+  i = last;
+  --i;
+
+  for(;;) {
+    BidirectionalIterator ii = i;
+    --i;
+    if (*i < *ii) {
+      BidirectionalIterator j = last;
+      while (!(*i < *--j));
+      iter_swap(i, j);
+      reverse(ii, last);
+      return true;
+    }
+    if (i == first) {
+      reverse(first, last);
+      return false;
+    }
+  }
+}
+
+template <class BidirectionalIterator, class Compare>
+bool next_permutation(BidirectionalIterator first, BidirectionalIterator last,
+                      Compare comp) {
+  if (first == last) return false;
+  BidirectionalIterator i = first;
+  ++i;
+  if (i == last) return false;
+  i = last;
+  --i;
+
+  for(;;) {
+    BidirectionalIterator ii = i;
+    --i;
+    if (comp(*i, *ii)) {
+      BidirectionalIterator j = last;
+      while (!comp(*i, *--j));
+      iter_swap(i, j);
+      reverse(ii, last);
+      return true;
+    }
+    if (i == first) {
+      reverse(first, last);
+      return false;
+    }
+  }
+}
+
+template <class BidirectionalIterator>
+bool prev_permutation(BidirectionalIterator first,
+                      BidirectionalIterator last) {
+  if (first == last) return false;
+  BidirectionalIterator i = first;
+  ++i;
+  if (i == last) return false;
+  i = last;
+  --i;
+
+  for(;;) {
+    BidirectionalIterator ii = i;
+    --i;
+    if (*ii < *i) {
+      BidirectionalIterator j = last;
+      while (!(*--j < *i));
+      iter_swap(i, j);
+      reverse(ii, last);
+      return true;
+    }
+    if (i == first) {
+      reverse(first, last);
+      return false;
+    }
+  }
+}
+
+template <class BidirectionalIterator, class Compare>
+bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last,
+                      Compare comp) {
+  if (first == last) return false;
+  BidirectionalIterator i = first;
+  ++i;
+  if (i == last) return false;
+  i = last;
+  --i;
+
+  for(;;) {
+    BidirectionalIterator ii = i;
+    --i;
+    if (comp(*ii, *i)) {
+      BidirectionalIterator j = last;
+      while (!comp(*--j, *i));
+      iter_swap(i, j);
+      reverse(ii, last);
+      return true;
+    }
+    if (i == first) {
+      reverse(first, last);
+      return false;
+    }
+  }
+}
+
+template <class InputIterator, class ForwardIterator>
+InputIterator find_first_of(InputIterator first1, InputIterator last1,
+                            ForwardIterator first2, ForwardIterator last2)
+{
+  for ( ; first1 != last1; ++first1) 
+    for (ForwardIterator iter = first2; iter != last2; ++iter)
+      if (*first1 == *iter)
+        return first1;
+  return last1;
+}
+
+template <class InputIterator, class ForwardIterator, class BinaryPredicate>
+InputIterator find_first_of(InputIterator first1, InputIterator last1,
+                            ForwardIterator first2, ForwardIterator last2,
+                            BinaryPredicate comp)
+{
+  for ( ; first1 != last1; ++first1) 
+    for (ForwardIterator iter = first2; iter != last2; ++iter)
+      if (comp(*first1, *iter))
+        return first1;
+  return last1;
+}
+
+
+// Search [first2, last2) as a subsequence in [first1, last1).
+
+// find_end for forward iterators. 
+template <class ForwardIterator1, class ForwardIterator2>
+ForwardIterator1 __find_end(ForwardIterator1 first1, ForwardIterator1 last1,
+                            ForwardIterator2 first2, ForwardIterator2 last2,
+                            forward_iterator_tag, forward_iterator_tag)
+{
+  if (first2 == last2)
+    return last1;
+  else {
+    ForwardIterator1 result = last1;
+    while (1) {
+      ForwardIterator1 new_result = search(first1, last1, first2, last2);
+      if (new_result == last1)
+        return result;
+      else {
+        result = new_result;
+        first1 = new_result;
+        ++first1;
+      }
+    }
+  }
+}
+
+template <class ForwardIterator1, class ForwardIterator2,
+          class BinaryPredicate>
+ForwardIterator1 __find_end(ForwardIterator1 first1, ForwardIterator1 last1,
+                            ForwardIterator2 first2, ForwardIterator2 last2,
+                            forward_iterator_tag, forward_iterator_tag,
+                            BinaryPredicate comp)
+{
+  if (first2 == last2)
+    return last1;
+  else {
+    ForwardIterator1 result = last1;
+    while (1) {
+      ForwardIterator1 new_result = search(first1, last1, first2, last2, comp);
+      if (new_result == last1)
+        return result;
+      else {
+        result = new_result;
+        first1 = new_result;
+        ++first1;
+      }
+    }
+  }
+}
+
+// find_end for bidirectional iterators.  Requires partial specialization.
+#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+template <class BidirectionalIterator1, class BidirectionalIterator2>
+BidirectionalIterator1
+__find_end(BidirectionalIterator1 first1, BidirectionalIterator1 last1,
+           BidirectionalIterator2 first2, BidirectionalIterator2 last2,
+           bidirectional_iterator_tag, bidirectional_iterator_tag)
+{
+  typedef reverse_iterator<BidirectionalIterator1> reviter1;
+  typedef reverse_iterator<BidirectionalIterator2> reviter2;
+
+  reviter1 rlast1(first1);
+  reviter2 rlast2(first2);
+  reviter1 rresult = search(reviter1(last1), rlast1, reviter2(last2), rlast2);
+
+  if (rresult == rlast1)
+    return last1;
+  else {
+    BidirectionalIterator1 result = rresult.base();
+    advance(result, -distance(first2, last2));
+    return result;
+  }
+}
+
+template <class BidirectionalIterator1, class BidirectionalIterator2,
+          class BinaryPredicate>
+BidirectionalIterator1
+__find_end(BidirectionalIterator1 first1, BidirectionalIterator1 last1,
+           BidirectionalIterator2 first2, BidirectionalIterator2 last2,
+           bidirectional_iterator_tag, bidirectional_iterator_tag, 
+           BinaryPredicate comp)
+{
+  typedef reverse_iterator<BidirectionalIterator1> reviter1;
+  typedef reverse_iterator<BidirectionalIterator2> reviter2;
+
+  reviter1 rlast1(first1);
+  reviter2 rlast2(first2);
+  reviter1 rresult = search(reviter1(last1), rlast1, reviter2(last2), rlast2,
+                            comp);
+
+  if (rresult == rlast1)
+    return last1;
+  else {
+    BidirectionalIterator1 result = rresult.base();
+    advance(result, -distance(first2, last2));
+    return result;
+  }
+}
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+// Dispatching functions.
+
+template <class ForwardIterator1, class ForwardIterator2>
+inline ForwardIterator1 
+find_end(ForwardIterator1 first1, ForwardIterator1 last1, 
+         ForwardIterator2 first2, ForwardIterator2 last2)
+{
+#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
+  typedef typename iterator_traits<ForwardIterator1>::iterator_category
+          category1;
+  typedef typename iterator_traits<ForwardIterator2>::iterator_category
+          category2;
+  return __find_end(first1, last1, first2, last2, category1(), category2());
+#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+  return __find_end(first1, last1, first2, last2,
+                    forward_iterator_tag(), forward_iterator_tag());
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+}
+
+template <class ForwardIterator1, class ForwardIterator2, 
+          class BinaryPredicate>
+inline ForwardIterator1 
+find_end(ForwardIterator1 first1, ForwardIterator1 last1, 
+         ForwardIterator2 first2, ForwardIterator2 last2,
+         BinaryPredicate comp)
+{
+#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
+  typedef typename iterator_traits<ForwardIterator1>::iterator_category
+          category1;
+  typedef typename iterator_traits<ForwardIterator2>::iterator_category
+          category2;
+  return __find_end(first1, last1, first2, last2, category1(), category2(),
+                    comp);
+#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+  return __find_end(first1, last1, first2, last2,
+                    forward_iterator_tag(), forward_iterator_tag(),
+                    comp);
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+}
+
+template <class RandomAccessIterator, class Distance>
+bool __is_heap(RandomAccessIterator first, RandomAccessIterator last,
+               Distance*)
+{
+  const Distance n = last - first;
+
+  Distance parent = 0;
+  for (Distance child = 1; child < n; ++child) {
+    if (first[parent] < first[child]) 
+      return false;
+    if (child & 1 == 0)
+      ++parent;
+  }
+  return true;
+}
+
+template <class RandomAccessIterator>
+inline bool is_heap(RandomAccessIterator first, RandomAccessIterator last)
+{
+  return __is_heap(first, last, distance_type(first));
+}
+
+
+template <class RandomAccessIterator, class Distance, class StrictWeakOrdering>
+bool __is_heap(RandomAccessIterator first, RandomAccessIterator last,
+               StrictWeakOrdering comp,
+               Distance*)
+{
+  const Distance n = last - first;
+
+  Distance parent = 0;
+  for (Distance child = 1; child < n; ++child) {
+    if (comp(first[parent], first[child]))
+      return false;
+    if (child & 1 == 0)
+      ++parent;
+  }
+  return true;
+}
+
+template <class RandomAccessIterator, class StrictWeakOrdering>
+inline bool is_heap(RandomAccessIterator first, RandomAccessIterator last,
+                    StrictWeakOrdering comp)
+{
+  return __is_heap(first, last, comp, distance_type(first));
+}
+
+
+template <class ForwardIterator>
+bool is_sorted(ForwardIterator first, ForwardIterator last)
+{
+  if (first == last)
+    return true;
+
+  ForwardIterator next = first;
+  for (++next; next != last; first = next, ++next) {
+    if (*next < *first)
+      return false;
+  }
+
+  return true;
+}
+
+template <class ForwardIterator, class StrictWeakOrdering>
+bool is_sorted(ForwardIterator first, ForwardIterator last,
+               StrictWeakOrdering comp)
+{
+  if (first == last)
+    return true;
+
+  ForwardIterator next = first;
+  for (++next; next != last; first = next, ++next) {
+    if (comp(*next, *first))
+      return false;
+  }
+
+  return true;
+}
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1209
+#endif
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_ALGO_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_algobase.h b/libstdc++/stl/stl_algobase.h
new file mode 100644 (file)
index 0000000..668baad
--- /dev/null
@@ -0,0 +1,439 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+
+#ifndef __SGI_STL_INTERNAL_ALGOBASE_H
+#define __SGI_STL_INTERNAL_ALGOBASE_H
+
+#ifndef __STL_CONFIG_H
+#include <stl_config.h>
+#endif
+#ifndef __SGI_STL_INTERNAL_RELOPS
+#include <stl_relops.h>
+#endif
+#ifndef __SGI_STL_INTERNAL_PAIR_H
+#include <stl_pair.h>
+#endif
+#ifndef __TYPE_TRAITS_H_
+#include <type_traits.h>
+#endif
+
+#include <string.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <new.h>
+#include <iostream.h>
+
+#ifndef __SGI_STL_INTERNAL_ITERATOR_H
+#include <stl_iterator.h>
+#endif
+
+__STL_BEGIN_NAMESPACE
+
+template <class ForwardIterator1, class ForwardIterator2, class T>
+inline void __iter_swap(ForwardIterator1 a, ForwardIterator2 b, T*) {
+  T tmp = *a;
+  *a = *b;
+  *b = tmp;
+}
+
+template <class ForwardIterator1, class ForwardIterator2>
+inline void iter_swap(ForwardIterator1 a, ForwardIterator2 b) {
+  __iter_swap(a, b, value_type(a));
+}
+
+template <class T>
+inline void swap(T& a, T& b) {
+  T tmp = a;
+  a = b;
+  b = tmp;
+}
+
+#ifndef __BORLANDC__
+
+template <class T>
+inline const T& min(const T& a, const T& b) {
+  return b < a ? b : a;
+}
+
+template <class T>
+inline const T& max(const T& a, const T& b) {
+  return  a < b ? b : a;
+}
+
+#endif /* __BORLANDC__ */
+
+template <class T, class Compare>
+inline const T& min(const T& a, const T& b, Compare comp) {
+  return comp(b, a) ? b : a;
+}
+
+template <class T, class Compare>
+inline const T& max(const T& a, const T& b, Compare comp) {
+  return comp(a, b) ? b : a;
+}
+
+template <class InputIterator, class OutputIterator>
+inline OutputIterator __copy(InputIterator first, InputIterator last,
+                             OutputIterator result, input_iterator_tag)
+{
+  for ( ; first != last; ++result, ++first)
+    *result = *first;
+  return result;
+}
+
+template <class RandomAccessIterator, class OutputIterator, class Distance>
+inline OutputIterator
+__copy_d(RandomAccessIterator first, RandomAccessIterator last,
+         OutputIterator result, Distance*)
+{
+  for (Distance n = last - first; n > 0; --n, ++result, ++first) 
+    *result = *first;
+  return result;
+}
+
+template <class RandomAccessIterator, class OutputIterator>
+inline OutputIterator 
+__copy(RandomAccessIterator first, RandomAccessIterator last,
+       OutputIterator result, random_access_iterator_tag)
+{
+  return __copy_d(first, last, result, distance_type(first));
+}
+
+template <class InputIterator, class OutputIterator>
+struct __copy_dispatch
+{
+  OutputIterator operator()(InputIterator first, InputIterator last,
+                            OutputIterator result) {
+    return __copy(first, last, result, iterator_category(first));
+  }
+};
+
+#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION 
+
+template <class T>
+inline T* __copy_t(const T* first, const T* last, T* result, __true_type) {
+  memmove(result, first, sizeof(T) * (last - first));
+  return result + (last - first);
+}
+
+template <class T>
+inline T* __copy_t(const T* first, const T* last, T* result, __false_type) {
+  return __copy_d(first, last, result, (ptrdiff_t*) 0);
+}
+
+template <class T>
+struct __copy_dispatch<T*, T*>
+{
+  T* operator()(T* first, T* last, T* result) {
+    typedef typename __type_traits<T>::has_trivial_assignment_operator t; 
+    return __copy_t(first, last, result, t());
+  }
+};
+
+template <class T>
+struct __copy_dispatch<const T*, T*>
+{
+  T* operator()(const T* first, const T* last, T* result) {
+    typedef typename __type_traits<T>::has_trivial_assignment_operator t; 
+    return __copy_t(first, last, result, t());
+  }
+};
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+template <class InputIterator, class OutputIterator>
+inline OutputIterator copy(InputIterator first, InputIterator last,
+                           OutputIterator result)
+{
+  return __copy_dispatch<InputIterator,OutputIterator>()(first, last, result);
+}
+
+inline char* copy(const char* first, const char* last, char* result) {
+  memmove(result, first, last - first);
+  return result + (last - first);
+}
+
+inline wchar_t* copy(const wchar_t* first, const wchar_t* last,
+                     wchar_t* result) {
+  memmove(result, first, sizeof(wchar_t) * (last - first));
+  return result + (last - first);
+}
+
+template <class BidirectionalIterator1, class BidirectionalIterator2>
+inline BidirectionalIterator2 __copy_backward(BidirectionalIterator1 first, 
+                                              BidirectionalIterator1 last, 
+                                              BidirectionalIterator2 result) {
+  while (first != last) *--result = *--last;
+  return result;
+}
+
+
+template <class BidirectionalIterator1, class BidirectionalIterator2>
+struct __copy_backward_dispatch
+{
+  BidirectionalIterator2 operator()(BidirectionalIterator1 first, 
+                                    BidirectionalIterator1 last, 
+                                    BidirectionalIterator2 result) {
+    return __copy_backward(first, last, result);
+  }
+};
+
+#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION 
+
+template <class T>
+inline T* __copy_backward_t(const T* first, const T* last, T* result,
+                            __true_type) {
+  const ptrdiff_t N = last - first;
+  memmove(result - N, first, sizeof(T) * N);
+  return result - N;
+}
+
+template <class T>
+inline T* __copy_backward_t(const T* first, const T* last, T* result,
+                            __false_type) {
+  return __copy_backward(first, last, result);
+}
+
+template <class T>
+struct __copy_backward_dispatch<T*, T*>
+{
+  T* operator()(T* first, T* last, T* result) {
+    typedef typename __type_traits<T>::has_trivial_assignment_operator t; 
+    return __copy_backward_t(first, last, result, t());
+  }
+};
+
+template <class T>
+struct __copy_backward_dispatch<const T*, T*>
+{
+  T* operator()(const T* first, const T* last, T* result) {
+    typedef typename __type_traits<T>::has_trivial_assignment_operator t; 
+    return __copy_backward_t(first, last, result, t());
+  }
+};
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+template <class BidirectionalIterator1, class BidirectionalIterator2>
+inline BidirectionalIterator2 copy_backward(BidirectionalIterator1 first, 
+                                            BidirectionalIterator1 last, 
+                                            BidirectionalIterator2 result) {
+  return __copy_backward_dispatch<BidirectionalIterator1, 
+                                  BidirectionalIterator2>()(first, last, 
+                                                            result);
+}
+
+template <class InputIterator, class Size, class OutputIterator>
+pair<InputIterator, OutputIterator> __copy_n(InputIterator first, Size count,
+                                             OutputIterator result,
+                                             input_iterator_tag) {
+  for ( ; count > 0; --count, ++first, ++result)
+    *result = *first;
+  return pair<InputIterator, OutputIterator>(first, result);
+}
+
+template <class RandomAccessIterator, class Size, class OutputIterator>
+inline pair<RandomAccessIterator, OutputIterator>
+__copy_n(RandomAccessIterator first, Size count,
+         OutputIterator result,
+         random_access_iterator_tag) {
+  RandomAccessIterator last = first + count;
+  return pair<RandomAccessIterator, OutputIterator>(last,
+                                                    copy(first, last, result));
+}
+
+template <class InputIterator, class Size, class OutputIterator>
+inline pair<InputIterator, OutputIterator>
+copy_n(InputIterator first, Size count,
+       OutputIterator result) {
+  return __copy_n(first, count, result, iterator_category(first));
+}
+
+template <class ForwardIterator, class T>
+void fill(ForwardIterator first, ForwardIterator last, const T& value) {
+  for ( ; first != last; ++first)
+    *first = value;
+}
+
+template <class OutputIterator, class Size, class T>
+OutputIterator fill_n(OutputIterator first, Size n, const T& value) {
+  for ( ; n > 0; --n, ++first)
+    *first = value;
+  return first;
+}
+
+template <class InputIterator1, class InputIterator2>
+pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1,
+                                             InputIterator1 last1,
+                                             InputIterator2 first2) {
+  while (first1 != last1 && *first1 == *first2) {
+    ++first1;
+    ++first2;
+  }
+  return pair<InputIterator1, InputIterator2>(first1, first2);
+}
+
+template <class InputIterator1, class InputIterator2, class BinaryPredicate>
+pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1,
+                                             InputIterator1 last1,
+                                             InputIterator2 first2,
+                                             BinaryPredicate binary_pred) {
+  while (first1 != last1 && binary_pred(*first1, *first2)) {
+    ++first1;
+    ++first2;
+  }
+  return pair<InputIterator1, InputIterator2>(first1, first2);
+}
+
+template <class InputIterator1, class InputIterator2>
+inline bool equal(InputIterator1 first1, InputIterator1 last1,
+                 InputIterator2 first2) {
+  for ( ; first1 != last1; ++first1, ++first2)
+    if (*first1 != *first2)
+      return false;
+  return true;
+}
+
+template <class InputIterator1, class InputIterator2, class BinaryPredicate>
+inline bool equal(InputIterator1 first1, InputIterator1 last1,
+                 InputIterator2 first2, BinaryPredicate binary_pred) {
+  for ( ; first1 != last1; ++first1, ++first2)
+    if (!binary_pred(*first1, *first2))
+      return false;
+  return true;
+}
+
+template <class InputIterator1, class InputIterator2>
+bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
+                            InputIterator2 first2, InputIterator2 last2) {
+  for ( ; first1 != last1 && first2 != last2; ++first1, ++first2) {
+    if (*first1 < *first2)
+      return true;
+    if (*first2 < *first1)
+      return false;
+  }
+  return first1 == last1 && first2 != last2;
+}
+
+template <class InputIterator1, class InputIterator2, class Compare>
+bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
+                            InputIterator2 first2, InputIterator2 last2,
+                            Compare comp) {
+  for ( ; first1 != last1 && first2 != last2; ++first1, ++first2) {
+    if (comp(*first1, *first2))
+      return true;
+    if (comp(*first2, *first1))
+      return false;
+  }
+  return first1 == last1 && first2 != last2;
+}
+
+inline bool 
+lexicographical_compare(const unsigned char* first1,
+                        const unsigned char* last1,
+                        const unsigned char* first2,
+                        const unsigned char* last2)
+{
+  const size_t len1 = last1 - first1;
+  const size_t len2 = last2 - first2;
+  const int result = memcmp(first1, first2, min(len1, len2));
+  return result != 0 ? result < 0 : len1 < len2;
+}
+
+inline bool lexicographical_compare(const char* first1, const char* last1,
+                                    const char* first2, const char* last2)
+{
+#if CHAR_MAX == SCHAR_MAX
+  return lexicographical_compare((const signed char*) first1,
+                                 (const signed char*) last1,
+                                 (const signed char*) first2,
+                                 (const signed char*) last2);
+#else
+  return lexicographical_compare((const unsigned char*) first1,
+                                 (const unsigned char*) last1,
+                                 (const unsigned char*) first2,
+                                 (const unsigned char*) last2);
+#endif
+}
+
+template <class InputIterator1, class InputIterator2>
+int lexicographical_compare_3way(InputIterator1 first1, InputIterator1 last1,
+                                 InputIterator2 first2, InputIterator2 last2)
+{
+  while (first1 != last1 && first2 != last2) {
+    if (*first1 < *first2) return -1;
+    if (*first2 < *first1) return 1;
+    ++first1; ++first2;
+  }
+  if (first2 == last2) {
+    return !(first1 == last1);
+  } else {
+    return -1;
+  }
+}
+
+inline int
+lexicographical_compare_3way(const unsigned char* first1,
+                             const unsigned char* last1,
+                             const unsigned char* first2,
+                             const unsigned char* last2)
+{
+  const ptrdiff_t len1 = last1 - first1;
+  const ptrdiff_t len2 = last2 - first2;
+  const int result = memcmp(first1, first2, min(len1, len2));
+  return result != 0 ? result : (len1 == len2 ? 0 : (len1 < len2 ? -1 : 1));
+}
+
+inline int lexicographical_compare_3way(const char* first1, const char* last1,
+                                        const char* first2, const char* last2)
+{
+#if CHAR_MAX == SCHAR_MAX
+  return lexicographical_compare_3way(
+                               (const signed char*) first1,
+                                (const signed char*) last1,
+                                (const signed char*) first2,
+                                (const signed char*) last2);
+#else
+  return lexicographical_compare_3way((const unsigned char*) first1,
+                                      (const unsigned char*) last1,
+                                      (const unsigned char*) first2,
+                                      (const unsigned char*) last2);
+#endif
+}
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_ALGOBASE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_alloc.h b/libstdc++/stl/stl_alloc.h
new file mode 100644 (file)
index 0000000..a6d4143
--- /dev/null
@@ -0,0 +1,698 @@
+/*
+ * Copyright (c) 1996-1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_ALLOC_H
+#define __SGI_STL_INTERNAL_ALLOC_H
+
+#ifdef __SUNPRO_CC
+#  define __PRIVATE public
+   // Extra access restrictions prevent us from really making some things
+   // private.
+#else
+#  define __PRIVATE private
+#endif
+
+#ifdef __STL_STATIC_TEMPLATE_MEMBER_BUG
+#  define __USE_MALLOC
+#endif
+
+
+// This implements some standard node allocators.  These are
+// NOT the same as the allocators in the C++ draft standard or in
+// in the original STL.  They do not encapsulate different pointer
+// types; indeed we assume that there is only one pointer type.
+// The allocation primitives are intended to allocate individual objects,
+// not larger arenas as with the original STL allocators.
+
+#if 0
+#   include <new>
+#   define __THROW_BAD_ALLOC throw bad_alloc
+#elif !defined(__THROW_BAD_ALLOC)
+#   include <iostream.h>
+#   define __THROW_BAD_ALLOC cerr << "out of memory" << endl; exit(1)
+#endif
+
+#ifndef __ALLOC
+#   define __ALLOC alloc
+#endif
+#ifdef __STL_WIN32THREADS
+#   include <windows.h>
+#endif
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#ifndef __RESTRICT
+#  define __RESTRICT
+#endif
+
+#if !defined(_PTHREADS) && !defined(_NOTHREADS) \
+ && !defined(__STL_SGI_THREADS) && !defined(__STL_WIN32THREADS)
+#   define _NOTHREADS
+#endif
+
+# ifdef _PTHREADS
+    // POSIX Threads
+    // This is dubious, since this is likely to be a high contention
+    // lock.   Performance may not be adequate.
+#   include <pthread.h>
+#   define __NODE_ALLOCATOR_LOCK \
+        if (threads) pthread_mutex_lock(&__node_allocator_lock)
+#   define __NODE_ALLOCATOR_UNLOCK \
+        if (threads) pthread_mutex_unlock(&__node_allocator_lock)
+#   define __NODE_ALLOCATOR_THREADS true
+#   define __VOLATILE volatile  // Needed at -O3 on SGI
+# endif
+# ifdef __STL_WIN32THREADS
+    // The lock needs to be initialized by constructing an allocator
+    // objects of the right type.  We do that here explicitly for alloc.
+#   define __NODE_ALLOCATOR_LOCK \
+        EnterCriticalSection(&__node_allocator_lock)
+#   define __NODE_ALLOCATOR_UNLOCK \
+        LeaveCriticalSection(&__node_allocator_lock)
+#   define __NODE_ALLOCATOR_THREADS true
+#   define __VOLATILE volatile  // may not be needed
+# endif /* WIN32THREADS */
+# ifdef __STL_SGI_THREADS
+    // This should work without threads, with sproc threads, or with
+    // pthreads.  It is suboptimal in all cases.
+    // It is unlikely to even compile on nonSGI machines.
+
+    extern "C" {
+      extern int __us_rsthread_malloc;
+    }
+       // The above is copied from malloc.h.  Including <malloc.h>
+       // would be cleaner but fails with certain levels of standard
+       // conformance.
+#   define __NODE_ALLOCATOR_LOCK if (threads && __us_rsthread_malloc) \
+                { __lock(&__node_allocator_lock); }
+#   define __NODE_ALLOCATOR_UNLOCK if (threads && __us_rsthread_malloc) \
+                { __unlock(&__node_allocator_lock); }
+#   define __NODE_ALLOCATOR_THREADS true
+#   define __VOLATILE volatile  // Needed at -O3 on SGI
+# endif
+# ifdef _NOTHREADS
+//  Thread-unsafe
+#   define __NODE_ALLOCATOR_LOCK
+#   define __NODE_ALLOCATOR_UNLOCK
+#   define __NODE_ALLOCATOR_THREADS false
+#   define __VOLATILE
+# endif
+
+__STL_BEGIN_NAMESPACE
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1174
+#endif
+
+// Malloc-based allocator.  Typically slower than default alloc below.
+// Typically thread-safe and more storage efficient.
+#ifdef __STL_STATIC_TEMPLATE_MEMBER_BUG
+# ifdef __DECLARE_GLOBALS_HERE
+    void (* __malloc_alloc_oom_handler)() = 0;
+    // g++ 2.7.2 does not handle static template data members.
+# else
+    extern void (* __malloc_alloc_oom_handler)();
+# endif
+#endif
+
+template <int inst>
+class __malloc_alloc_template {
+
+private:
+
+static void *oom_malloc(size_t);
+
+static void *oom_realloc(void *, size_t);
+
+#ifndef __STL_STATIC_TEMPLATE_MEMBER_BUG
+    static void (* __malloc_alloc_oom_handler)();
+#endif
+
+public:
+
+static void * allocate(size_t n)
+{
+    void *result = malloc(n);
+    if (0 == result) result = oom_malloc(n);
+    return result;
+}
+
+static void deallocate(void *p, size_t /* n */)
+{
+    free(p);
+}
+
+static void * reallocate(void *p, size_t /* old_sz */, size_t new_sz)
+{
+    void * result = realloc(p, new_sz);
+    if (0 == result) result = oom_realloc(p, new_sz);
+    return result;
+}
+
+static void (* set_malloc_handler(void (*f)()))()
+{
+    void (* old)() = __malloc_alloc_oom_handler;
+    __malloc_alloc_oom_handler = f;
+    return(old);
+}
+
+};
+
+// malloc_alloc out-of-memory handling
+
+#ifndef __STL_STATIC_TEMPLATE_MEMBER_BUG
+template <int inst>
+void (* __malloc_alloc_template<inst>::__malloc_alloc_oom_handler)() = 0;
+#endif
+
+template <int inst>
+void * __malloc_alloc_template<inst>::oom_malloc(size_t n)
+{
+    void (* my_malloc_handler)();
+    void *result;
+
+    for (;;) {
+        my_malloc_handler = __malloc_alloc_oom_handler;
+        if (0 == my_malloc_handler) { __THROW_BAD_ALLOC; }
+        (*my_malloc_handler)();
+        result = malloc(n);
+        if (result) return(result);
+    }
+}
+
+template <int inst>
+void * __malloc_alloc_template<inst>::oom_realloc(void *p, size_t n)
+{
+    void (* my_malloc_handler)();
+    void *result;
+
+    for (;;) {
+        my_malloc_handler = __malloc_alloc_oom_handler;
+        if (0 == my_malloc_handler) { __THROW_BAD_ALLOC; }
+        (*my_malloc_handler)();
+        result = realloc(p, n);
+        if (result) return(result);
+    }
+}
+
+typedef __malloc_alloc_template<0> malloc_alloc;
+
+template<class T, class Alloc>
+class simple_alloc {
+
+public:
+    static T *allocate(size_t n)
+                { return 0 == n? 0 : (T*) Alloc::allocate(n * sizeof (T)); }
+    static T *allocate(void)
+                { return (T*) Alloc::allocate(sizeof (T)); }
+    static void deallocate(T *p, size_t n)
+                { if (0 != n) Alloc::deallocate(p, n * sizeof (T)); }
+    static void deallocate(T *p)
+                { Alloc::deallocate(p, sizeof (T)); }
+};
+
+// Allocator adaptor to check size arguments for debugging.
+// Reports errors using assert.  Checking can be disabled with
+// NDEBUG, but it's far better to just use the underlying allocator
+// instead when no checking is desired.
+// There is some evidence that this can confuse Purify.
+template <class Alloc>
+class debug_alloc {
+
+private:
+
+enum {extra = 8};       // Size of space used to store size.  Note
+                        // that this must be large enough to preserve
+                        // alignment.
+
+public:
+
+static void * allocate(size_t n)
+{
+    char *result = (char *)Alloc::allocate(n + extra);
+    *(size_t *)result = n;
+    return result + extra;
+}
+
+static void deallocate(void *p, size_t n)
+{
+    char * real_p = (char *)p - extra;
+    assert(*(size_t *)real_p == n);
+    Alloc::deallocate(real_p, n + extra);
+}
+
+static void * reallocate(void *p, size_t old_sz, size_t new_sz)
+{
+    char * real_p = (char *)p - extra;
+    assert(*(size_t *)real_p == old_sz);
+    char * result = (char *)
+                  Alloc::reallocate(real_p, old_sz + extra, new_sz + extra);
+    *(size_t *)result = new_sz;
+    return result + extra;
+}
+
+
+};
+
+
+# ifdef __USE_MALLOC
+
+typedef malloc_alloc alloc;
+typedef malloc_alloc single_client_alloc;
+
+# else
+
+
+// Default node allocator.
+// With a reasonable compiler, this should be roughly as fast as the
+// original STL class-specific allocators, but with less fragmentation.
+// Default_alloc_template parameters are experimental and MAY
+// DISAPPEAR in the future.  Clients should just use alloc for now.
+//
+// Important implementation properties:
+// 1. If the client request an object of size > __MAX_BYTES, the resulting
+//    object will be obtained directly from malloc.
+// 2. In all other cases, we allocate an object of size exactly
+//    ROUND_UP(requested_size).  Thus the client has enough size
+//    information that we can return the object to the proper free list
+//    without permanently losing part of the object.
+//
+
+// The first template parameter specifies whether more than one thread
+// may use this allocator.  It is safe to allocate an object from
+// one instance of a default_alloc and deallocate it with another
+// one.  This effectively transfers its ownership to the second one.
+// This may have undesirable effects on reference locality.
+// The second parameter is unreferenced and serves only to allow the
+// creation of multiple default_alloc instances.
+// Node that containers built on different allocator instances have
+// different types, limiting the utility of this approach.
+#ifdef __SUNPRO_CC
+// breaks if we make these template class members:
+  enum {__ALIGN = 8};
+  enum {__MAX_BYTES = 128};
+  enum {__NFREELISTS = __MAX_BYTES/__ALIGN};
+#endif
+
+template <bool threads, int inst>
+class __default_alloc_template {
+
+private:
+  // Really we should use static const int x = N
+  // instead of enum { x = N }, but few compilers accept the former.
+# ifndef __SUNPRO_CC
+    enum {__ALIGN = 8};
+    enum {__MAX_BYTES = 128};
+    enum {__NFREELISTS = __MAX_BYTES/__ALIGN};
+# endif
+  static size_t ROUND_UP(size_t bytes) {
+        return (((bytes) + __ALIGN-1) & ~(__ALIGN - 1));
+  }
+__PRIVATE:
+  union obj {
+        union obj * free_list_link;
+        char client_data[1];    /* The client sees this.        */
+  };
+private:
+# ifdef __SUNPRO_CC
+    static obj * __VOLATILE free_list[]; 
+        // Specifying a size results in duplicate def for 4.1
+# else
+    static obj * __VOLATILE free_list[__NFREELISTS]; 
+# endif
+  static  size_t FREELIST_INDEX(size_t bytes) {
+        return (((bytes) + __ALIGN-1)/__ALIGN - 1);
+  }
+
+  // Returns an object of size n, and optionally adds to size n free list.
+  static void *refill(size_t n);
+  // Allocates a chunk for nobjs of size size.  nobjs may be reduced
+  // if it is inconvenient to allocate the requested number.
+  static char *chunk_alloc(size_t size, int &nobjs);
+
+  // Chunk allocation state.
+  static char *start_free;
+  static char *end_free;
+  static size_t heap_size;
+
+# ifdef __STL_SGI_THREADS
+    static volatile unsigned long __node_allocator_lock;
+    static void __lock(volatile unsigned long *); 
+    static inline void __unlock(volatile unsigned long *);
+# endif
+
+# ifdef _PTHREADS
+    static pthread_mutex_t __node_allocator_lock;
+# endif
+
+# ifdef __STL_WIN32THREADS
+    static CRITICAL_SECTION __node_allocator_lock;
+    static bool __node_allocator_lock_initialized;
+
+  public:
+    __default_alloc_template() {
+       // This assumes the first constructor is called before threads
+       // are started.
+        if (!__node_allocator_lock_initialized) {
+            InitializeCriticalSection(&__node_allocator_lock);
+            __node_allocator_lock_initialized = true;
+        }
+    }
+  private:
+# endif
+
+    class lock {
+        public:
+            lock() { __NODE_ALLOCATOR_LOCK; }
+            ~lock() { __NODE_ALLOCATOR_UNLOCK; }
+    };
+    friend class lock;
+
+public:
+
+  /* n must be > 0      */
+  static void * allocate(size_t n)
+  {
+    obj * __VOLATILE * my_free_list;
+    obj * __RESTRICT result;
+
+    if (n > (size_t) __MAX_BYTES) {
+        return(malloc_alloc::allocate(n));
+    }
+    my_free_list = free_list + FREELIST_INDEX(n);
+    // Acquire the lock here with a constructor call.
+    // This ensures that it is released in exit or during stack
+    // unwinding.
+#       ifndef _NOTHREADS
+        /*REFERENCED*/
+        lock lock_instance;
+#       endif
+    result = *my_free_list;
+    if (result == 0) {
+        void *r = refill(ROUND_UP(n));
+        return r;
+    }
+    *my_free_list = result -> free_list_link;
+    return (result);
+  };
+
+  /* p may not be 0 */
+  static void deallocate(void *p, size_t n)
+  {
+    obj *q = (obj *)p;
+    obj * __VOLATILE * my_free_list;
+
+    if (n > (size_t) __MAX_BYTES) {
+        malloc_alloc::deallocate(p, n);
+        return;
+    }
+    my_free_list = free_list + FREELIST_INDEX(n);
+    // acquire lock
+#       ifndef _NOTHREADS
+        /*REFERENCED*/
+        lock lock_instance;
+#       endif /* _NOTHREADS */
+    q -> free_list_link = *my_free_list;
+    *my_free_list = q;
+    // lock is released here
+  }
+
+  static void * reallocate(void *p, size_t old_sz, size_t new_sz);
+
+} ;
+
+typedef __default_alloc_template<__NODE_ALLOCATOR_THREADS, 0> alloc;
+typedef __default_alloc_template<false, 0> single_client_alloc;
+
+
+
+/* We allocate memory in large chunks in order to avoid fragmenting     */
+/* the malloc heap too much.                                            */
+/* We assume that size is properly aligned.                             */
+/* We hold the allocation lock.                                         */
+template <bool threads, int inst>
+char*
+__default_alloc_template<threads, inst>::chunk_alloc(size_t size, int& nobjs)
+{
+    char * result;
+    size_t total_bytes = size * nobjs;
+    size_t bytes_left = end_free - start_free;
+
+    if (bytes_left >= total_bytes) {
+        result = start_free;
+        start_free += total_bytes;
+        return(result);
+    } else if (bytes_left >= size) {
+        nobjs = bytes_left/size;
+        total_bytes = size * nobjs;
+        result = start_free;
+        start_free += total_bytes;
+        return(result);
+    } else {
+        size_t bytes_to_get = 2 * total_bytes + ROUND_UP(heap_size >> 4);
+        // Try to make use of the left-over piece.
+        if (bytes_left > 0) {
+            obj * __VOLATILE * my_free_list =
+                        free_list + FREELIST_INDEX(bytes_left);
+
+            ((obj *)start_free) -> free_list_link = *my_free_list;
+            *my_free_list = (obj *)start_free;
+        }
+        start_free = (char *)malloc(bytes_to_get);
+        if (0 == start_free) {
+            int i;
+            obj * __VOLATILE * my_free_list, *p;
+            // Try to make do with what we have.  That can't
+            // hurt.  We do not try smaller requests, since that tends
+            // to result in disaster on multi-process machines.
+            for (i = size; i <= __MAX_BYTES; i += __ALIGN) {
+                my_free_list = free_list + FREELIST_INDEX(i);
+                p = *my_free_list;
+                if (0 != p) {
+                    *my_free_list = p -> free_list_link;
+                    start_free = (char *)p;
+                    end_free = start_free + i;
+                    return(chunk_alloc(size, nobjs));
+                    // Any leftover piece will eventually make it to the
+                    // right free list.
+                }
+            }
+           end_free = 0;       // In case of exception.
+            start_free = (char *)malloc_alloc::allocate(bytes_to_get);
+            // This should either throw an
+            // exception or remedy the situation.  Thus we assume it
+            // succeeded.
+        }
+        heap_size += bytes_to_get;
+        end_free = start_free + bytes_to_get;
+        return(chunk_alloc(size, nobjs));
+    }
+}
+
+
+/* Returns an object of size n, and optionally adds to size n free list.*/
+/* We assume that n is properly aligned.                                */
+/* We hold the allocation lock.                                         */
+template <bool threads, int inst>
+void* __default_alloc_template<threads, inst>::refill(size_t n)
+{
+    int nobjs = 20;
+    char * chunk = chunk_alloc(n, nobjs);
+    obj * __VOLATILE * my_free_list;
+    obj * result;
+    obj * current_obj, * next_obj;
+    int i;
+
+    if (1 == nobjs) return(chunk);
+    my_free_list = free_list + FREELIST_INDEX(n);
+
+    /* Build free list in chunk */
+      result = (obj *)chunk;
+      *my_free_list = next_obj = (obj *)(chunk + n);
+      for (i = 1; ; i++) {
+        current_obj = next_obj;
+        next_obj = (obj *)((char *)next_obj + n);
+        if (nobjs - 1 == i) {
+            current_obj -> free_list_link = 0;
+            break;
+        } else {
+            current_obj -> free_list_link = next_obj;
+        }
+      }
+    return(result);
+}
+
+template <bool threads, int inst>
+void*
+__default_alloc_template<threads, inst>::reallocate(void *p,
+                                                    size_t old_sz,
+                                                    size_t new_sz)
+{
+    void * result;
+    size_t copy_sz;
+
+    if (old_sz > (size_t) __MAX_BYTES && new_sz > (size_t) __MAX_BYTES) {
+        return(realloc(p, new_sz));
+    }
+    if (ROUND_UP(old_sz) == ROUND_UP(new_sz)) return(p);
+    result = allocate(new_sz);
+    copy_sz = new_sz > old_sz? old_sz : new_sz;
+    memcpy(result, p, copy_sz);
+    deallocate(p, old_sz);
+    return(result);
+}
+
+#ifdef _PTHREADS
+    template <bool threads, int inst>
+    pthread_mutex_t
+    __default_alloc_template<threads, inst>::__node_allocator_lock
+        = PTHREAD_MUTEX_INITIALIZER;
+#endif
+
+#ifdef __STL_WIN32THREADS
+    template <bool threads, int inst> CRITICAL_SECTION
+    __default_alloc_template<threads, inst>::__node_allocator_lock;
+
+    template <bool threads, int inst> bool
+    __default_alloc_template<threads, inst>::__node_allocator_lock_initialized
+       = false;
+#endif
+
+#ifdef __STL_SGI_THREADS
+__STL_END_NAMESPACE
+#include <mutex.h>
+#include <time.h>
+__STL_BEGIN_NAMESPACE
+// Somewhat generic lock implementations.  We need only test-and-set
+// and some way to sleep.  These should work with both SGI pthreads
+// and sproc threads.  They may be useful on other systems.
+template <bool threads, int inst>
+volatile unsigned long
+__default_alloc_template<threads, inst>::__node_allocator_lock = 0;
+
+#if __mips < 3 || !(defined (_ABIN32) || defined(_ABI64)) || defined(__GNUC__)
+#   define __test_and_set(l,v) test_and_set(l,v)
+#endif
+
+template <bool threads, int inst>
+void 
+__default_alloc_template<threads, inst>::__lock(volatile unsigned long *lock)
+{
+    const unsigned low_spin_max = 30;  // spin cycles if we suspect uniprocessor
+    const unsigned high_spin_max = 1000; // spin cycles for multiprocessor
+    static unsigned spin_max = low_spin_max;
+    unsigned my_spin_max;
+    static unsigned last_spins = 0;
+    unsigned my_last_spins;
+    static struct timespec ts = {0, 1000};
+    unsigned junk;
+#   define __ALLOC_PAUSE junk *= junk; junk *= junk; junk *= junk; junk *= junk
+    int i;
+
+    if (!__test_and_set((unsigned long *)lock, 1)) {
+        return;
+    }
+    my_spin_max = spin_max;
+    my_last_spins = last_spins;
+    for (i = 0; i < my_spin_max; i++) {
+        if (i < my_last_spins/2 || *lock) {
+            __ALLOC_PAUSE;
+            continue;
+        }
+        if (!__test_and_set((unsigned long *)lock, 1)) {
+            // got it!
+            // Spinning worked.  Thus we're probably not being scheduled
+            // against the other process with which we were contending.
+            // Thus it makes sense to spin longer the next time.
+            last_spins = i;
+            spin_max = high_spin_max;
+            return;
+        }
+    }
+    // We are probably being scheduled against the other process.  Sleep.
+    spin_max = low_spin_max;
+    for (;;) {
+        if (!__test_and_set((unsigned long *)lock, 1)) {
+            return;
+        }
+        nanosleep(&ts, 0);
+    }
+}
+
+template <bool threads, int inst>
+inline void
+__default_alloc_template<threads, inst>::__unlock(volatile unsigned long *lock)
+{
+#   if defined(__GNUC__) && __mips >= 3
+        asm("sync");
+        *lock = 0;
+#   elif __mips >= 3 && (defined (_ABIN32) || defined(_ABI64))
+        __lock_release(lock);
+#   else 
+        *lock = 0;
+        // This is not sufficient on many multiprocessors, since
+        // writes to protected variables and the lock may be reordered.
+#   endif
+}
+#endif
+
+template <bool threads, int inst>
+char *__default_alloc_template<threads, inst>::start_free = 0;
+
+template <bool threads, int inst>
+char *__default_alloc_template<threads, inst>::end_free = 0;
+
+template <bool threads, int inst>
+size_t __default_alloc_template<threads, inst>::heap_size = 0;
+
+template <bool threads, int inst>
+__default_alloc_template<threads, inst>::obj * __VOLATILE
+__default_alloc_template<threads, inst> ::free_list[
+# ifdef __SUNPRO_CC
+    __NFREELISTS
+# else
+    __default_alloc_template<threads, inst>::__NFREELISTS
+# endif
+] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
+// The 16 zeros are necessary to make version 4.1 of the SunPro
+// compiler happy.  Otherwise it appears to allocate too little
+// space for the array.
+
+# ifdef __STL_WIN32THREADS
+  // Create one to get critical section initialized.
+  // We do this onece per file, but only the first constructor
+  // does anything.
+  static alloc __node_allocator_dummy_instance;
+# endif
+
+#endif /* ! __USE_MALLOC */
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1174
+#endif
+
+__STL_END_NAMESPACE
+
+#undef __PRIVATE
+
+#endif /* __SGI_STL_INTERNAL_ALLOC_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_bvector.h b/libstdc++/stl/stl_bvector.h
new file mode 100644 (file)
index 0000000..db02251
--- /dev/null
@@ -0,0 +1,614 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_BVECTOR_H
+#define __SGI_STL_INTERNAL_BVECTOR_H
+
+__STL_BEGIN_NAMESPACE 
+
+static const int __WORD_BIT = int(CHAR_BIT*sizeof(unsigned int));
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1174
+#endif
+
+struct __bit_reference {
+  unsigned int* p;
+  unsigned int mask;
+  __bit_reference(unsigned int* x, unsigned int y) : p(x), mask(y) {}
+
+public:
+  __bit_reference() : p(0), mask(0) {}
+  operator bool() const { return !(!(*p & mask)); }
+  __bit_reference& operator=(bool x) {
+    if (x)      
+      *p |= mask;
+    else 
+      *p &= ~mask;
+    return *this;
+  }
+  __bit_reference& operator=(const __bit_reference& x) { return *this = bool(x); }
+  bool operator==(const __bit_reference& x) const {
+    return bool(*this) == bool(x);
+  }
+  bool operator<(const __bit_reference& x) const {
+    return bool(*this) < bool(x);
+  }
+  void flip() { *p ^= mask; }
+};
+
+inline void swap(__bit_reference x, __bit_reference y) {
+  bool tmp = x;
+  x = y;
+  y = tmp;
+}
+
+struct __bit_iterator : public random_access_iterator<bool, ptrdiff_t> {
+  typedef __bit_reference  reference;
+  typedef __bit_reference* pointer;
+  typedef __bit_iterator iterator;
+
+  unsigned int* p;
+  unsigned int offset;
+  void bump_up() {
+    if (offset++ == __WORD_BIT - 1) {
+      offset = 0;
+      ++p;
+    }
+  }
+  void bump_down() {
+    if (offset-- == 0) {
+      offset = __WORD_BIT - 1;
+      --p;
+    }
+  }
+
+  __bit_iterator() : p(0), offset(0) {}
+  __bit_iterator(unsigned int* x, unsigned int y) : p(x), offset(y) {}
+  reference operator*() const { return reference(p, 1U << offset); }
+  iterator& operator++() {
+    bump_up();
+    return *this;
+  }
+  iterator operator++(int) {
+    iterator tmp = *this;
+    bump_up();
+    return tmp;
+  }
+  iterator& operator--() {
+    bump_down();
+    return *this;
+  }
+  iterator operator--(int) {
+    iterator tmp = *this;
+    bump_down();
+    return tmp;
+  }
+  iterator& operator+=(difference_type i) {
+    difference_type n = i + offset;
+    p += n / __WORD_BIT;
+    n = n % __WORD_BIT;
+    if (n < 0) {
+      offset = (unsigned int) n + __WORD_BIT;
+      --p;
+    } else
+      offset = (unsigned int) n;
+    return *this;
+  }
+  iterator& operator-=(difference_type i) {
+    *this += -i;
+    return *this;
+  }
+  iterator operator+(difference_type i) const {
+    iterator tmp = *this;
+    return tmp += i;
+  }
+  iterator operator-(difference_type i) const {
+    iterator tmp = *this;
+    return tmp -= i;
+  }
+  difference_type operator-(iterator x) const {
+    return __WORD_BIT * (p - x.p) + offset - x.offset;
+  }
+  reference operator[](difference_type i) { return *(*this + i); }
+  bool operator==(const iterator& x) const {
+    return p == x.p && offset == x.offset;
+  }
+  bool operator!=(const iterator& x) const {
+    return p != x.p || offset != x.offset;
+  }
+  bool operator<(iterator x) const {
+    return p < x.p || (p == x.p && offset < x.offset);
+  }
+};
+
+struct __bit_const_iterator
+  : public random_access_iterator<bool, ptrdiff_t>
+{
+  typedef bool                 reference;
+  typedef bool                 const_reference;
+  typedef const bool*          pointer;
+  typedef __bit_const_iterator const_iterator;
+
+  unsigned int* p;
+  unsigned int offset;
+  void bump_up() {
+    if (offset++ == __WORD_BIT - 1) {
+      offset = 0;
+      ++p;
+    }
+  }
+  void bump_down() {
+    if (offset-- == 0) {
+      offset = __WORD_BIT - 1;
+      --p;
+    }
+  }
+
+  __bit_const_iterator() : p(0), offset(0) {}
+  __bit_const_iterator(unsigned int* x, unsigned int y) : p(x), offset(y) {}
+  __bit_const_iterator(const __bit_iterator& x) : p(x.p), offset(x.offset) {}
+  const_reference operator*() const {
+    return __bit_reference(p, 1U << offset);
+  }
+  const_iterator& operator++() {
+    bump_up();
+    return *this;
+  }
+  const_iterator operator++(int) {
+    const_iterator tmp = *this;
+    bump_up();
+    return tmp;
+  }
+  const_iterator& operator--() {
+    bump_down();
+    return *this;
+  }
+  const_iterator operator--(int) {
+    const_iterator tmp = *this;
+    bump_down();
+    return tmp;
+  }
+  const_iterator& operator+=(difference_type i) {
+    difference_type n = i + offset;
+    p += n / __WORD_BIT;
+    n = n % __WORD_BIT;
+    if (n < 0) {
+      offset = (unsigned int) n + __WORD_BIT;
+      --p;
+    } else
+      offset = (unsigned int) n;
+    return *this;
+  }
+  const_iterator& operator-=(difference_type i) {
+    *this += -i;
+    return *this;
+  }
+  const_iterator operator+(difference_type i) const {
+    const_iterator tmp = *this;
+    return tmp += i;
+  }
+  const_iterator operator-(difference_type i) const {
+    const_iterator tmp = *this;
+    return tmp -= i;
+  }
+  difference_type operator-(const_iterator x) const {
+    return __WORD_BIT * (p - x.p) + offset - x.offset;
+  }
+  const_reference operator[](difference_type i) { 
+    return *(*this + i); 
+  }
+  bool operator==(const const_iterator& x) const {
+    return p == x.p && offset == x.offset;
+  }
+  bool operator!=(const const_iterator& x) const {
+    return p != x.p || offset != x.offset;
+  }
+  bool operator<(const_iterator x) const {
+    return p < x.p || (p == x.p && offset < x.offset);
+  }
+};
+
+// The next few lines are confusing.  What we're doing is declaring a
+//  partial specialization of vector<T, Alloc> if we have the necessary
+//  compiler support.  Otherwise, we define a class bit_vector which uses
+//  the default allocator.  In either case, we typedef "data_allocator" 
+//  appropriately.
+
+#if defined(__STL_CLASS_PARTIAL_SPECIALIZATION) && !defined(__STL_NEED_BOOL)
+#define __SGI_STL_VECBOOL_TEMPLATE
+#define __BVECTOR vector
+#else
+#undef __SGI_STL_VECBOOL_TEMPLATE
+#define __BVECTOR bit_vector
+#endif
+
+#      ifdef __SGI_STL_VECBOOL_TEMPLATE
+       __STL_END_NAMESPACE
+#      include <stl_vector.h>
+       __STL_BEGIN_NAMESPACE
+template<class Alloc> class vector<bool, Alloc>
+#      else /* __SGI_STL_VECBOOL_TEMPLATE */
+class bit_vector
+#      endif /* __SGI_STL_VECBOOL_TEMPLATE */
+{
+#      ifdef __SGI_STL_VECBOOL_TEMPLATE
+  typedef simple_alloc<unsigned int, Alloc> data_allocator;
+#      else /* __SGI_STL_VECBOOL_TEMPLATE */
+  typedef simple_alloc<unsigned int, alloc> data_allocator;  
+#      endif /* __SGI_STL_VECBOOL_TEMPLATE */
+public:
+  typedef bool value_type;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type; 
+  typedef __bit_reference reference;
+  typedef bool const_reference;
+  typedef __bit_reference* pointer;
+  typedef const bool* const_pointer;
+
+  typedef __bit_iterator                iterator;
+  typedef __bit_const_iterator          const_iterator;
+
+#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
+  typedef reverse_iterator<const_iterator> const_reverse_iterator;
+  typedef reverse_iterator<iterator> reverse_iterator;
+#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+  typedef reverse_iterator<const_iterator, value_type, const_reference, 
+                           difference_type> const_reverse_iterator;
+  typedef reverse_iterator<iterator, value_type, reference, difference_type>
+          reverse_iterator;
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+protected:
+  iterator start;
+  iterator finish;
+  unsigned int* end_of_storage;
+  unsigned int* bit_alloc(size_type n) {
+    return data_allocator::allocate((n + __WORD_BIT - 1)/__WORD_BIT);
+  }
+  void deallocate() {
+    if (start.p)
+      data_allocator::deallocate(start.p, end_of_storage - start.p);
+  }
+  void initialize(size_type n) {
+    unsigned int* q = bit_alloc(n);
+    end_of_storage = q + (n + __WORD_BIT - 1)/__WORD_BIT;
+    start = iterator(q, 0);
+    finish = start + difference_type(n);
+  }
+  void insert_aux(iterator position, bool x) {
+    if (finish.p != end_of_storage) {
+      copy_backward(position, finish, finish + 1);
+      *position = x;
+      ++finish;
+    }
+    else {
+      size_type len = size() ? 2 * size() : __WORD_BIT;
+      unsigned int* q = bit_alloc(len);
+      iterator i = copy(begin(), position, iterator(q, 0));
+      *i++ = x;
+      finish = copy(position, end(), i);
+      deallocate();
+      end_of_storage = q + (len + __WORD_BIT - 1)/__WORD_BIT;
+      start = iterator(q, 0);
+    }
+  }
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  void initialize_range(InputIterator first, InputIterator last,
+                        input_iterator_tag) {
+    start = iterator();
+    finish = iterator();
+    end_of_storage = 0;
+    for ( ; first != last; ++first) 
+      push_back(*first);
+  }
+
+  template <class ForwardIterator>
+  void initialize_range(ForwardIterator first, ForwardIterator last,
+                        forward_iterator_tag) {
+    size_type n = 0;
+    distance(first, last, n);
+    initialize(n);
+    copy(first, last, start);
+  }
+
+  template <class InputIterator>
+  void insert_range(iterator pos,
+                    InputIterator first, InputIterator last,
+                    input_iterator_tag) {
+    for ( ; first != last; ++first) {
+      pos = insert(pos, *first);
+      ++pos;
+    }
+  }
+
+  template <class ForwardIterator>
+  void insert_range(iterator position,
+                    ForwardIterator first, ForwardIterator last,
+                    forward_iterator_tag) {
+    if (first != last) {
+      size_type n = 0;
+      distance(first, last, n);
+      if (capacity() - size() >= n) {
+        copy_backward(position, end(), finish + difference_type(n));
+        copy(first, last, position);
+        finish += difference_type(n);
+      }
+      else {
+        size_type len = size() + max(size(), n);
+        unsigned int* q = bit_alloc(len);
+        iterator i = copy(begin(), position, iterator(q, 0));
+        i = copy(first, last, i);
+        finish = copy(position, end(), i);
+        deallocate();
+        end_of_storage = q + (len + __WORD_BIT - 1)/__WORD_BIT;
+        start = iterator(q, 0);
+      }
+    }
+  }      
+
+#endif /* __STL_MEMBER_TEMPLATES */
+
+public:
+  iterator begin() { return start; }
+  const_iterator begin() const { return start; }
+  iterator end() { return finish; }
+  const_iterator end() const { return finish; }
+
+  reverse_iterator rbegin() { return reverse_iterator(end()); }
+  const_reverse_iterator rbegin() const { 
+    return const_reverse_iterator(end()); 
+  }
+  reverse_iterator rend() { return reverse_iterator(begin()); }
+  const_reverse_iterator rend() const { 
+    return const_reverse_iterator(begin()); 
+  }
+
+  size_type size() const { return size_type(end() - begin()); }
+  size_type max_size() const { return size_type(-1); }
+  size_type capacity() const {
+    return size_type(const_iterator(end_of_storage, 0) - begin());
+  }
+  bool empty() const { return begin() == end(); }
+  reference operator[](size_type n) {
+    return *(begin() + difference_type(n));
+  }
+  const_reference operator[](size_type n) const {
+    return *(begin() + difference_type(n));
+  }
+  __BVECTOR() : start(iterator()), finish(iterator()), end_of_storage(0) {}
+  __BVECTOR(size_type n, bool value) {
+    initialize(n);
+    fill(start.p, end_of_storage, value ? ~0 : 0);
+  }
+  __BVECTOR(int n, bool value) {
+    initialize(n);
+    fill(start.p, end_of_storage, value ? ~0 : 0);
+  }
+  __BVECTOR(long n, bool value) {
+    initialize(n);
+    fill(start.p, end_of_storage, value ? ~0 : 0);
+  }
+  explicit __BVECTOR(size_type n) {
+    initialize(n);
+    fill(start.p, end_of_storage, 0);
+  }
+  __BVECTOR(const __BVECTOR& x) {
+    initialize(x.size());
+    copy(x.begin(), x.end(), start);
+  }
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  __BVECTOR(InputIterator first, InputIterator last) {
+    initialize_range(first, last, iterator_category(first));
+  }
+#else /* __STL_MEMBER_TEMPLATES */
+  __BVECTOR(const_iterator first, const_iterator last) {
+    size_type n = 0;
+    distance(first, last, n);
+    initialize(n);
+    copy(first, last, start);
+  }
+  __BVECTOR(const bool* first, const bool* last) {
+    size_type n = 0;
+    distance(first, last, n);
+    initialize(n);
+    copy(first, last, start);
+  }
+#endif /* __STL_MEMBER_TEMPLATES */
+
+  ~__BVECTOR() { deallocate(); }
+  __BVECTOR& operator=(const __BVECTOR& x) {
+    if (&x == this) return *this;
+    if (x.size() > capacity()) {
+      deallocate();
+      initialize(x.size());
+    }
+    copy(x.begin(), x.end(), begin());
+    finish = begin() + difference_type(x.size());
+    return *this;
+  }
+  void reserve(size_type n) {
+    if (capacity() < n) {
+      unsigned int* q = bit_alloc(n);
+      finish = copy(begin(), end(), iterator(q, 0));
+      deallocate();
+      start = iterator(q, 0);
+      end_of_storage = q + (n + __WORD_BIT - 1)/__WORD_BIT;
+    }
+  }
+  reference front() { return *begin(); }
+  const_reference front() const { return *begin(); }
+  reference back() { return *(end() - 1); }
+  const_reference back() const { return *(end() - 1); }
+  void push_back(bool x) {
+    if (finish.p != end_of_storage)
+      *finish++ = x;
+    else
+      insert_aux(end(), x);
+  }
+  void swap(__BVECTOR& x) {
+    __STD::swap(start, x.start);
+    __STD::swap(finish, x.finish);
+    __STD::swap(end_of_storage, x.end_of_storage);
+  }
+  iterator insert(iterator position, bool x = bool()) {
+    difference_type n = position - begin();
+    if (finish.p != end_of_storage && position == end())
+      *finish++ = x;
+    else
+      insert_aux(position, x);
+    return begin() + n;
+  }
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator> void insert(iterator position,
+                                             InputIterator first,
+                                             InputIterator last) {
+    insert_range(position, first, last, iterator_category(first));
+  }
+#else /* __STL_MEMBER_TEMPLATES */
+  void insert(iterator position, const_iterator first, 
+              const_iterator last) {
+    if (first == last) return;
+    size_type n = 0;
+    distance(first, last, n);
+    if (capacity() - size() >= n) {
+      copy_backward(position, end(), finish + n);
+      copy(first, last, position);
+      finish += n;
+    }
+    else {
+      size_type len = size() + max(size(), n);
+      unsigned int* q = bit_alloc(len);
+      iterator i = copy(begin(), position, iterator(q, 0));
+      i = copy(first, last, i);
+      finish = copy(position, end(), i);
+      deallocate();
+      end_of_storage = q + (len + __WORD_BIT - 1)/__WORD_BIT;
+      start = iterator(q, 0);
+    }
+  }
+
+  void insert(iterator position, const bool* first, const bool* last) {
+    if (first == last) return;
+    size_type n = 0;
+    distance(first, last, n);
+    if (capacity() - size() >= n) {
+      copy_backward(position, end(), finish + n);
+      copy(first, last, position);
+      finish += n;
+    }
+    else {
+      size_type len = size() + max(size(), n);
+      unsigned int* q = bit_alloc(len);
+      iterator i = copy(begin(), position, iterator(q, 0));
+      i = copy(first, last, i);
+      finish = copy(position, end(), i);
+      deallocate();
+      end_of_storage = q + (len + __WORD_BIT - 1)/__WORD_BIT;
+      start = iterator(q, 0);
+    }
+  }
+#endif /* __STL_MEMBER_TEMPLATES */
+  
+  void insert(iterator position, size_type n, bool x) {
+    if (n == 0) return;
+    if (capacity() - size() >= n) {
+      copy_backward(position, end(), finish + difference_type(n));
+      fill(position, position + difference_type(n), x);
+      finish += difference_type(n);
+    }
+    else {
+      size_type len = size() + max(size(), n);
+      unsigned int* q = bit_alloc(len);
+      iterator i = copy(begin(), position, iterator(q, 0));
+      fill_n(i, n, x);
+      finish = copy(position, end(), i + difference_type(n));
+      deallocate();
+      end_of_storage = q + (len + __WORD_BIT - 1)/__WORD_BIT;
+      start = iterator(q, 0);
+    }
+  }
+
+  void insert(iterator pos, int n, bool x)  { insert(pos, (size_type)n, x); }
+  void insert(iterator pos, long n, bool x) { insert(pos, (size_type)n, x); }
+
+  void pop_back() { --finish; }
+  void erase(iterator position) {
+    if (position + 1 != end())
+      copy(position + 1, end(), position);
+    --finish;
+  }
+  void erase(iterator first, iterator last) {
+    finish = copy(last, end(), first);
+  }
+  void resize(size_type new_size, bool x = bool()) {
+    if (new_size < size()) 
+      erase(begin() + difference_type(new_size), end());
+    else
+      insert(end(), new_size - size(), x);
+  }
+  void clear() { erase(begin(), end()); }
+};
+
+#ifdef __SGI_STL_VECBOOL_TEMPLATE
+
+typedef vector<bool, alloc> bit_vector;
+
+#else /* __SGI_STL_VECBOOL_TEMPLATE */
+
+inline bool operator==(const bit_vector& x, const bit_vector& y) {
+  return x.size() == y.size() && equal(x.begin(), x.end(), y.begin());
+}
+
+inline bool operator<(const bit_vector& x, const bit_vector& y) {
+  return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());
+}
+
+#endif /* __SGI_STL_VECBOOL_TEMPLATE */
+
+#undef __SGI_STL_VECBOOL_TEMPLATE
+#undef __BVECTOR
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1174
+#endif
+
+__STL_END_NAMESPACE 
+
+#endif /* __SGI_STL_INTERNAL_BVECTOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_construct.h b/libstdc++/stl/stl_construct.h
new file mode 100644 (file)
index 0000000..4687635
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_CONSTRUCT_H
+#define __SGI_STL_INTERNAL_CONSTRUCT_H
+
+#include <new.h>
+
+__STL_BEGIN_NAMESPACE
+
+template <class T>
+inline void destroy(T* pointer) {
+    pointer->~T();
+}
+
+template <class T1, class T2>
+inline void construct(T1* p, const T2& value) {
+  new (p) T1(value);
+}
+
+template <class ForwardIterator>
+inline void
+__destroy_aux(ForwardIterator first, ForwardIterator last, __false_type) {
+  for ( ; first < last; ++first)
+    destroy(&*first);
+}
+
+template <class ForwardIterator> 
+inline void __destroy_aux(ForwardIterator, ForwardIterator, __true_type) {}
+
+template <class ForwardIterator, class T>
+inline void __destroy(ForwardIterator first, ForwardIterator last, T*) {
+  typedef typename __type_traits<T>::has_trivial_destructor trivial_destructor;
+  __destroy_aux(first, last, trivial_destructor());
+}
+
+template <class ForwardIterator>
+inline void destroy(ForwardIterator first, ForwardIterator last) {
+  __destroy(first, last, value_type(first));
+}
+
+inline void destroy(char*, char*) {}
+inline void destroy(wchar_t*, wchar_t*) {}
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_CONSTRUCT_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_deque.h b/libstdc++/stl/stl_deque.h
new file mode 100644 (file)
index 0000000..79d4008
--- /dev/null
@@ -0,0 +1,1335 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_DEQUE_H
+#define __SGI_STL_INTERNAL_DEQUE_H
+
+/* Class invariants:
+ *  For any nonsingular iterator i:
+ *    i.node is the address of an element in the map array.  The
+ *      contents of i.node is a pointer to the beginning of a node.
+ *    i.first == *(i.node) 
+ *    i.last  == i.first + node_size
+ *    i.cur is a pointer in the range [i.first, i.last).  NOTE:
+ *      the implication of this is that i.cur is always a dereferenceable
+ *      pointer, even if i is a past-the-end iterator.
+ *  Start and Finish are always nonsingular iterators.  NOTE: this means
+ *    that an empty deque must have one node, and that a deque
+ *    with N elements, where N is the buffer size, must have two nodes.
+ *  For every node other than start.node and finish.node, every element
+ *    in the node is an initialized object.  If start.node == finish.node,
+ *    then [start.cur, finish.cur) are initialized objects, and
+ *    the elements outside that range are uninitialized storage.  Otherwise,
+ *    [start.cur, start.last) and [finish.first, finish.cur) are initialized
+ *    objects, and [start.first, start.cur) and [finish.cur, finish.last)
+ *    are uninitialized storage.
+ *  [map, map + map_size) is a valid, non-empty range.  
+ *  [start.node, finish.node] is a valid range contained within 
+ *    [map, map + map_size).  
+ *  A pointer in the range [map, map + map_size) points to an allocated
+ *    node if and only if the pointer is in the range [start.node, finish.node].
+ */
+
+
+/*
+ * In previous versions of deque, node_size was fixed by the 
+ * implementation.  In this version, however, users can select
+ * the node size.  Deque has three template parameters; the third,
+ * a number of type size_t, is the number of elements per node.
+ * If the third template parameter is 0 (which is the default), 
+ * then deque will use a default node size.
+ *
+ * The only reason for using an alternate node size is if your application
+ * requires a different performance tradeoff than the default.  If,
+ * for example, your program contains many deques each of which contains
+ * only a few elements, then you might want to save memory (possibly
+ * by sacrificing some speed) by using smaller nodes.
+ *
+ * Unfortunately, some compilers have trouble with non-type template 
+ * parameters; stl_config.h defines __STL_NON_TYPE_TMPL_PARAM_BUG if
+ * that is the case.  If your compiler is one of them, then you will
+ * not be able to use alternate node sizes; you will have to use the
+ * default value.
+ */
+
+__STL_BEGIN_NAMESPACE 
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1174
+#endif
+
+// Note: this function is simply a kludge to work around several compilers'
+//  bugs in handling constant expressions.
+inline size_t __deque_buf_size(size_t n, size_t sz)
+{
+  return n != 0 ? n : (sz < 512 ? size_t(512 / sz) : size_t(1));
+}
+
+#ifndef __STL_NON_TYPE_TMPL_PARAM_BUG
+template <class T, class Ref, class Ptr, size_t BufSiz>
+struct __deque_iterator {
+  typedef __deque_iterator<T, T&, T*, BufSiz>             iterator;
+  typedef __deque_iterator<T, const T&, const T*, BufSiz> const_iterator;
+  static size_t buffer_size() {return __deque_buf_size(BufSiz, sizeof(T)); }
+#else /* __STL_NON_TYPE_TMPL_PARAM_BUG */
+template <class T, class Ref, class Ptr>
+struct __deque_iterator {
+  typedef __deque_iterator<T, T&, T*>             iterator;
+  typedef __deque_iterator<T, const T&, const T*> const_iterator;
+  static size_t buffer_size() {return __deque_buf_size(0, sizeof(T)); }
+#endif
+
+  typedef random_access_iterator_tag iterator_category;
+  typedef T value_type;
+  typedef Ptr pointer;
+  typedef Ref reference;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type;
+  typedef T** map_pointer;
+
+  typedef __deque_iterator self;
+
+  T* cur;
+  T* first;
+  T* last;
+  map_pointer node;
+
+  __deque_iterator(T* x, map_pointer y) 
+    : cur(x), first(*y), last(*y + buffer_size()), node(y) {}
+  __deque_iterator() : cur(0), first(0), last(0), node(0) {}
+  __deque_iterator(const iterator& x)
+    : cur(x.cur), first(x.first), last(x.last), node(x.node) {}
+
+  reference operator*() const { return *cur; }
+#ifndef __SGI_STL_NO_ARROW_OPERATOR
+  pointer operator->() const { return &(operator*()); }
+#endif /* __SGI_STL_NO_ARROW_OPERATOR */
+
+  difference_type operator-(const self& x) const {
+    return difference_type(buffer_size()) * (node - x.node - 1) +
+      (cur - first) + (x.last - x.cur);
+  }
+
+  self& operator++() {
+    ++cur;
+    if (cur == last) {
+      set_node(node + 1);
+      cur = first;
+    }
+    return *this; 
+  }
+  self operator++(int)  {
+    self tmp = *this;
+    ++*this;
+    return tmp;
+  }
+
+  self& operator--() {
+    if (cur == first) {
+      set_node(node - 1);
+      cur = last;
+    }
+    --cur;
+    return *this;
+  }
+  self operator--(int) {
+    self tmp = *this;
+    --*this;
+    return tmp;
+  }
+
+  self& operator+=(difference_type n) {
+    difference_type offset = n + (cur - first);
+    if (offset >= 0 && offset < difference_type(buffer_size()))
+      cur += n;
+    else {
+      difference_type node_offset =
+        offset > 0 ? offset / difference_type(buffer_size())
+                   : -difference_type((-offset - 1) / buffer_size()) - 1;
+      set_node(node + node_offset);
+      cur = first + (offset - node_offset * difference_type(buffer_size()));
+    }
+    return *this;
+  }
+
+  self operator+(difference_type n) const {
+    self tmp = *this;
+    return tmp += n;
+  }
+
+  self& operator-=(difference_type n) { return *this += -n; }
+  self operator-(difference_type n) const {
+    self tmp = *this;
+    return tmp -= n;
+  }
+
+  reference operator[](difference_type n) const { return *(*this + n); }
+
+  bool operator==(const self& x) const { return cur == x.cur; }
+  bool operator!=(const self& x) const { return !(*this == x); }
+  bool operator<(const self& x) const {
+    return (node == x.node) ? (cur < x.cur) : (node < x.node);
+  }
+
+  void set_node(map_pointer new_node) {
+    node = new_node;
+    first = *new_node;
+    last = first + difference_type(buffer_size());
+  }
+};
+
+#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+#ifndef __STL_NON_TYPE_TMPL_PARAM_BUG
+
+template <class T, class Ref, class Ptr, size_t BufSiz>
+inline random_access_iterator_tag
+iterator_category(const __deque_iterator<T, Ref, Ptr, BufSiz>&) {
+  return random_access_iterator_tag();
+}
+
+template <class T, class Ref, class Ptr, size_t BufSiz>
+inline T* value_type(const __deque_iterator<T, Ref, Ptr, BufSiz>&) {
+  return 0;
+}
+
+template <class T, class Ref, class Ptr, size_t BufSiz>
+inline ptrdiff_t* distance_type(const __deque_iterator<T, Ref, Ptr, BufSiz>&) {
+  return 0;
+}
+
+#else /* __STL_NON_TYPE_TMPL_PARAM_BUG */
+
+template <class T, class Ref, class Ptr>
+inline random_access_iterator_tag
+iterator_category(const __deque_iterator<T, Ref, Ptr>&) {
+  return random_access_iterator_tag();
+}
+
+template <class T, class Ref, class Ptr>
+inline T* value_type(const __deque_iterator<T, Ref, Ptr>&) { return 0; }
+
+template <class T, class Ref, class Ptr>
+inline ptrdiff_t* distance_type(const __deque_iterator<T, Ref, Ptr>&) {
+  return 0;
+}
+
+#endif /* __STL_NON_TYPE_TMPL_PARAM_BUG */
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+// See __deque_buf_size().  The only reason that the default value is 0
+//  is as a workaround for bugs in the way that some compilers handle
+//  constant expressions.
+template <class T, class Alloc = alloc, size_t BufSiz = 0> 
+class deque {
+public:                         // Basic types
+  typedef T value_type;
+  typedef value_type* pointer;
+  typedef const value_type* const_pointer;
+  typedef value_type& reference;
+  typedef const value_type& const_reference;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type;
+
+public:                         // Iterators
+#ifndef __STL_NON_TYPE_TMPL_PARAM_BUG
+  typedef __deque_iterator<T, T&, T*, BufSiz>              iterator;
+  typedef __deque_iterator<T, const T&, const T&, BufSiz>  const_iterator;
+#else /* __STL_NON_TYPE_TMPL_PARAM_BUG */
+  typedef __deque_iterator<T, T&, T*>                      iterator;
+  typedef __deque_iterator<T, const T&, const T*>          const_iterator;
+#endif /* __STL_NON_TYPE_TMPL_PARAM_BUG */
+
+#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
+  typedef reverse_iterator<const_iterator> const_reverse_iterator;
+  typedef reverse_iterator<iterator> reverse_iterator;
+#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+  typedef reverse_iterator<const_iterator, value_type, const_reference, 
+                           difference_type>  
+          const_reverse_iterator;
+  typedef reverse_iterator<iterator, value_type, reference, difference_type>
+          reverse_iterator; 
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+protected:                      // Internal typedefs
+  typedef pointer* map_pointer;
+  typedef simple_alloc<value_type, Alloc> data_allocator;
+  typedef simple_alloc<pointer, Alloc> map_allocator;
+
+  static size_type buffer_size() {
+    return __deque_buf_size(BufSiz, sizeof(value_type));
+  }
+  static size_type initial_map_size() { return 8; }
+
+protected:                      // Data members
+  iterator start;
+  iterator finish;
+
+  map_pointer map;
+  size_type map_size;
+
+public:                         // Basic accessors
+  iterator begin() { return start; }
+  iterator end() { return finish; }
+  const_iterator begin() const { return start; }
+  const_iterator end() const { return finish; }
+
+  reverse_iterator rbegin() { return reverse_iterator(finish); }
+  reverse_iterator rend() { return reverse_iterator(start); }
+  const_reverse_iterator rbegin() const {
+    return const_reverse_iterator(finish);
+  }
+  const_reverse_iterator rend() const {
+    return const_reverse_iterator(start);
+  }
+
+  reference operator[](size_type n) { return start[difference_type(n)]; }
+  const_reference operator[](size_type n) const {
+    return start[difference_type(n)];
+  }
+
+  reference front() { return *start; }
+  reference back() {
+    iterator tmp = finish;
+    --tmp;
+    return *tmp;
+  }
+  const_reference front() const { return *start; }
+  const_reference back() const {
+    const_iterator tmp = finish;
+    --tmp;
+    return *tmp;
+  }
+
+  size_type size() const { return finish - start;; }
+  size_type max_size() const { return size_type(-1); }
+  bool empty() const { return finish == start; }
+
+public:                         // Constructor, destructor.
+  deque()
+    : start(), finish(), map(0), map_size(0)
+  {
+    create_map_and_nodes(0);
+  }
+
+  deque(const deque& x)
+    : start(), finish(), map(0), map_size(0)
+  {
+    create_map_and_nodes(x.size());
+    __STL_TRY {
+      uninitialized_copy(x.begin(), x.end(), start);
+    }
+    __STL_UNWIND(destroy_map_and_nodes());
+  }
+
+  deque(size_type n, const value_type& value)
+    : start(), finish(), map(0), map_size(0)
+  {
+    fill_initialize(n, value);
+  }
+
+  deque(int n, const value_type& value)
+    : start(), finish(), map(0), map_size(0)
+  {
+    fill_initialize(n, value);
+  }
+  deque(long n, const value_type& value)
+    : start(), finish(), map(0), map_size(0)
+  {
+    fill_initialize(n, value);
+  }
+
+  explicit deque(size_type n)
+    : start(), finish(), map(0), map_size(0)
+  {
+    fill_initialize(n, value_type());
+  }
+
+#ifdef __STL_MEMBER_TEMPLATES
+
+  template <class InputIterator>
+  deque(InputIterator first, InputIterator last)
+    : start(), finish(), map(0), map_size(0)
+  {
+    range_initialize(first, last, iterator_category(first));
+  }
+
+#else /* __STL_MEMBER_TEMPLATES */
+
+  deque(const value_type* first, const value_type* last)
+    : start(), finish(), map(0), map_size(0)
+  {
+    create_map_and_nodes(last - first);
+    __STL_TRY {
+      uninitialized_copy(first, last, start);
+    }
+    __STL_UNWIND(destroy_map_and_nodes());
+  }
+
+  deque(const_iterator first, const_iterator last)
+    : start(), finish(), map(0), map_size(0)
+  {
+    create_map_and_nodes(last - first);
+    __STL_TRY {
+      uninitialized_copy(first, last, start);
+    }
+    __STL_UNWIND(destroy_map_and_nodes());
+  }
+
+#endif /* __STL_MEMBER_TEMPLATES */
+
+  ~deque() {
+    destroy(start, finish);
+    destroy_map_and_nodes();
+  }
+
+  deque& operator= (const deque& x) {
+    const size_type len = size();
+    if (&x != this) {
+      if (len >= x.size())
+        erase(copy(x.begin(), x.end(), start), finish);
+      else {
+        const_iterator mid = x.begin() + difference_type(len);
+        copy(x.begin(), mid, start);
+        insert(finish, mid, x.end());
+      }
+    }
+    return *this;
+  }        
+
+  void swap(deque& x) {
+    __STD::swap(start, x.start);
+    __STD::swap(finish, x.finish);
+    __STD::swap(map, x.map);
+    __STD::swap(map_size, x.map_size);
+  }
+
+public:                         // push_* and pop_*
+  
+  void push_back(const value_type& t) {
+    if (finish.cur != finish.last - 1) {
+      construct(finish.cur, t);
+      ++finish.cur;
+    }
+    else
+      push_back_aux(t);
+  }
+
+  void push_front(const value_type& t) {
+    if (start.cur != start.first) {
+      construct(start.cur - 1, t);
+      --start.cur;
+    }
+    else
+      push_front_aux(t);
+  }
+
+  void pop_back() {
+    if (finish.cur != finish.first) {
+      --finish.cur;
+      destroy(finish.cur);
+    }
+    else
+      pop_back_aux();
+  }
+
+  void pop_front() {
+    if (start.cur != start.last - 1) {
+      destroy(start.cur);
+      ++start.cur;
+    }
+    else 
+      pop_front_aux();
+  }
+
+public:                         // Insert
+
+  iterator insert(iterator position, const value_type& x) {
+    if (position.cur == start.cur) {
+      push_front(x);
+      return start;
+    }
+    else if (position.cur == finish.cur) {
+      push_back(x);
+      iterator tmp = finish;
+      --tmp;
+      return tmp;
+    }
+    else {
+      return insert_aux(position, x);
+    }
+  }
+
+  iterator insert(iterator position) { return insert(position, value_type()); }
+
+  void insert(iterator pos, size_type n, const value_type& x); 
+
+  void insert(iterator pos, int n, const value_type& x) {
+    insert(pos, (size_type) n, x);
+  }
+  void insert(iterator pos, long n, const value_type& x) {
+    insert(pos, (size_type) n, x);
+  }
+
+#ifdef __STL_MEMBER_TEMPLATES  
+
+  template <class InputIterator>
+  void insert(iterator pos, InputIterator first, InputIterator last) {
+    insert(pos, first, last, iterator_category(first));
+  }
+
+#else /* __STL_MEMBER_TEMPLATES */
+
+  void insert(iterator pos, const value_type* first, const value_type* last);
+  void insert(iterator pos, const_iterator first, const_iterator last);
+
+#endif /* __STL_MEMBER_TEMPLATES */
+
+  void resize(size_type new_size, const value_type& x) {
+    const size_type len = size();
+    if (new_size < len) 
+      erase(start + new_size, finish);
+    else
+      insert(finish, new_size - len, x);
+  }
+
+  void resize(size_type new_size) { resize(new_size, value_type()); }
+
+public:                         // Erase
+  iterator erase(iterator pos) {
+    iterator next = pos;
+    ++next;
+    difference_type index = pos - start;
+    if (index < size() >> 1) {
+      copy_backward(start, pos, next);
+      pop_front();
+    }
+    else {
+      copy(next, finish, pos);
+      pop_back();
+    }
+    return start + index;
+  }
+
+  iterator erase(iterator first, iterator last);
+  void clear(); 
+
+protected:                        // Internal construction/destruction
+
+  void create_map_and_nodes(size_type num_elements);
+  void destroy_map_and_nodes();
+  void fill_initialize(size_type n, const value_type& value);
+
+#ifdef __STL_MEMBER_TEMPLATES  
+
+  template <class InputIterator>
+  void range_initialize(InputIterator first, InputIterator last,
+                        input_iterator_tag);
+
+  template <class ForwardIterator>
+  void range_initialize(ForwardIterator first, ForwardIterator last,
+                        forward_iterator_tag);
+
+#endif /* __STL_MEMBER_TEMPLATES */
+
+protected:                        // Internal push_* and pop_*
+
+  void push_back_aux(const value_type& t);
+  void push_front_aux(const value_type& t);
+  void pop_back_aux();
+  void pop_front_aux();
+
+protected:                        // Internal insert functions
+
+#ifdef __STL_MEMBER_TEMPLATES  
+
+  template <class InputIterator>
+  void insert(iterator pos, InputIterator first, InputIterator last,
+              input_iterator_tag);
+
+  template <class ForwardIterator>
+  void insert(iterator pos, ForwardIterator first, ForwardIterator last,
+              forward_iterator_tag);
+
+#endif /* __STL_MEMBER_TEMPLATES */
+
+  iterator insert_aux(iterator pos, const value_type& x);
+  void insert_aux(iterator pos, size_type n, const value_type& x);
+
+#ifdef __STL_MEMBER_TEMPLATES  
+
+  template <class ForwardIterator>
+  void insert_aux(iterator pos, ForwardIterator first, ForwardIterator last,
+                  size_type n);
+
+#else /* __STL_MEMBER_TEMPLATES */
+  
+  void insert_aux(iterator pos,
+                  const value_type* first, const value_type* last,
+                  size_type n);
+
+  void insert_aux(iterator pos, const_iterator first, const_iterator last,
+                  size_type n);
+#endif /* __STL_MEMBER_TEMPLATES */
+
+  iterator reserve_elements_at_front(size_type n) {
+    size_type vacancies = start.cur - start.first;
+    if (n > vacancies) 
+      new_elements_at_front(n - vacancies);
+    return start - difference_type(n);
+  }
+
+  iterator reserve_elements_at_back(size_type n) {
+    size_type vacancies = (finish.last - finish.cur) - 1;
+    if (n > vacancies)
+      new_elements_at_back(n - vacancies);
+    return finish + difference_type(n);
+  }
+
+  void new_elements_at_front(size_type new_elements);
+  void new_elements_at_back(size_type new_elements);
+
+  void destroy_nodes_at_front(iterator before_start);
+  void destroy_nodes_at_back(iterator after_finish);
+
+protected:                      // Allocation of map and nodes
+
+  // Makes sure the map has space for new nodes.  Does not actually
+  //  add the nodes.  Can invalidate map pointers.  (And consequently, 
+  //  deque iterators.)
+
+  void reserve_map_at_back (size_type nodes_to_add = 1) {
+    if (nodes_to_add + 1 > map_size - (finish.node - map))
+      reallocate_map(nodes_to_add, false);
+  }
+
+  void reserve_map_at_front (size_type nodes_to_add = 1) {
+    if (nodes_to_add > start.node - map)
+      reallocate_map(nodes_to_add, true);
+  }
+
+  void reallocate_map(size_type nodes_to_add, bool add_at_front);
+
+  pointer allocate_node() { return data_allocator::allocate(buffer_size()); }
+  void deallocate_node(pointer n) {
+    data_allocator::deallocate(n, buffer_size());
+  }
+
+#ifdef __STL_NON_TYPE_TMPL_PARAM_BUG
+public:
+  bool operator==(const deque<T, Alloc, 0>& x) const {
+    return size() == x.size() && equal(begin(), end(), x.begin());
+  }
+  bool operator!=(const deque<T, Alloc, 0>& x) const {
+    return size() != x.size() || !equal(begin(), end(), x.begin());
+  }
+  bool operator<(const deque<T, Alloc, 0>& x) const {
+    return lexicographical_compare(begin(), end(), x.begin(), x.end());
+  }
+#endif /* __STL_NON_TYPE_TMPL_PARAM_BUG */
+};
+
+// Non-inline member functions
+
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::insert(iterator pos,
+                                      size_type n, const value_type& x) {
+  if (pos.cur == start.cur) {
+    iterator new_start = reserve_elements_at_front(n);
+    uninitialized_fill(new_start, start, x);
+    start = new_start;
+  }
+  else if (pos.cur == finish.cur) {
+    iterator new_finish = reserve_elements_at_back(n);
+    uninitialized_fill(finish, new_finish, x);
+    finish = new_finish;
+  }
+  else 
+    insert_aux(pos, n, x);
+}
+
+#ifndef __STL_MEMBER_TEMPLATES  
+
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::insert(iterator pos,
+                                      const value_type* first,
+                                      const value_type* last) {
+  size_type n = last - first;
+  if (pos.cur == start.cur) {
+    iterator new_start = reserve_elements_at_front(n);
+    __STL_TRY {
+      uninitialized_copy(first, last, new_start);
+      start = new_start;
+    }
+    __STL_UNWIND(destroy_nodes_at_front(new_start));
+  }
+  else if (pos.cur == finish.cur) {
+    iterator new_finish = reserve_elements_at_back(n);
+    __STL_TRY {
+      uninitialized_copy(first, last, finish);
+      finish = new_finish;
+    }
+    __STL_UNWIND(destroy_nodes_at_back(new_finish));
+  }
+  else
+    insert_aux(pos, first, last, n);
+}
+
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::insert(iterator pos,
+                                      const_iterator first,
+                                      const_iterator last)
+{
+  size_type n = last - first;
+  if (pos.cur == start.cur) {
+    iterator new_start = reserve_elements_at_front(n);
+    __STL_TRY {
+      uninitialized_copy(first, last, new_start);
+      start = new_start;
+    }
+    __STL_UNWIND(destroy_nodes_at_front(new_start));
+  }
+  else if (pos.cur == finish.cur) {
+    iterator new_finish = reserve_elements_at_back(n);
+    __STL_TRY {
+      uninitialized_copy(first, last, finish);
+      finish = new_finish;
+    }
+    __STL_UNWIND(destroy_nodes_at_back(new_finish));
+  }
+  else
+    insert_aux(pos, first, last, n);
+}
+
+#endif /* __STL_MEMBER_TEMPLATES */
+
+template <class T, class Alloc, size_t BufSize>
+deque<T, Alloc, BufSize>::iterator 
+deque<T, Alloc, BufSize>::erase(iterator first, iterator last) {
+  if (first == start && last == finish) {
+    clear();
+    return finish;
+  }
+  else {
+    difference_type n = last - first;
+    difference_type elems_before = first - start;
+    if (elems_before < (size() - n) / 2) {
+      copy_backward(start, first, last);
+      iterator new_start = start + n;
+      destroy(start, new_start);
+      for (map_pointer cur = start.node; cur < new_start.node; ++cur)
+        data_allocator::deallocate(*cur, buffer_size());
+      start = new_start;
+    }
+    else {
+      copy(last, finish, first);
+      iterator new_finish = finish - n;
+      destroy(new_finish, finish);
+      for (map_pointer cur = new_finish.node + 1; cur <= finish.node; ++cur)
+        data_allocator::deallocate(*cur, buffer_size());
+      finish = new_finish;
+    }
+    return start + elems_before;
+  }
+}
+
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::clear() {
+  for (map_pointer node = start.node + 1; node < finish.node; ++node) {
+    destroy(*node, *node + buffer_size());
+    data_allocator::deallocate(*node, buffer_size());
+  }
+
+  if (start.node != finish.node) {
+    destroy(start.cur, start.last);
+    destroy(finish.first, finish.cur);
+    data_allocator::deallocate(finish.first, buffer_size());
+  }
+  else
+    destroy(start.cur, finish.cur);
+
+  finish = start;
+}
+
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::create_map_and_nodes(size_type num_elements) {
+  size_type num_nodes = num_elements / buffer_size() + 1;
+
+  map_size = max(initial_map_size(), num_nodes + 2);
+  map = map_allocator::allocate(map_size);
+
+  map_pointer nstart = map + (map_size - num_nodes) / 2;
+  map_pointer nfinish = nstart + num_nodes - 1;
+    
+  map_pointer cur;
+  __STL_TRY {
+    for (cur = nstart; cur <= nfinish; ++cur)
+      *cur = allocate_node();
+  }
+#     ifdef  __STL_USE_EXCEPTIONS 
+  catch(...) {
+    for (map_pointer n = nstart; n < cur; ++n)
+      deallocate_node(*n);
+    map_allocator::deallocate(map, map_size);
+    throw;
+  }
+#     endif /* __STL_USE_EXCEPTIONS */
+
+  start.set_node(nstart);
+  finish.set_node(nfinish);
+  start.cur = start.first;
+  finish.cur = finish.first + num_elements % buffer_size();
+}
+
+// This is only used as a cleanup function in catch clauses.
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::destroy_map_and_nodes() {
+  for (map_pointer cur = start.node; cur <= finish.node; ++cur)
+    deallocate_node(*cur);
+  map_allocator::deallocate(map, map_size);
+}
+  
+
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::fill_initialize(size_type n,
+                                               const value_type& value) {
+  create_map_and_nodes(n);
+  map_pointer cur;
+  __STL_TRY {
+    for (cur = start.node; cur < finish.node; ++cur)
+      uninitialized_fill(*cur, *cur + buffer_size(), value);
+    uninitialized_fill(finish.first, finish.cur, value);
+  }
+#       ifdef __STL_USE_EXCEPTIONS
+  catch(...) {
+    for (map_pointer n = start.node; n < cur; ++n)
+      destroy(*n, *n + buffer_size());
+    destroy_map_and_nodes();
+    throw;
+  }
+#       endif /* __STL_USE_EXCEPTIONS */
+}
+
+#ifdef __STL_MEMBER_TEMPLATES  
+
+template <class T, class Alloc, size_t BufSize>
+template <class InputIterator>
+void deque<T, Alloc, BufSize>::range_initialize(InputIterator first,
+                                                InputIterator last,
+                                                input_iterator_tag) {
+  create_map_and_nodes(0);
+  for ( ; first != last; ++first)
+    push_back(*first);
+}
+
+template <class T, class Alloc, size_t BufSize>
+template <class ForwardIterator>
+void deque<T, Alloc, BufSize>::range_initialize(ForwardIterator first,
+                                                ForwardIterator last,
+                                                forward_iterator_tag) {
+  size_type n = 0;
+  distance(first, last, n);
+  create_map_and_nodes(n);
+  __STL_TRY {
+    uninitialized_copy(first, last, start);
+  }
+  __STL_UNWIND(destroy_map_and_nodes());
+}
+
+#endif /* __STL_MEMBER_TEMPLATES */
+
+// Called only if finish.cur == finish.last - 1.
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::push_back_aux(const value_type& t) {
+  value_type t_copy = t;
+  reserve_map_at_back();
+  *(finish.node + 1) = allocate_node();
+  __STL_TRY {
+    construct(finish.cur, t_copy);
+    finish.set_node(finish.node + 1);
+    finish.cur = finish.first;
+  }
+  __STL_UNWIND(deallocate_node(*(finish.node + 1)));
+}
+
+// Called only if start.cur == start.first.
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::push_front_aux(const value_type& t) {
+  value_type t_copy = t;
+  reserve_map_at_front();
+  *(start.node - 1) = allocate_node();
+  __STL_TRY {
+    start.set_node(start.node - 1);
+    start.cur = start.last - 1;
+    construct(start.cur, t_copy);
+  }
+#     ifdef __STL_USE_EXCEPTIONS
+  catch(...) {
+    start.set_node(start.node + 1);
+    start.cur = start.first;
+    deallocate_node(*(start.node - 1));
+    throw;
+  }
+#     endif /* __STL_USE_EXCEPTIONS */
+} 
+
+// Called only if finish.cur == finish.first.
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>:: pop_back_aux() {
+  deallocate_node(finish.first);
+  finish.set_node(finish.node - 1);
+  finish.cur = finish.last - 1;
+  destroy(finish.cur);
+}
+
+// Called only if start.cur == start.last - 1.  Note that if the deque
+//  has at least one element (a necessary precondition for this member
+//  function), and if start.cur == start.last, then the deque must have
+//  at least two nodes.
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::pop_front_aux() {
+  destroy(start.cur);
+  deallocate_node(start.first);
+  start.set_node(start.node + 1);
+  start.cur = start.first;
+}      
+
+#ifdef __STL_MEMBER_TEMPLATES  
+
+template <class T, class Alloc, size_t BufSize>
+template <class InputIterator>
+void deque<T, Alloc, BufSize>::insert(iterator pos,
+                                      InputIterator first, InputIterator last,
+                                      input_iterator_tag) {
+  copy(first, last, inserter(*this, pos));
+}
+
+template <class T, class Alloc, size_t BufSize>
+template <class ForwardIterator>
+void deque<T, Alloc, BufSize>::insert(iterator pos,
+                                      ForwardIterator first,
+                                      ForwardIterator last,
+                                      forward_iterator_tag) {
+  size_type n = 0;
+  distance(first, last, n);
+  if (pos.cur == start.cur) {
+    iterator new_start = reserve_elements_at_front(n);
+    __STL_TRY {
+      uninitialized_copy(first, last, new_start);
+      start = new_start;
+    }
+    __STL_UNWIND(destroy_nodes_at_front(new_start));
+  }
+  else if (pos.cur == finish.cur) {
+    iterator new_finish = reserve_elements_at_back(n);
+    __STL_TRY {
+      uninitialized_copy(first, last, finish);
+      finish = new_finish;
+    }
+    __STL_UNWIND(destroy_nodes_at_back(new_finish));
+  }
+  else
+    insert_aux(pos, first, last, n);
+}
+
+#endif /* __STL_MEMBER_TEMPLATES */
+
+template <class T, class Alloc, size_t BufSize>
+typename deque<T, Alloc, BufSize>::iterator
+deque<T, Alloc, BufSize>::insert_aux(iterator pos, const value_type& x) {
+  difference_type index = pos - start;
+  value_type x_copy = x;
+  if (index < size() / 2) {
+    push_front(front());
+    iterator front1 = start;
+    ++front1;
+    iterator front2 = front1;
+    ++front2;
+    pos = start + index;
+    iterator pos1 = pos;
+    ++pos1;
+    copy(front2, pos1, front1);
+  }
+  else {
+    push_back(back());
+    iterator back1 = finish;
+    --back1;
+    iterator back2 = back1;
+    --back2;
+    pos = start + index;
+    copy_backward(pos, back2, back1);
+  }
+  *pos = x_copy;
+  return pos;
+}
+
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::insert_aux(iterator pos,
+                                          size_type n, const value_type& x) {
+  const difference_type elems_before = pos - start;
+  size_type length = size();
+  value_type x_copy = x;
+  if (elems_before < length / 2) {
+    iterator new_start = reserve_elements_at_front(n);
+    iterator old_start = start;
+    pos = start + elems_before;
+    __STL_TRY {
+      if (elems_before >= difference_type(n)) {
+        iterator start_n = start + difference_type(n);
+        uninitialized_copy(start, start_n, new_start);
+        start = new_start;
+        copy(start_n, pos, old_start);
+        fill(pos - difference_type(n), pos, x_copy);
+      }
+      else {
+        __uninitialized_copy_fill(start, pos, new_start, start, x_copy);
+        start = new_start;
+        fill(old_start, pos, x_copy);
+      }
+    }
+    __STL_UNWIND(destroy_nodes_at_front(new_start));
+  }
+  else {
+    iterator new_finish = reserve_elements_at_back(n);
+    iterator old_finish = finish;
+    const difference_type elems_after = difference_type(length) - elems_before;
+    pos = finish - elems_after;
+    __STL_TRY {
+      if (elems_after > difference_type(n)) {
+        iterator finish_n = finish - difference_type(n);
+        uninitialized_copy(finish_n, finish, finish);
+        finish = new_finish;
+        copy_backward(pos, finish_n, old_finish);
+        fill(pos, pos + difference_type(n), x_copy);
+      }
+      else {
+        __uninitialized_fill_copy(finish, pos + difference_type(n),
+                                  x_copy,
+                                  pos, finish);
+        finish = new_finish;
+        fill(pos, old_finish, x_copy);
+      }
+    }
+    __STL_UNWIND(destroy_nodes_at_back(new_finish));
+  }
+}
+
+#ifdef __STL_MEMBER_TEMPLATES  
+
+template <class T, class Alloc, size_t BufSize>
+template <class ForwardIterator>
+void deque<T, Alloc, BufSize>::insert_aux(iterator pos,
+                                          ForwardIterator first,
+                                          ForwardIterator last,
+                                          size_type n)
+{
+  const difference_type elems_before = pos - start;
+  size_type length = size();
+  if (elems_before < length / 2) {
+    iterator new_start = reserve_elements_at_front(n);
+    iterator old_start = start;
+    pos = start + elems_before;
+    __STL_TRY {
+      if (elems_before >= difference_type(n)) {
+        iterator start_n = start + difference_type(n); 
+        uninitialized_copy(start, start_n, new_start);
+        start = new_start;
+        copy(start_n, pos, old_start);
+        copy(first, last, pos - difference_type(n));
+      }
+      else {
+        ForwardIterator mid = first;
+        advance(mid, difference_type(n) - elems_before);
+        __uninitialized_copy_copy(start, pos, first, mid, new_start);
+        start = new_start;
+        copy(mid, last, old_start);
+      }
+    }
+    __STL_UNWIND(destroy_nodes_at_front(new_start));
+  }
+  else {
+    iterator new_finish = reserve_elements_at_back(n);
+    iterator old_finish = finish;
+    const difference_type elems_after = difference_type(length) - elems_before;
+    pos = finish - elems_after;
+    __STL_TRY {
+      if (elems_after > difference_type(n)) {
+        iterator finish_n = finish - difference_type(n);
+        uninitialized_copy(finish_n, finish, finish);
+        finish = new_finish;
+        copy_backward(pos, finish_n, old_finish);
+        copy(first, last, pos);
+      }
+      else {
+        ForwardIterator mid = first;
+        advance(mid, elems_after);
+        __uninitialized_copy_copy(mid, last, pos, finish, finish);
+        finish = new_finish;
+        copy(first, mid, pos);
+      }
+    }
+    __STL_UNWIND(destroy_nodes_at_back(new_finish));
+  }
+}
+
+#else /* __STL_MEMBER_TEMPLATES */
+
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::insert_aux(iterator pos,
+                                          const value_type* first,
+                                          const value_type* last,
+                                          size_type n)
+{
+  const difference_type elems_before = pos - start;
+  size_type length = size();
+  if (elems_before < length / 2) {
+    iterator new_start = reserve_elements_at_front(n);
+    iterator old_start = start;
+    pos = start + elems_before;
+    __STL_TRY {
+      if (elems_before >= difference_type(n)) {
+        iterator start_n = start + difference_type(n);
+        uninitialized_copy(start, start_n, new_start);
+        start = new_start;
+        copy(start_n, pos, old_start);
+        copy(first, last, pos - difference_type(n));
+      }
+      else {
+        const value_type* mid = first + (difference_type(n) - elems_before);
+        __uninitialized_copy_copy(start, pos, first, mid, new_start);
+        start = new_start;
+        copy(mid, last, old_start);
+      }
+    }
+    __STL_UNWIND(destroy_nodes_at_front(new_start));
+  }
+  else {
+    iterator new_finish = reserve_elements_at_back(n);
+    iterator old_finish = finish;
+    const difference_type elems_after = difference_type(length) - elems_before;
+    pos = finish - elems_after;
+    __STL_TRY {
+      if (elems_after > difference_type(n)) {
+        iterator finish_n = finish - difference_type(n);
+        uninitialized_copy(finish_n, finish, finish);
+        finish = new_finish;
+        copy_backward(pos, finish_n, old_finish);
+        copy(first, last, pos);
+      }
+      else {
+        const value_type* mid = first + elems_after;
+        __uninitialized_copy_copy(mid, last, pos, finish, finish);
+        finish = new_finish;
+        copy(first, mid, pos);
+      }
+    }
+    __STL_UNWIND(destroy_nodes_at_back(new_finish));
+  }
+}
+
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::insert_aux(iterator pos,
+                                          const_iterator first,
+                                          const_iterator last,
+                                          size_type n)
+{
+  const difference_type elems_before = pos - start;
+  size_type length = size();
+  if (elems_before < length / 2) {
+    iterator new_start = reserve_elements_at_front(n);
+    iterator old_start = start;
+    pos = start + elems_before;
+    __STL_TRY {
+      if (elems_before >= n) {
+        iterator start_n = start + n;
+        uninitialized_copy(start, start_n, new_start);
+        start = new_start;
+        copy(start_n, pos, old_start);
+        copy(first, last, pos - difference_type(n));
+      }
+      else {
+        const_iterator mid = first + (n - elems_before);
+        __uninitialized_copy_copy(start, pos, first, mid, new_start);
+        start = new_start;
+        copy(mid, last, old_start);
+      }
+    }
+    __STL_UNWIND(destroy_nodes_at_front(new_start));
+  }
+  else {
+    iterator new_finish = reserve_elements_at_back(n);
+    iterator old_finish = finish;
+    const difference_type elems_after = length - elems_before;
+    pos = finish - elems_after;
+    __STL_TRY {
+      if (elems_after > n) {
+        iterator finish_n = finish - difference_type(n);
+        uninitialized_copy(finish_n, finish, finish);
+        finish = new_finish;
+        copy_backward(pos, finish_n, old_finish);
+        copy(first, last, pos);
+      }
+      else {
+        const_iterator mid = first + elems_after;
+        __uninitialized_copy_copy(mid, last, pos, finish, finish);
+        finish = new_finish;
+        copy(first, mid, pos);
+      }
+    }
+    __STL_UNWIND(destroy_nodes_at_back(new_finish));
+  }
+}
+
+#endif /* __STL_MEMBER_TEMPLATES */
+
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::new_elements_at_front(size_type new_elements) {
+  size_type new_nodes = (new_elements + buffer_size() - 1) / buffer_size();
+  reserve_map_at_front(new_nodes);
+  size_type i;
+  __STL_TRY {
+    for (i = 1; i <= new_nodes; ++i)
+      *(start.node - i) = allocate_node();
+  }
+#       ifdef __STL_USE_EXCEPTIONS
+  catch(...) {
+    for (size_type j = 1; j < i; ++j)
+      deallocate_node(*(start.node - j));      
+    throw;
+  }
+#       endif /* __STL_USE_EXCEPTIONS */
+}
+
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::new_elements_at_back(size_type new_elements) {
+  size_type new_nodes = (new_elements + buffer_size() - 1) / buffer_size();
+  reserve_map_at_back(new_nodes);
+  size_type i;
+  __STL_TRY {
+    for (i = 1; i <= new_nodes; ++i)
+      *(finish.node + i) = allocate_node();
+  }
+#       ifdef __STL_USE_EXCEPTIONS
+  catch(...) {
+    for (size_type j = 1; j < i; ++j)
+      deallocate_node(*(finish.node + j));      
+    throw;
+  }
+#       endif /* __STL_USE_EXCEPTIONS */
+}
+
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::destroy_nodes_at_front(iterator before_start) {
+  for (map_pointer n = before_start.node; n < start.node; ++n)
+    deallocate_node(*n);
+}
+
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::destroy_nodes_at_back(iterator after_finish) {
+  for (map_pointer n = after_finish.node; n > finish.node; --n)
+    deallocate_node(*n);
+}
+
+template <class T, class Alloc, size_t BufSize>
+void deque<T, Alloc, BufSize>::reallocate_map(size_type nodes_to_add,
+                                              bool add_at_front) {
+  size_type old_num_nodes = finish.node - start.node + 1;
+  size_type new_num_nodes = old_num_nodes + nodes_to_add;
+
+  map_pointer new_nstart;
+  if (map_size > 2 * new_num_nodes) {
+    new_nstart = map + (map_size - new_num_nodes) / 2 
+                     + (add_at_front ? nodes_to_add : 0);
+    if (new_nstart < start.node)
+      copy(start.node, finish.node + 1, new_nstart);
+    else
+      copy_backward(start.node, finish.node + 1, new_nstart + old_num_nodes);
+  }
+  else {
+    size_type new_map_size = map_size + max(map_size, nodes_to_add) + 2;
+
+    map_pointer new_map = map_allocator::allocate(new_map_size);
+    new_nstart = new_map + (new_map_size - new_num_nodes) / 2
+                         + (add_at_front ? nodes_to_add : 0);
+    copy(start.node, finish.node + 1, new_nstart);
+    map_allocator::deallocate(map, map_size);
+
+    map = new_map;
+    map_size = new_map_size;
+  }
+
+  start.set_node(new_nstart);
+  finish.set_node(new_nstart + old_num_nodes - 1);
+}
+
+
+// Nonmember functions.
+
+#ifndef __STL_NON_TYPE_TMPL_PARAM_BUG
+
+template <class T, class Alloc, size_t BufSiz>
+bool operator==(const deque<T, Alloc, BufSiz>& x,
+                const deque<T, Alloc, BufSiz>& y) {
+  return x.size() == y.size() && equal(x.begin(), x.end(), y.begin());
+}
+
+template <class T, class Alloc, size_t BufSiz>
+bool operator<(const deque<T, Alloc, BufSiz>& x,
+               const deque<T, Alloc, BufSiz>& y) {
+  return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());
+}
+
+#endif /* __STL_NON_TYPE_TMPL_PARAM_BUG */
+
+#if defined(__STL_FUNCTION_TMPL_PARTIAL_ORDER) && \
+    !defined(__STL_NON_TYPE_TMPL_PARAM_BUG)
+
+template <class T, class Alloc, size_t BufSiz>
+inline void swap(deque<T, Alloc, BufSiz>& x, deque<T, Alloc, BufSiz>& y) {
+  x.swap(y);
+}
+
+#endif
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1174
+#endif
+          
+__STL_END_NAMESPACE 
+  
+#endif /* __SGI_STL_INTERNAL_DEQUE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_function.h b/libstdc++/stl/stl_function.h
new file mode 100644 (file)
index 0000000..c0d785d
--- /dev/null
@@ -0,0 +1,628 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_FUNCTION_H
+#define __SGI_STL_INTERNAL_FUNCTION_H
+
+__STL_BEGIN_NAMESPACE
+
+template <class Arg, class Result>
+struct unary_function {
+    typedef Arg argument_type;
+    typedef Result result_type;
+};
+
+template <class Arg1, class Arg2, class Result>
+struct binary_function {
+    typedef Arg1 first_argument_type;
+    typedef Arg2 second_argument_type;
+    typedef Result result_type;
+};      
+
+template <class T>
+struct plus : public binary_function<T, T, T> {
+    T operator()(const T& x, const T& y) const { return x + y; }
+};
+
+template <class T>
+struct minus : public binary_function<T, T, T> {
+    T operator()(const T& x, const T& y) const { return x - y; }
+};
+
+template <class T>
+struct multiplies : public binary_function<T, T, T> {
+    T operator()(const T& x, const T& y) const { return x * y; }
+};
+
+template <class T>
+struct divides : public binary_function<T, T, T> {
+    T operator()(const T& x, const T& y) const { return x / y; }
+};
+
+template <class T> inline T identity_element(plus<T>) { return T(0); }
+
+template <class T> inline T identity_element(multiplies<T>) { return T(1); }
+
+template <class T>
+struct modulus : public binary_function<T, T, T> {
+    T operator()(const T& x, const T& y) const { return x % y; }
+};
+
+template <class T>
+struct negate : public unary_function<T, T> {
+    T operator()(const T& x) const { return -x; }
+};
+
+template <class T>
+struct equal_to : public binary_function<T, T, bool> {
+    bool operator()(const T& x, const T& y) const { return x == y; }
+};
+
+template <class T>
+struct not_equal_to : public binary_function<T, T, bool> {
+    bool operator()(const T& x, const T& y) const { return x != y; }
+};
+
+template <class T>
+struct greater : public binary_function<T, T, bool> {
+    bool operator()(const T& x, const T& y) const { return x > y; }
+};
+
+template <class T>
+struct less : public binary_function<T, T, bool> {
+    bool operator()(const T& x, const T& y) const { return x < y; }
+};
+
+template <class T>
+struct greater_equal : public binary_function<T, T, bool> {
+    bool operator()(const T& x, const T& y) const { return x >= y; }
+};
+
+template <class T>
+struct less_equal : public binary_function<T, T, bool> {
+    bool operator()(const T& x, const T& y) const { return x <= y; }
+};
+
+template <class T>
+struct logical_and : public binary_function<T, T, bool> {
+    bool operator()(const T& x, const T& y) const { return x && y; }
+};
+
+template <class T>
+struct logical_or : public binary_function<T, T, bool> {
+    bool operator()(const T& x, const T& y) const { return x || y; }
+};
+
+template <class T>
+struct logical_not : public unary_function<T, bool> {
+    bool operator()(const T& x) const { return !x; }
+};
+
+template <class Predicate>
+class unary_negate
+  : public unary_function<typename Predicate::argument_type, bool> {
+protected:
+  Predicate pred;
+public:
+  explicit unary_negate(const Predicate& x) : pred(x) {}
+  bool operator()(const typename Predicate::argument_type& x) const {
+    return !pred(x);
+  }
+};
+
+template <class Predicate>
+inline unary_negate<Predicate> not1(const Predicate& pred) {
+  return unary_negate<Predicate>(pred);
+}
+
+template <class Predicate> 
+class binary_negate 
+  : public binary_function<typename Predicate::first_argument_type,
+                           typename Predicate::second_argument_type,
+                           bool> {
+protected:
+  Predicate pred;
+public:
+  explicit binary_negate(const Predicate& x) : pred(x) {}
+  bool operator()(const typename Predicate::first_argument_type& x, 
+                  const typename Predicate::second_argument_type& y) const {
+    return !pred(x, y); 
+  }
+};
+
+template <class Predicate>
+inline binary_negate<Predicate> not2(const Predicate& pred) {
+  return binary_negate<Predicate>(pred);
+}
+
+template <class Operation> 
+class binder1st
+  : public unary_function<typename Operation::second_argument_type,
+                          typename Operation::result_type> {
+protected:
+  Operation op;
+  typename Operation::first_argument_type value;
+public:
+  binder1st(const Operation& x,
+            const typename Operation::first_argument_type& y)
+      : op(x), value(y) {}
+  typename Operation::result_type
+  operator()(const typename Operation::second_argument_type& x) const {
+    return op(value, x); 
+  }
+};
+
+template <class Operation, class T>
+inline binder1st<Operation> bind1st(const Operation& op, const T& x) {
+  typedef typename Operation::first_argument_type arg1_type;
+  return binder1st<Operation>(op, arg1_type(x));
+}
+
+template <class Operation> 
+class binder2nd
+  : public unary_function<typename Operation::first_argument_type,
+                          typename Operation::result_type> {
+protected:
+  Operation op;
+  typename Operation::second_argument_type value;
+public:
+  binder2nd(const Operation& x,
+            const typename Operation::second_argument_type& y) 
+      : op(x), value(y) {}
+  typename Operation::result_type
+  operator()(const typename Operation::first_argument_type& x) const {
+    return op(x, value); 
+  }
+};
+
+template <class Operation, class T>
+inline binder2nd<Operation> bind2nd(const Operation& op, const T& x) {
+  typedef typename Operation::second_argument_type arg2_type;
+  return binder2nd<Operation>(op, arg2_type(x));
+}
+
+template <class Operation1, class Operation2>
+class unary_compose : public unary_function<typename Operation2::argument_type,
+                                            typename Operation1::result_type> {
+protected:
+  Operation1 op1;
+  Operation2 op2;
+public:
+  unary_compose(const Operation1& x, const Operation2& y) : op1(x), op2(y) {}
+  typename Operation1::result_type
+  operator()(const typename Operation2::argument_type& x) const {
+    return op1(op2(x));
+  }
+};
+
+template <class Operation1, class Operation2>
+inline unary_compose<Operation1, Operation2> compose1(const Operation1& op1, 
+                                                      const Operation2& op2) {
+  return unary_compose<Operation1, Operation2>(op1, op2);
+}
+
+template <class Operation1, class Operation2, class Operation3>
+class binary_compose
+  : public unary_function<typename Operation2::argument_type,
+                          typename Operation1::result_type> {
+protected:
+  Operation1 op1;
+  Operation2 op2;
+  Operation3 op3;
+public:
+  binary_compose(const Operation1& x, const Operation2& y, 
+                 const Operation3& z) : op1(x), op2(y), op3(z) { }
+  typename Operation1::result_type
+  operator()(const typename Operation2::argument_type& x) const {
+    return op1(op2(x), op3(x));
+  }
+};
+
+template <class Operation1, class Operation2, class Operation3>
+inline binary_compose<Operation1, Operation2, Operation3> 
+compose2(const Operation1& op1, const Operation2& op2, const Operation3& op3) {
+  return binary_compose<Operation1, Operation2, Operation3>(op1, op2, op3);
+}
+
+template <class Arg, class Result>
+class pointer_to_unary_function : public unary_function<Arg, Result> {
+protected:
+  Result (*ptr)(Arg);
+public:
+  pointer_to_unary_function() {}
+  explicit pointer_to_unary_function(Result (*x)(Arg)) : ptr(x) {}
+  Result operator()(Arg x) const { return ptr(x); }
+};
+
+template <class Arg, class Result>
+inline pointer_to_unary_function<Arg, Result> ptr_fun(Result (*x)(Arg)) {
+  return pointer_to_unary_function<Arg, Result>(x);
+}
+
+template <class Arg1, class Arg2, class Result>
+class pointer_to_binary_function : public binary_function<Arg1, Arg2, Result> {
+protected:
+    Result (*ptr)(Arg1, Arg2);
+public:
+    pointer_to_binary_function() {}
+    explicit pointer_to_binary_function(Result (*x)(Arg1, Arg2)) : ptr(x) {}
+    Result operator()(Arg1 x, Arg2 y) const { return ptr(x, y); }
+};
+
+template <class Arg1, class Arg2, class Result>
+inline pointer_to_binary_function<Arg1, Arg2, Result> 
+ptr_fun(Result (*x)(Arg1, Arg2)) {
+  return pointer_to_binary_function<Arg1, Arg2, Result>(x);
+}
+
+template <class T>
+struct identity : public unary_function<T, T> {
+  const T& operator()(const T& x) const { return x; }
+};
+
+template <class Pair>
+struct select1st : public unary_function<Pair, typename Pair::first_type> {
+  const typename Pair::first_type& operator()(const Pair& x) const
+  {
+    return x.first;
+  }
+};
+
+template <class Pair>
+struct select2nd : public unary_function<Pair, typename Pair::second_type> {
+  const typename Pair::second_type& operator()(const Pair& x) const
+  {
+    return x.second;
+  }
+};
+
+template <class Arg1, class Arg2>
+struct project1st : public binary_function<Arg1, Arg2, Arg1> {
+  Arg1 operator()(const Arg1& x, const Arg2&) const { return x; }
+};
+
+template <class Arg1, class Arg2>
+struct project2nd : public binary_function<Arg1, Arg2, Arg2> {
+  Arg2 operator()(const Arg1&, const Arg2& y) const { return y; }
+};
+
+template <class Result>
+struct constant_void_fun
+{
+  typedef Result result_type;
+  result_type val;
+  constant_void_fun(const result_type& v) : val(v) {}
+  const result_type& operator()() const { return val; }
+};  
+
+#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
+template <class Result, class Argument = Result>
+#else
+template <class Result, class Argument>
+#endif
+struct constant_unary_fun : public unary_function<Argument, Result> {
+  Result val;
+  constant_unary_fun(const Result& v) : val(v) {}
+  const Result& operator()(const Argument&) const { return val; }
+};
+
+#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
+template <class Result, class Arg1 = Result, class Arg2 = Arg1>
+#else
+template <class Result, class Arg1, class Arg2>
+#endif
+struct constant_binary_fun : public binary_function<Arg1, Arg2, Result> {
+  Result val;
+  constant_binary_fun(const Result& v) : val(v) {}
+  const Result& operator()(const Arg1&, const Arg2&) const {
+    return val;
+  }
+};
+
+template <class Result>
+inline constant_void_fun<Result> constant0(const Result& val)
+{
+  return constant_void_fun<Result>(val);
+}
+
+template <class Result>
+inline constant_unary_fun<Result,Result> constant1(const Result& val)
+{
+  return constant_unary_fun<Result,Result>(val);
+}
+
+template <class Result>
+inline constant_binary_fun<Result,Result,Result> constant2(const Result& val)
+{
+  return constant_binary_fun<Result,Result,Result>(val);
+}
+
+// Note: this code assumes that int is 32 bits.
+class subtractive_rng : public unary_function<unsigned int, unsigned int> {
+private:
+  unsigned int table[55];
+  size_t index1;
+  size_t index2;
+public:
+  unsigned int operator()(unsigned int limit) {
+    index1 = (index1 + 1) % 55;
+    index2 = (index2 + 1) % 55;
+    table[index1] = table[index1] - table[index2];
+    return table[index1] % limit;
+  }
+
+  void initialize(unsigned int seed)
+  {
+    unsigned int k = 1;
+    table[54] = seed;
+    size_t i;
+    for (i = 0; i < 54; i++) {
+        size_t ii = (21 * (i + 1) % 55) - 1;
+        table[ii] = k;
+        k = seed - k;
+        seed = table[ii];
+    }
+    for (int loop = 0; loop < 4; loop++) {
+        for (i = 0; i < 55; i++)
+            table[i] = table[i] - table[(1 + i + 30) % 55];
+    }
+    index1 = 0;
+    index2 = 31;
+  }
+
+  subtractive_rng(unsigned int seed) { initialize(seed); }
+  subtractive_rng() { initialize(161803398u); }
+};
+
+
+// Adaptor function objects: pointers to member functions.
+
+// There are a total of 16 = 2^4 function objects in this family.
+//  (1) Member functions taking no arguments vs member functions taking
+//       one argument.
+//  (2) Call through pointer vs call through reference.
+//  (3) Member function with void return type vs member function with
+//      non-void return type.
+//  (4) Const vs non-const member function.
+
+// Note that choice (4) is not present in the 8/97 draft C++ standard, 
+//  which only allows these adaptors to be used with non-const functions.
+//  This is likely to be recified before the standard becomes final.
+// Note also that choice (3) is nothing more than a workaround: according
+//  to the draft, compilers should handle void and non-void the same way.
+//  This feature is not yet widely implemented, though.  You can only use
+//  member functions returning void if your compiler supports partial
+//  specialization.
+
+// All of this complexity is in the function objects themselves.  You can
+//  ignore it by using the helper function mem_fun, mem_fun_ref,
+//  mem_fun1, and mem_fun1_ref, which create whichever type of adaptor
+//  is appropriate.
+
+
+template <class S, class T>
+class mem_fun_t : public unary_function<T*, S> {
+public:
+  explicit mem_fun_t(S (T::*pf)()) : f(pf) {}
+  S operator()(T* p) const { return (p->*f)(); }
+private:
+  S (T::*f)();
+};
+
+template <class S, class T>
+class const_mem_fun_t : public unary_function<const T*, S> {
+public:
+  explicit const_mem_fun_t(S (T::*pf)() const) : f(pf) {}
+  S operator()(const T* p) const { return (p->*f)(); }
+private:
+  S (T::*f)() const;
+};
+
+
+template <class S, class T>
+class mem_fun_ref_t : public unary_function<T, S> {
+public:
+  explicit mem_fun_ref_t(S (T::*pf)()) : f(pf) {}
+  S operator()(T& r) const { return (r.*f)(); }
+private:
+  S (T::*f)();
+};
+
+template <class S, class T>
+class const_mem_fun_ref_t : public unary_function<T, S> {
+public:
+  explicit const_mem_fun_ref_t(S (T::*pf)() const) : f(pf) {}
+  S operator()(const T& r) const { return (r.*f)(); }
+private:
+  S (T::*f)() const;
+};
+
+template <class S, class T, class A>
+class mem_fun1_t : public binary_function<T*, A, S> {
+public:
+  explicit mem_fun1_t(S (T::*pf)(A)) : f(pf) {}
+  S operator()(T* p, A x) const { return (p->*f)(x); }
+private:
+  S (T::*f)(A);
+};
+
+template <class S, class T, class A>
+class const_mem_fun1_t : public binary_function<const T*, A, S> {
+public:
+  explicit const_mem_fun1_t(S (T::*pf)(A) const) : f(pf) {}
+  S operator()(const T* p, A x) const { return (p->*f)(x); }
+private:
+  S (T::*f)(A) const;
+};
+
+template <class S, class T, class A>
+class mem_fun1_ref_t : public binary_function<T, A, S> {
+public:
+  explicit mem_fun1_ref_t(S (T::*pf)(A)) : f(pf) {}
+  S operator()(T& r, A x) const { return (r.*f)(x); }
+private:
+  S (T::*f)(A);
+};
+
+template <class S, class T, class A>
+class const_mem_fun1_ref_t : public binary_function<T, A, S> {
+public:
+  explicit const_mem_fun1_ref_t(S (T::*pf)(A) const) : f(pf) {}
+  S operator()(const T& r, A x) const { return (r.*f)(x); }
+private:
+  S (T::*f)(A) const;
+};
+
+#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+template <class T>
+class mem_fun_t<void, T> : public unary_function<T*, void> {
+public:
+  explicit mem_fun_t(void (T::*pf)()) : f(pf) {}
+  void operator()(T* p) const { (p->*f)(); }
+private:
+  void (T::*f)();
+};
+
+template <class T>
+class const_mem_fun_t<void, T> : public unary_function<const T*, void> {
+public:
+  explicit const_mem_fun_t(void (T::*pf)() const) : f(pf) {}
+  void operator()(const T* p) const { (p->*f)(); }
+private:
+  void (T::*f)() const;
+};
+
+template <class T>
+class mem_fun_ref_t<void, T> : public unary_function<T, void> {
+public:
+  explicit mem_fun_ref_t(void (T::*pf)()) : f(pf) {}
+  void operator()(T& r) const { (r.*f)(); }
+private:
+  void (T::*f)();
+};
+
+template <class T>
+class const_mem_fun_ref_t<void, T> : public unary_function<T, void> {
+public:
+  explicit const_mem_fun_ref_t(void (T::*pf)() const) : f(pf) {}
+  void operator()(const T& r) const { (r.*f)(); }
+private:
+  void (T::*f)() const;
+};
+
+template <class T, class A>
+class mem_fun1_t<void, T, A> : public binary_function<T*, A, void> {
+public:
+  explicit mem_fun1_t(void (T::*pf)(A)) : f(pf) {}
+  void operator()(T* p, A x) const { (p->*f)(x); }
+private:
+  void (T::*f)(A);
+};
+
+template <class T, class A>
+class const_mem_fun1_t<void, T, A> : public binary_function<const T*, A, void> {
+public:
+  explicit const_mem_fun1_t(void (T::*pf)(A) const) : f(pf) {}
+  void operator()(const T* p, A x) const { (p->*f)(x); }
+private:
+  void (T::*f)(A) const;
+};
+
+template <class T, class A>
+class mem_fun1_ref_t<void, T, A> : public binary_function<T, A, void> {
+public:
+  explicit mem_fun1_ref_t(void (T::*pf)(A)) : f(pf) {}
+  void operator()(T& r, A x) const { (r.*f)(x); }
+private:
+  void (T::*f)(A);
+};
+
+template <class T, class A>
+class const_mem_fun1_ref_t<void, T, A> : public binary_function<T, A, void> {
+public:
+  explicit const_mem_fun1_ref_t(void (T::*pf)(A) const) : f(pf) {}
+  void operator()(const T& r, A x) const { (r.*f)(x); }
+private:
+  void (T::*f)(A) const;
+};
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+// Mem_fun adaptor helper functions.  There are only four:
+//  mem_fun, mem_fun_ref, mem_fun1, mem_fun1_ref.
+
+template <class S, class T>
+inline mem_fun_t<S,T> mem_fun(S (T::*f)()) { 
+  return mem_fun_t<S,T>(f);
+}
+
+template <class S, class T>
+inline const_mem_fun_t<S,T> mem_fun(S (T::*f)() const) {
+  return const_mem_fun_t<S,T>(f);
+}
+
+template <class S, class T>
+inline mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)()) { 
+  return mem_fun_ref_t<S,T>(f);
+}
+
+template <class S, class T>
+inline const_mem_fun_ref_t<S,T> mem_fun_ref(S (T::*f)() const) {
+  return const_mem_fun_ref_t<S,T>(f);
+}
+
+template <class S, class T, class A>
+inline mem_fun1_t<S,T,A> mem_fun1(S (T::*f)(A)) { 
+  return mem_fun1_t<S,T,A>(f);
+}
+
+template <class S, class T, class A>
+inline const_mem_fun1_t<S,T,A> mem_fun1(S (T::*f)(A) const) {
+  return const_mem_fun1_t<S,T,A>(f);
+}
+
+template <class S, class T, class A>
+inline mem_fun1_ref_t<S,T,A> mem_fun1_ref(S (T::*f)(A)) { 
+  return mem_fun1_ref_t<S,T,A>(f);
+}
+
+template <class S, class T, class A>
+inline const_mem_fun1_ref_t<S,T,A> mem_fun1_ref(S (T::*f)(A) const) {
+  return const_mem_fun1_ref_t<S,T,A>(f);
+}
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_FUNCTION_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_hash_fun.h b/libstdc++/stl/stl_hash_fun.h
new file mode 100644 (file)
index 0000000..3afa9dc
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 1996
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_HASH_FUN_H
+#define __SGI_STL_HASH_FUN_H
+
+#include <stddef.h>
+
+__STL_BEGIN_NAMESPACE
+
+template <class Key> struct hash { };
+
+inline size_t __stl_hash_string(const char* s)
+{
+  unsigned long h = 0; 
+  for ( ; *s; ++s)
+    h = 5*h + *s;
+  
+  return size_t(h);
+}
+
+__STL_TEMPLATE_NULL struct hash<char*>
+{
+  size_t operator()(const char* s) const { return __stl_hash_string(s); }
+};
+
+__STL_TEMPLATE_NULL struct hash<const char*>
+{
+  size_t operator()(const char* s) const { return __stl_hash_string(s); }
+};
+
+__STL_TEMPLATE_NULL struct hash<char> {
+  size_t operator()(char x) const { return x; }
+};
+__STL_TEMPLATE_NULL struct hash<unsigned char> {
+  size_t operator()(unsigned char x) const { return x; }
+};
+__STL_TEMPLATE_NULL struct hash<signed char> {
+  size_t operator()(unsigned char x) const { return x; }
+};
+__STL_TEMPLATE_NULL struct hash<short> {
+  size_t operator()(short x) const { return x; }
+};
+__STL_TEMPLATE_NULL struct hash<unsigned short> {
+  size_t operator()(unsigned short x) const { return x; }
+};
+__STL_TEMPLATE_NULL struct hash<int> {
+  size_t operator()(int x) const { return x; }
+};
+__STL_TEMPLATE_NULL struct hash<unsigned int> {
+  size_t operator()(unsigned int x) const { return x; }
+};
+__STL_TEMPLATE_NULL struct hash<long> {
+  size_t operator()(long x) const { return x; }
+};
+__STL_TEMPLATE_NULL struct hash<unsigned long> {
+  size_t operator()(unsigned long x) const { return x; }
+};
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_HASH_FUN_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_hash_map.h b/libstdc++/stl/stl_hash_map.h
new file mode 100644 (file)
index 0000000..9999e9a
--- /dev/null
@@ -0,0 +1,358 @@
+/*
+ * Copyright (c) 1996
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_HASH_MAP_H
+#define __SGI_STL_INTERNAL_HASH_MAP_H
+
+
+__STL_BEGIN_NAMESPACE
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1174
+#endif
+
+#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
+template <class Key, class T, class HashFcn = hash<Key>,
+          class EqualKey = equal_to<Key>,
+          class Alloc = alloc>
+#else
+template <class Key, class T, class HashFcn, class EqualKey, 
+          class Alloc = alloc>
+#endif
+class hash_map
+{
+private:
+  typedef hashtable<pair<const Key, T>, Key, HashFcn,
+                    select1st<pair<const Key, T> >, EqualKey, Alloc> ht;
+  ht rep;
+
+public:
+  typedef typename ht::key_type key_type;
+  typedef T data_type;
+  typedef T mapped_type;
+  typedef typename ht::value_type value_type;
+  typedef typename ht::hasher hasher;
+  typedef typename ht::key_equal key_equal;
+
+  typedef typename ht::size_type size_type;
+  typedef typename ht::difference_type difference_type;
+  typedef typename ht::pointer pointer;
+  typedef typename ht::const_pointer const_pointer;
+  typedef typename ht::reference reference;
+  typedef typename ht::const_reference const_reference;
+
+  typedef typename ht::iterator iterator;
+  typedef typename ht::const_iterator const_iterator;
+
+  hasher hash_funct() const { return rep.hash_funct(); }
+  key_equal key_eq() const { return rep.key_eq(); }
+
+public:
+  hash_map() : rep(100, hasher(), key_equal()) {}
+  explicit hash_map(size_type n) : rep(n, hasher(), key_equal()) {}
+  hash_map(size_type n, const hasher& hf) : rep(n, hf, key_equal()) {}
+  hash_map(size_type n, const hasher& hf, const key_equal& eql)
+    : rep(n, hf, eql) {}
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  hash_map(InputIterator f, InputIterator l)
+    : rep(100, hasher(), key_equal()) { rep.insert_unique(f, l); }
+  template <class InputIterator>
+  hash_map(InputIterator f, InputIterator l, size_type n)
+    : rep(n, hasher(), key_equal()) { rep.insert_unique(f, l); }
+  template <class InputIterator>
+  hash_map(InputIterator f, InputIterator l, size_type n,
+           const hasher& hf)
+    : rep(n, hf, key_equal()) { rep.insert_unique(f, l); }
+  template <class InputIterator>
+  hash_map(InputIterator f, InputIterator l, size_type n,
+           const hasher& hf, const key_equal& eql)
+    : rep(n, hf, eql) { rep.insert_unique(f, l); }
+
+#else
+  hash_map(const value_type* f, const value_type* l)
+    : rep(100, hasher(), key_equal()) { rep.insert_unique(f, l); }
+  hash_map(const value_type* f, const value_type* l, size_type n)
+    : rep(n, hasher(), key_equal()) { rep.insert_unique(f, l); }
+  hash_map(const value_type* f, const value_type* l, size_type n,
+           const hasher& hf)
+    : rep(n, hf, key_equal()) { rep.insert_unique(f, l); }
+  hash_map(const value_type* f, const value_type* l, size_type n,
+           const hasher& hf, const key_equal& eql)
+    : rep(n, hf, eql) { rep.insert_unique(f, l); }
+
+  hash_map(const_iterator f, const_iterator l)
+    : rep(100, hasher(), key_equal()) { rep.insert_unique(f, l); }
+  hash_map(const_iterator f, const_iterator l, size_type n)
+    : rep(n, hasher(), key_equal()) { rep.insert_unique(f, l); }
+  hash_map(const_iterator f, const_iterator l, size_type n,
+           const hasher& hf)
+    : rep(n, hf, key_equal()) { rep.insert_unique(f, l); }
+  hash_map(const_iterator f, const_iterator l, size_type n,
+           const hasher& hf, const key_equal& eql)
+    : rep(n, hf, eql) { rep.insert_unique(f, l); }
+#endif /*__STL_MEMBER_TEMPLATES */
+
+public:
+  size_type size() const { return rep.size(); }
+  size_type max_size() const { return rep.max_size(); }
+  bool empty() const { return rep.empty(); }
+  void swap(hash_map& hs) { rep.swap(hs.rep); }
+  friend bool
+  operator== __STL_NULL_TMPL_ARGS (const hash_map&, const hash_map&);
+
+  iterator begin() { return rep.begin(); }
+  iterator end() { return rep.end(); }
+  const_iterator begin() const { return rep.begin(); }
+  const_iterator end() const { return rep.end(); }
+
+public:
+  pair<iterator, bool> insert(const value_type& obj)
+    { return rep.insert_unique(obj); }
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  void insert(InputIterator f, InputIterator l) { rep.insert_unique(f,l); }
+#else
+  void insert(const value_type* f, const value_type* l) {
+    rep.insert_unique(f,l);
+  }
+  void insert(const_iterator f, const_iterator l) { rep.insert_unique(f, l); }
+#endif /*__STL_MEMBER_TEMPLATES */
+  pair<iterator, bool> insert_noresize(const value_type& obj)
+    { return rep.insert_unique_noresize(obj); }    
+
+  iterator find(const key_type& key) { return rep.find(key); }
+  const_iterator find(const key_type& key) const { return rep.find(key); }
+
+  T& operator[](const key_type& key) {
+    return rep.find_or_insert(value_type(key, T())).second;
+  }
+
+  size_type count(const key_type& key) const { return rep.count(key); }
+  
+  pair<iterator, iterator> equal_range(const key_type& key)
+    { return rep.equal_range(key); }
+  pair<const_iterator, const_iterator> equal_range(const key_type& key) const
+    { return rep.equal_range(key); }
+
+  size_type erase(const key_type& key) {return rep.erase(key); }
+  void erase(iterator it) { rep.erase(it); }
+  void erase(iterator f, iterator l) { rep.erase(f, l); }
+  void clear() { rep.clear(); }
+
+public:
+  void resize(size_type hint) { rep.resize(hint); }
+  size_type bucket_count() const { return rep.bucket_count(); }
+  size_type max_bucket_count() const { return rep.max_bucket_count(); }
+  size_type elems_in_bucket(size_type n) const
+    { return rep.elems_in_bucket(n); }
+};
+
+template <class Key, class T, class HashFcn, class EqualKey, class Alloc>
+inline bool operator==(const hash_map<Key, T, HashFcn, EqualKey, Alloc>& hm1,
+                       const hash_map<Key, T, HashFcn, EqualKey, Alloc>& hm2)
+{
+  return hm1.rep == hm2.rep;
+}
+
+#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class Key, class T, class HashFcn, class EqualKey, class Alloc>
+inline void swap(hash_map<Key, T, HashFcn, EqualKey, Alloc>& hm1,
+                 hash_map<Key, T, HashFcn, EqualKey, Alloc>& hm2)
+{
+  hm1.swap(hm2);
+}
+
+#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
+
+#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
+template <class Key, class T, class HashFcn = hash<Key>,
+          class EqualKey = equal_to<Key>,
+          class Alloc = alloc>
+#else
+template <class Key, class T, class HashFcn, class EqualKey,
+          class Alloc = alloc>
+#endif
+class hash_multimap
+{
+private:
+  typedef hashtable<pair<const Key, T>, Key, HashFcn,
+                    select1st<pair<const Key, T> >, EqualKey, Alloc> ht;
+  ht rep;
+
+public:
+  typedef typename ht::key_type key_type;
+  typedef T data_type;
+  typedef T mapped_type;
+  typedef typename ht::value_type value_type;
+  typedef typename ht::hasher hasher;
+  typedef typename ht::key_equal key_equal;
+
+  typedef typename ht::size_type size_type;
+  typedef typename ht::difference_type difference_type;
+  typedef typename ht::pointer pointer;
+  typedef typename ht::const_pointer const_pointer;
+  typedef typename ht::reference reference;
+  typedef typename ht::const_reference const_reference;
+
+  typedef typename ht::iterator iterator;
+  typedef typename ht::const_iterator const_iterator;
+
+  hasher hash_funct() const { return rep.hash_funct(); }
+  key_equal key_eq() const { return rep.key_eq(); }
+
+public:
+  hash_multimap() : rep(100, hasher(), key_equal()) {}
+  explicit hash_multimap(size_type n) : rep(n, hasher(), key_equal()) {}
+  hash_multimap(size_type n, const hasher& hf) : rep(n, hf, key_equal()) {}
+  hash_multimap(size_type n, const hasher& hf, const key_equal& eql)
+    : rep(n, hf, eql) {}
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  hash_multimap(InputIterator f, InputIterator l)
+    : rep(100, hasher(), key_equal()) { rep.insert_equal(f, l); }
+  template <class InputIterator>
+  hash_multimap(InputIterator f, InputIterator l, size_type n)
+    : rep(n, hasher(), key_equal()) { rep.insert_equal(f, l); }
+  template <class InputIterator>
+  hash_multimap(InputIterator f, InputIterator l, size_type n,
+                const hasher& hf)
+    : rep(n, hf, key_equal()) { rep.insert_equal(f, l); }
+  template <class InputIterator>
+  hash_multimap(InputIterator f, InputIterator l, size_type n,
+                const hasher& hf, const key_equal& eql)
+    : rep(n, hf, eql) { rep.insert_equal(f, l); }
+
+#else
+  hash_multimap(const value_type* f, const value_type* l)
+    : rep(100, hasher(), key_equal()) { rep.insert_equal(f, l); }
+  hash_multimap(const value_type* f, const value_type* l, size_type n)
+    : rep(n, hasher(), key_equal()) { rep.insert_equal(f, l); }
+  hash_multimap(const value_type* f, const value_type* l, size_type n,
+                const hasher& hf)
+    : rep(n, hf, key_equal()) { rep.insert_equal(f, l); }
+  hash_multimap(const value_type* f, const value_type* l, size_type n,
+                const hasher& hf, const key_equal& eql)
+    : rep(n, hf, eql) { rep.insert_equal(f, l); }
+
+  hash_multimap(const_iterator f, const_iterator l)
+    : rep(100, hasher(), key_equal()) { rep.insert_equal(f, l); }
+  hash_multimap(const_iterator f, const_iterator l, size_type n)
+    : rep(n, hasher(), key_equal()) { rep.insert_equal(f, l); }
+  hash_multimap(const_iterator f, const_iterator l, size_type n,
+                const hasher& hf)
+    : rep(n, hf, key_equal()) { rep.insert_equal(f, l); }
+  hash_multimap(const_iterator f, const_iterator l, size_type n,
+                const hasher& hf, const key_equal& eql)
+    : rep(n, hf, eql) { rep.insert_equal(f, l); }
+#endif /*__STL_MEMBER_TEMPLATES */
+
+public:
+  size_type size() const { return rep.size(); }
+  size_type max_size() const { return rep.max_size(); }
+  bool empty() const { return rep.empty(); }
+  void swap(hash_multimap& hs) { rep.swap(hs.rep); }
+  friend bool
+  operator== __STL_NULL_TMPL_ARGS (const hash_multimap&, const hash_multimap&);
+
+  iterator begin() { return rep.begin(); }
+  iterator end() { return rep.end(); }
+  const_iterator begin() const { return rep.begin(); }
+  const_iterator end() const { return rep.end(); }
+
+public:
+  iterator insert(const value_type& obj) { return rep.insert_equal(obj); }
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  void insert(InputIterator f, InputIterator l) { rep.insert_equal(f,l); }
+#else
+  void insert(const value_type* f, const value_type* l) {
+    rep.insert_equal(f,l);
+  }
+  void insert(const_iterator f, const_iterator l) { rep.insert_equal(f, l); }
+#endif /*__STL_MEMBER_TEMPLATES */
+  iterator insert_noresize(const value_type& obj)
+    { return rep.insert_equal_noresize(obj); }    
+
+  iterator find(const key_type& key) { return rep.find(key); }
+  const_iterator find(const key_type& key) const { return rep.find(key); }
+
+  size_type count(const key_type& key) const { return rep.count(key); }
+  
+  pair<iterator, iterator> equal_range(const key_type& key)
+    { return rep.equal_range(key); }
+  pair<const_iterator, const_iterator> equal_range(const key_type& key) const
+    { return rep.equal_range(key); }
+
+  size_type erase(const key_type& key) {return rep.erase(key); }
+  void erase(iterator it) { rep.erase(it); }
+  void erase(iterator f, iterator l) { rep.erase(f, l); }
+  void clear() { rep.clear(); }
+
+public:
+  void resize(size_type hint) { rep.resize(hint); }
+  size_type bucket_count() const { return rep.bucket_count(); }
+  size_type max_bucket_count() const { return rep.max_bucket_count(); }
+  size_type elems_in_bucket(size_type n) const
+    { return rep.elems_in_bucket(n); }
+};
+
+template <class Key, class T, class HF, class EqKey, class Alloc>
+inline bool operator==(const hash_multimap<Key, T, HF, EqKey, Alloc>& hm1,
+                       const hash_multimap<Key, T, HF, EqKey, Alloc>& hm2)
+{
+  return hm1.rep == hm2.rep;
+}
+
+#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class Key, class T, class HashFcn, class EqualKey, class Alloc>
+inline void swap(hash_multimap<Key, T, HashFcn, EqualKey, Alloc>& hm1,
+                 hash_multimap<Key, T, HashFcn, EqualKey, Alloc>& hm2)
+{
+  hm1.swap(hm2);
+}
+
+#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1174
+#endif
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_HASH_MAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_hash_set.h b/libstdc++/stl/stl_hash_set.h
new file mode 100644 (file)
index 0000000..80159da
--- /dev/null
@@ -0,0 +1,342 @@
+/*
+ * Copyright (c) 1996
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_HASH_SET_H
+#define __SGI_STL_INTERNAL_HASH_SET_H
+
+__STL_BEGIN_NAMESPACE
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1174
+#endif
+
+#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
+template <class Value, class HashFcn = hash<Value>,
+          class EqualKey = equal_to<Value>,
+          class Alloc = alloc>
+#else
+template <class Value, class HashFcn, class EqualKey, class Alloc = alloc>
+#endif
+class hash_set
+{
+private:
+  typedef hashtable<Value, Value, HashFcn, identity<Value>, 
+                    EqualKey, Alloc> ht;
+  ht rep;
+
+public:
+  typedef typename ht::key_type key_type;
+  typedef typename ht::value_type value_type;
+  typedef typename ht::hasher hasher;
+  typedef typename ht::key_equal key_equal;
+
+  typedef typename ht::size_type size_type;
+  typedef typename ht::difference_type difference_type;
+  typedef typename ht::const_pointer pointer;
+  typedef typename ht::const_pointer const_pointer;
+  typedef typename ht::const_reference reference;
+  typedef typename ht::const_reference const_reference;
+
+  typedef typename ht::const_iterator iterator;
+  typedef typename ht::const_iterator const_iterator;
+
+  hasher hash_funct() const { return rep.hash_funct(); }
+  key_equal key_eq() const { return rep.key_eq(); }
+
+public:
+  hash_set() : rep(100, hasher(), key_equal()) {}
+  explicit hash_set(size_type n) : rep(n, hasher(), key_equal()) {}
+  hash_set(size_type n, const hasher& hf) : rep(n, hf, key_equal()) {}
+  hash_set(size_type n, const hasher& hf, const key_equal& eql)
+    : rep(n, hf, eql) {}
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  hash_set(InputIterator f, InputIterator l)
+    : rep(100, hasher(), key_equal()) { rep.insert_unique(f, l); }
+  template <class InputIterator>
+  hash_set(InputIterator f, InputIterator l, size_type n)
+    : rep(n, hasher(), key_equal()) { rep.insert_unique(f, l); }
+  template <class InputIterator>
+  hash_set(InputIterator f, InputIterator l, size_type n,
+           const hasher& hf)
+    : rep(n, hf, key_equal()) { rep.insert_unique(f, l); }
+  template <class InputIterator>
+  hash_set(InputIterator f, InputIterator l, size_type n,
+           const hasher& hf, const key_equal& eql)
+    : rep(n, hf, eql) { rep.insert_unique(f, l); }
+#else
+
+  hash_set(const value_type* f, const value_type* l)
+    : rep(100, hasher(), key_equal()) { rep.insert_unique(f, l); }
+  hash_set(const value_type* f, const value_type* l, size_type n)
+    : rep(n, hasher(), key_equal()) { rep.insert_unique(f, l); }
+  hash_set(const value_type* f, const value_type* l, size_type n,
+           const hasher& hf)
+    : rep(n, hf, key_equal()) { rep.insert_unique(f, l); }
+  hash_set(const value_type* f, const value_type* l, size_type n,
+           const hasher& hf, const key_equal& eql)
+    : rep(n, hf, eql) { rep.insert_unique(f, l); }
+
+  hash_set(const_iterator f, const_iterator l)
+    : rep(100, hasher(), key_equal()) { rep.insert_unique(f, l); }
+  hash_set(const_iterator f, const_iterator l, size_type n)
+    : rep(n, hasher(), key_equal()) { rep.insert_unique(f, l); }
+  hash_set(const_iterator f, const_iterator l, size_type n,
+           const hasher& hf)
+    : rep(n, hf, key_equal()) { rep.insert_unique(f, l); }
+  hash_set(const_iterator f, const_iterator l, size_type n,
+           const hasher& hf, const key_equal& eql)
+    : rep(n, hf, eql) { rep.insert_unique(f, l); }
+#endif /*__STL_MEMBER_TEMPLATES */
+
+public:
+  size_type size() const { return rep.size(); }
+  size_type max_size() const { return rep.max_size(); }
+  bool empty() const { return rep.empty(); }
+  void swap(hash_set& hs) { rep.swap(hs.rep); }
+  friend bool operator== __STL_NULL_TMPL_ARGS (const hash_set&,
+                                               const hash_set&);
+
+  iterator begin() const { return rep.begin(); }
+  iterator end() const { return rep.end(); }
+
+public:
+  pair<iterator, bool> insert(const value_type& obj)
+    {
+      pair<typename ht::iterator, bool> p = rep.insert_unique(obj);
+      return pair<iterator, bool>(p.first, p.second);
+    }
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  void insert(InputIterator f, InputIterator l) { rep.insert_unique(f,l); }
+#else
+  void insert(const value_type* f, const value_type* l) {
+    rep.insert_unique(f,l);
+  }
+  void insert(const_iterator f, const_iterator l) {rep.insert_unique(f, l); }
+#endif /*__STL_MEMBER_TEMPLATES */
+  pair<iterator, bool> insert_noresize(const value_type& obj)
+  {
+    pair<typename ht::iterator, bool> p = rep.insert_unique_noresize(obj);
+    return pair<iterator, bool>(p.first, p.second);
+  }
+
+  iterator find(const key_type& key) const { return rep.find(key); }
+
+  size_type count(const key_type& key) const { return rep.count(key); }
+  
+  pair<iterator, iterator> equal_range(const key_type& key) const
+    { return rep.equal_range(key); }
+
+  size_type erase(const key_type& key) {return rep.erase(key); }
+  void erase(iterator it) { rep.erase(it); }
+  void erase(iterator f, iterator l) { rep.erase(f, l); }
+  void clear() { rep.clear(); }
+
+public:
+  void resize(size_type hint) { rep.resize(hint); }
+  size_type bucket_count() const { return rep.bucket_count(); }
+  size_type max_bucket_count() const { return rep.max_bucket_count(); }
+  size_type elems_in_bucket(size_type n) const
+    { return rep.elems_in_bucket(n); }
+};
+
+template <class Value, class HashFcn, class EqualKey, class Alloc>
+inline bool operator==(const hash_set<Value, HashFcn, EqualKey, Alloc>& hs1,
+                       const hash_set<Value, HashFcn, EqualKey, Alloc>& hs2)
+{
+  return hs1.rep == hs2.rep;
+}
+
+#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class Val, class HashFcn, class EqualKey, class Alloc>
+inline void swap(hash_set<Val, HashFcn, EqualKey, Alloc>& hs1,
+                 hash_set<Val, HashFcn, EqualKey, Alloc>& hs2) {
+  hs1.swap(hs2);
+}
+
+#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
+
+
+#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
+template <class Value, class HashFcn = hash<Value>,
+          class EqualKey = equal_to<Value>,
+          class Alloc = alloc>
+#else
+template <class Value, class HashFcn, class EqualKey, class Alloc = alloc>
+#endif
+class hash_multiset
+{
+private:
+  typedef hashtable<Value, Value, HashFcn, identity<Value>, 
+                    EqualKey, Alloc> ht;
+  ht rep;
+
+public:
+  typedef typename ht::key_type key_type;
+  typedef typename ht::value_type value_type;
+  typedef typename ht::hasher hasher;
+  typedef typename ht::key_equal key_equal;
+
+  typedef typename ht::size_type size_type;
+  typedef typename ht::difference_type difference_type;
+  typedef typename ht::const_pointer pointer;
+  typedef typename ht::const_pointer const_pointer;
+  typedef typename ht::const_reference reference;
+  typedef typename ht::const_reference const_reference;
+
+  typedef typename ht::const_iterator iterator;
+  typedef typename ht::const_iterator const_iterator;
+
+  hasher hash_funct() const { return rep.hash_funct(); }
+  key_equal key_eq() const { return rep.key_eq(); }
+
+public:
+  hash_multiset() : rep(100, hasher(), key_equal()) {}
+  explicit hash_multiset(size_type n) : rep(n, hasher(), key_equal()) {}
+  hash_multiset(size_type n, const hasher& hf) : rep(n, hf, key_equal()) {}
+  hash_multiset(size_type n, const hasher& hf, const key_equal& eql)
+    : rep(n, hf, eql) {}
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  hash_multiset(InputIterator f, InputIterator l)
+    : rep(100, hasher(), key_equal()) { rep.insert_equal(f, l); }
+  template <class InputIterator>
+  hash_multiset(InputIterator f, InputIterator l, size_type n)
+    : rep(n, hasher(), key_equal()) { rep.insert_equal(f, l); }
+  template <class InputIterator>
+  hash_multiset(InputIterator f, InputIterator l, size_type n,
+                const hasher& hf)
+    : rep(n, hf, key_equal()) { rep.insert_equal(f, l); }
+  template <class InputIterator>
+  hash_multiset(InputIterator f, InputIterator l, size_type n,
+                const hasher& hf, const key_equal& eql)
+    : rep(n, hf, eql) { rep.insert_equal(f, l); }
+#else
+
+  hash_multiset(const value_type* f, const value_type* l)
+    : rep(100, hasher(), key_equal()) { rep.insert_equal(f, l); }
+  hash_multiset(const value_type* f, const value_type* l, size_type n)
+    : rep(n, hasher(), key_equal()) { rep.insert_equal(f, l); }
+  hash_multiset(const value_type* f, const value_type* l, size_type n,
+                const hasher& hf)
+    : rep(n, hf, key_equal()) { rep.insert_equal(f, l); }
+  hash_multiset(const value_type* f, const value_type* l, size_type n,
+                const hasher& hf, const key_equal& eql)
+    : rep(n, hf, eql) { rep.insert_equal(f, l); }
+
+  hash_multiset(const_iterator f, const_iterator l)
+    : rep(100, hasher(), key_equal()) { rep.insert_equal(f, l); }
+  hash_multiset(const_iterator f, const_iterator l, size_type n)
+    : rep(n, hasher(), key_equal()) { rep.insert_equal(f, l); }
+  hash_multiset(const_iterator f, const_iterator l, size_type n,
+                const hasher& hf)
+    : rep(n, hf, key_equal()) { rep.insert_equal(f, l); }
+  hash_multiset(const_iterator f, const_iterator l, size_type n,
+                const hasher& hf, const key_equal& eql)
+    : rep(n, hf, eql) { rep.insert_equal(f, l); }
+#endif /*__STL_MEMBER_TEMPLATES */
+
+public:
+  size_type size() const { return rep.size(); }
+  size_type max_size() const { return rep.max_size(); }
+  bool empty() const { return rep.empty(); }
+  void swap(hash_multiset& hs) { rep.swap(hs.rep); }
+  friend bool operator== __STL_NULL_TMPL_ARGS (const hash_multiset&,
+                                               const hash_multiset&);
+
+  iterator begin() const { return rep.begin(); }
+  iterator end() const { return rep.end(); }
+
+public:
+  iterator insert(const value_type& obj) { return rep.insert_equal(obj); }
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  void insert(InputIterator f, InputIterator l) { rep.insert_equal(f,l); }
+#else
+  void insert(const value_type* f, const value_type* l) {
+    rep.insert_equal(f,l);
+  }
+  void insert(const_iterator f, const_iterator l) { rep.insert_equal(f, l); }
+#endif /*__STL_MEMBER_TEMPLATES */
+  iterator insert_noresize(const value_type& obj)
+    { return rep.insert_equal_noresize(obj); }    
+
+  iterator find(const key_type& key) const { return rep.find(key); }
+
+  size_type count(const key_type& key) const { return rep.count(key); }
+  
+  pair<iterator, iterator> equal_range(const key_type& key) const
+    { return rep.equal_range(key); }
+
+  size_type erase(const key_type& key) {return rep.erase(key); }
+  void erase(iterator it) { rep.erase(it); }
+  void erase(iterator f, iterator l) { rep.erase(f, l); }
+  void clear() { rep.clear(); }
+
+public:
+  void resize(size_type hint) { rep.resize(hint); }
+  size_type bucket_count() const { return rep.bucket_count(); }
+  size_type max_bucket_count() const { return rep.max_bucket_count(); }
+  size_type elems_in_bucket(size_type n) const
+    { return rep.elems_in_bucket(n); }
+};
+
+template <class Val, class HashFcn, class EqualKey, class Alloc>
+inline bool operator==(const hash_multiset<Val, HashFcn, EqualKey, Alloc>& hs1,
+                       const hash_multiset<Val, HashFcn, EqualKey, Alloc>& hs2)
+{
+  return hs1.rep == hs2.rep;
+}
+
+#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class Val, class HashFcn, class EqualKey, class Alloc>
+inline void swap(hash_multiset<Val, HashFcn, EqualKey, Alloc>& hs1,
+                 hash_multiset<Val, HashFcn, EqualKey, Alloc>& hs2)
+  hs1.swap(hs2);
+}
+
+#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1174
+#endif
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_HASH_SET_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_hashtable.h b/libstdc++/stl/stl_hashtable.h
new file mode 100644 (file)
index 0000000..2452f62
--- /dev/null
@@ -0,0 +1,948 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_HASHTABLE_H
+#define __SGI_STL_INTERNAL_HASHTABLE_H
+
+// Hashtable class, used to implement the hashed associative containers
+// hash_set, hash_map, hash_multiset, and hash_multimap.
+
+#include <stl_algobase.h>
+#include <stl_alloc.h>
+#include <stl_construct.h>
+#include <stl_tempbuf.h>
+#include <stl_algo.h>
+#include <stl_uninitialized.h>
+#include <stl_function.h>
+#include <stl_vector.h>
+#include <stl_hash_fun.h>
+
+__STL_BEGIN_NAMESPACE
+
+template <class Value>
+struct __hashtable_node
+{
+  __hashtable_node* next;
+  Value val;
+};  
+
+template <class Value, class Key, class HashFcn,
+          class ExtractKey, class EqualKey, class Alloc = alloc>
+class hashtable;
+
+template <class Value, class Key, class HashFcn,
+          class ExtractKey, class EqualKey, class Alloc>
+struct __hashtable_iterator;
+
+template <class Value, class Key, class HashFcn,
+          class ExtractKey, class EqualKey, class Alloc>
+struct __hashtable_const_iterator;
+
+template <class Value, class Key, class HashFcn,
+          class ExtractKey, class EqualKey, class Alloc>
+struct __hashtable_iterator {
+  typedef hashtable<Value, Key, HashFcn, ExtractKey, EqualKey, Alloc>
+          hashtable;
+  typedef __hashtable_iterator<Value, Key, HashFcn, 
+                               ExtractKey, EqualKey, Alloc>
+          iterator;
+  typedef __hashtable_const_iterator<Value, Key, HashFcn, 
+                                     ExtractKey, EqualKey, Alloc>
+          const_iterator;
+  typedef __hashtable_node<Value> node;
+
+  typedef forward_iterator_tag iterator_category;
+  typedef Value value_type;
+  typedef ptrdiff_t difference_type;
+  typedef size_t size_type;
+  typedef Value& reference;
+  typedef Value* pointer;
+
+  node* cur;
+  hashtable* ht;
+
+  __hashtable_iterator(node* n, hashtable* tab) : cur(n), ht(tab) {}
+  __hashtable_iterator() {}
+  reference operator*() const { return cur->val; }
+#ifndef __SGI_STL_NO_ARROW_OPERATOR
+  pointer operator->() const { return &(operator*()); }
+#endif /* __SGI_STL_NO_ARROW_OPERATOR */
+  iterator& operator++();
+  iterator operator++(int);
+  bool operator==(const iterator& it) const { return cur == it.cur; }
+  bool operator!=(const iterator& it) const { return cur != it.cur; }
+};
+
+
+template <class Value, class Key, class HashFcn,
+          class ExtractKey, class EqualKey, class Alloc>
+struct __hashtable_const_iterator {
+  typedef hashtable<Value, Key, HashFcn, ExtractKey, EqualKey, Alloc>
+          hashtable;
+  typedef __hashtable_iterator<Value, Key, HashFcn, 
+                               ExtractKey, EqualKey, Alloc>
+          iterator;
+  typedef __hashtable_const_iterator<Value, Key, HashFcn, 
+                                     ExtractKey, EqualKey, Alloc>
+          const_iterator;
+  typedef __hashtable_node<Value> node;
+
+  typedef forward_iterator_tag iterator_category;
+  typedef Value value_type;
+  typedef ptrdiff_t difference_type;
+  typedef size_t size_type;
+  typedef const Value& reference;
+  typedef const Value* pointer;
+
+  const node* cur;
+  const hashtable* ht;
+
+  __hashtable_const_iterator(const node* n, const hashtable* tab)
+    : cur(n), ht(tab) {}
+  __hashtable_const_iterator() {}
+  __hashtable_const_iterator(const iterator& it) : cur(it.cur), ht(it.ht) {}
+  reference operator*() const { return cur->val; }
+#ifndef __SGI_STL_NO_ARROW_OPERATOR
+  pointer operator->() const { return &(operator*()); }
+#endif /* __SGI_STL_NO_ARROW_OPERATOR */
+  const_iterator& operator++();
+  const_iterator operator++(int);
+  bool operator==(const const_iterator& it) const { return cur == it.cur; }
+  bool operator!=(const const_iterator& it) const { return cur != it.cur; }
+};
+
+// Note: assumes long is at least 32 bits.
+static const int __stl_num_primes = 28;
+static const unsigned long __stl_prime_list[__stl_num_primes] =
+{
+  53,         97,         193,       389,       769,
+  1543,       3079,       6151,      12289,     24593,
+  49157,      98317,      196613,    393241,    786433,
+  1572869,    3145739,    6291469,   12582917,  25165843,
+  50331653,   100663319,  201326611, 402653189, 805306457, 
+  1610612741, 3221225473, 4294967291
+};
+
+inline unsigned long __stl_next_prime(unsigned long n)
+{
+  const unsigned long* first = __stl_prime_list;
+  const unsigned long* last = __stl_prime_list + __stl_num_primes;
+  const unsigned long* pos = lower_bound(first, last, n);
+  return pos == last ? *(last - 1) : *pos;
+}
+
+
+template <class Value, class Key, class HashFcn,
+          class ExtractKey, class EqualKey,
+          class Alloc>
+class hashtable {
+public:
+  typedef Key key_type;
+  typedef Value value_type;
+  typedef HashFcn hasher;
+  typedef EqualKey key_equal;
+
+  typedef size_t            size_type;
+  typedef ptrdiff_t         difference_type;
+  typedef value_type*       pointer;
+  typedef const value_type* const_pointer;
+  typedef value_type&       reference;
+  typedef const value_type& const_reference;
+
+  hasher hash_funct() const { return hash; }
+  key_equal key_eq() const { return equals; }
+
+private:
+  hasher hash;
+  key_equal equals;
+  ExtractKey get_key;
+
+  typedef __hashtable_node<Value> node;
+  typedef simple_alloc<node, Alloc> node_allocator;
+
+  vector<node*,Alloc> buckets;
+  size_type num_elements;
+
+public:
+  typedef __hashtable_iterator<Value, Key, HashFcn, ExtractKey, EqualKey, 
+                               Alloc>
+  iterator;
+
+  typedef __hashtable_const_iterator<Value, Key, HashFcn, ExtractKey, EqualKey,
+                                     Alloc>
+  const_iterator;
+
+  friend struct
+  __hashtable_iterator<Value, Key, HashFcn, ExtractKey, EqualKey, Alloc>;
+  friend struct
+  __hashtable_const_iterator<Value, Key, HashFcn, ExtractKey, EqualKey, Alloc>;
+
+public:
+  hashtable(size_type n,
+            const HashFcn&    hf,
+            const EqualKey&   eql,
+            const ExtractKey& ext)
+    : hash(hf), equals(eql), get_key(ext), num_elements(0)
+  {
+    initialize_buckets(n);
+  }
+
+  hashtable(size_type n,
+            const HashFcn&    hf,
+            const EqualKey&   eql)
+    : hash(hf), equals(eql), get_key(ExtractKey()), num_elements(0)
+  {
+    initialize_buckets(n);
+  }
+
+  hashtable(const hashtable& ht)
+    : hash(ht.hash), equals(ht.equals), get_key(ht.get_key), num_elements(0)
+  {
+    copy_from(ht);
+  }
+
+  hashtable& operator= (const hashtable& ht)
+  {
+    if (&ht != this) {
+      clear();
+      hash = ht.hash;
+      equals = ht.equals;
+      get_key = ht.get_key;
+      copy_from(ht);
+    }
+    return *this;
+  }
+
+  ~hashtable() { clear(); }
+
+  size_type size() const { return num_elements; }
+  size_type max_size() const { return size_type(-1); }
+  bool empty() const { return size() == 0; }
+
+  void swap(hashtable& ht)
+  {
+    __STD::swap(hash, ht.hash);
+    __STD::swap(equals, ht.equals);
+    __STD::swap(get_key, ht.get_key);
+    buckets.swap(ht.buckets);
+    __STD::swap(num_elements, ht.num_elements);
+  }
+
+  iterator begin()
+  { 
+    for (size_type n = 0; n < buckets.size(); ++n)
+      if (buckets[n])
+        return iterator(buckets[n], this);
+    return end();
+  }
+
+  iterator end() { return iterator(0, this); }
+
+  const_iterator begin() const
+  {
+    for (size_type n = 0; n < buckets.size(); ++n)
+      if (buckets[n])
+        return const_iterator(buckets[n], this);
+    return end();
+  }
+
+  const_iterator end() const { return const_iterator(0, this); }
+
+  friend bool
+  operator== __STL_NULL_TMPL_ARGS (const hashtable&, const hashtable&);
+
+public:
+
+  size_type bucket_count() const { return buckets.size(); }
+
+  size_type max_bucket_count() const
+    { return __stl_prime_list[__stl_num_primes - 1]; } 
+
+  size_type elems_in_bucket(size_type bucket) const
+  {
+    size_type result = 0;
+    for (node* cur = buckets[bucket]; cur; cur = cur->next)
+      result += 1;
+    return result;
+  }
+
+  pair<iterator, bool> insert_unique(const value_type& obj)
+  {
+    resize(num_elements + 1);
+    return insert_unique_noresize(obj);
+  }
+
+  iterator insert_equal(const value_type& obj)
+  {
+    resize(num_elements + 1);
+    return insert_equal_noresize(obj);
+  }
+
+  pair<iterator, bool> insert_unique_noresize(const value_type& obj);
+  iterator insert_equal_noresize(const value_type& obj);
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  void insert_unique(InputIterator f, InputIterator l)
+  {
+    insert_unique(f, l, iterator_category(f));
+  }
+
+  template <class InputIterator>
+  void insert_equal(InputIterator f, InputIterator l)
+  {
+    insert_equal(f, l, iterator_category(f));
+  }
+
+  template <class InputIterator>
+  void insert_unique(InputIterator f, InputIterator l,
+                     input_iterator_tag)
+  {
+    for ( ; f != l; ++f)
+      insert_unique(*f);
+  }
+
+  template <class InputIterator>
+  void insert_equal(InputIterator f, InputIterator l,
+                    input_iterator_tag)
+  {
+    for ( ; f != l; ++f)
+      insert_equal(*f);
+  }
+
+  template <class ForwardIterator>
+  void insert_unique(ForwardIterator f, ForwardIterator l,
+                     forward_iterator_tag)
+  {
+    size_type n = 0;
+    distance(f, l, n);
+    resize(num_elements + n);
+    for ( ; n > 0; --n, ++f)
+      insert_unique_noresize(*f);
+  }
+
+  template <class ForwardIterator>
+  void insert_equal(ForwardIterator f, ForwardIterator l,
+                    forward_iterator_tag)
+  {
+    size_type n = 0;
+    distance(f, l, n);
+    resize(num_elements + n);
+    for ( ; n > 0; --n, ++f)
+      insert_equal_noresize(*f);
+  }
+
+#else /* __STL_MEMBER_TEMPLATES */
+  void insert_unique(const value_type* f, const value_type* l)
+  {
+    size_type n = l - f;
+    resize(num_elements + n);
+    for ( ; n > 0; --n, ++f)
+      insert_unique_noresize(*f);
+  }
+
+  void insert_equal(const value_type* f, const value_type* l)
+  {
+    size_type n = l - f;
+    resize(num_elements + n);
+    for ( ; n > 0; --n, ++f)
+      insert_equal_noresize(*f);
+  }
+
+  void insert_unique(const_iterator f, const_iterator l)
+  {
+    size_type n = 0;
+    distance(f, l, n);
+    resize(num_elements + n);
+    for ( ; n > 0; --n, ++f)
+      insert_unique_noresize(*f);
+  }
+
+  void insert_equal(const_iterator f, const_iterator l)
+  {
+    size_type n = 0;
+    distance(f, l, n);
+    resize(num_elements + n);
+    for ( ; n > 0; --n, ++f)
+      insert_equal_noresize(*f);
+  }
+#endif /*__STL_MEMBER_TEMPLATES */
+
+  reference find_or_insert(const value_type& obj);
+
+  iterator find(const key_type& key) 
+  {
+    size_type n = bkt_num_key(key);
+    node* first;
+    for ( first = buckets[n];
+          first && !equals(get_key(first->val), key);
+          first = first->next)
+      {}
+    return iterator(first, this);
+  } 
+
+  const_iterator find(const key_type& key) const
+  {
+    size_type n = bkt_num_key(key);
+    const node* first;
+    for ( first = buckets[n];
+          first && !equals(get_key(first->val), key);
+          first = first->next)
+      {}
+    return const_iterator(first, this);
+  } 
+
+  size_type count(const key_type& key) const
+  {
+    const size_type n = bkt_num_key(key);
+    size_type result = 0;
+
+    for (const node* cur = buckets[n]; cur; cur = cur->next)
+      if (equals(get_key(cur->val), key))
+        ++result;
+    return result;
+  }
+
+  pair<iterator, iterator> equal_range(const key_type& key);
+  pair<const_iterator, const_iterator> equal_range(const key_type& key) const;
+
+  size_type erase(const key_type& key);
+  void erase(const iterator& it);
+  void erase(iterator first, iterator last);
+
+  void erase(const const_iterator& it);
+  void erase(const_iterator first, const_iterator last);
+
+  void resize(size_type num_elements_hint);
+  void clear();
+
+private:
+  size_type next_size(size_type n) const { return __stl_next_prime(n); }
+
+  void initialize_buckets(size_type n)
+  {
+    const size_type n_buckets = next_size(n);
+    buckets.reserve(n_buckets);
+    buckets.insert(buckets.end(), n_buckets, (node*) 0);
+    num_elements = 0;
+  }
+
+  size_type bkt_num_key(const key_type& key) const
+  {
+    return bkt_num_key(key, buckets.size());
+  }
+
+  size_type bkt_num(const value_type& obj) const
+  {
+    return bkt_num_key(get_key(obj));
+  }
+
+  size_type bkt_num_key(const key_type& key, size_t n) const
+  {
+    return hash(key) % n;
+  }
+
+  size_type bkt_num(const value_type& obj, size_t n) const
+  {
+    return bkt_num_key(get_key(obj), n);
+  }
+
+  node* new_node(const value_type& obj)
+  {
+    node* n = node_allocator::allocate();
+    n->next = 0;
+    __STL_TRY {
+      construct(&n->val, obj);
+      return n;
+    }
+    __STL_UNWIND(node_allocator::deallocate(n));
+  }
+  
+  void delete_node(node* n)
+  {
+    destroy(&n->val);
+    node_allocator::deallocate(n);
+  }
+
+  void erase_bucket(const size_type n, node* first, node* last);
+  void erase_bucket(const size_type n, node* last);
+
+  void copy_from(const hashtable& ht);
+
+};
+
+template <class V, class K, class HF, class ExK, class EqK, class A>
+__hashtable_iterator<V, K, HF, ExK, EqK, A>&
+__hashtable_iterator<V, K, HF, ExK, EqK, A>::operator++()
+{
+  const node* old = cur;
+  cur = cur->next;
+  if (!cur) {
+    size_type bucket = ht->bkt_num(old->val);
+    while (!cur && ++bucket < ht->buckets.size())
+      cur = ht->buckets[bucket];
+  }
+  return *this;
+}
+
+template <class V, class K, class HF, class ExK, class EqK, class A>
+inline __hashtable_iterator<V, K, HF, ExK, EqK, A>
+__hashtable_iterator<V, K, HF, ExK, EqK, A>::operator++(int)
+{
+  iterator tmp = *this;
+  ++*this;
+  return tmp;
+}
+
+template <class V, class K, class HF, class ExK, class EqK, class A>
+__hashtable_const_iterator<V, K, HF, ExK, EqK, A>&
+__hashtable_const_iterator<V, K, HF, ExK, EqK, A>::operator++()
+{
+  const node* old = cur;
+  cur = cur->next;
+  if (!cur) {
+    size_type bucket = ht->bkt_num(old->val);
+    while (!cur && ++bucket < ht->buckets.size())
+      cur = ht->buckets[bucket];
+  }
+  return *this;
+}
+
+template <class V, class K, class HF, class ExK, class EqK, class A>
+inline __hashtable_const_iterator<V, K, HF, ExK, EqK, A>
+__hashtable_const_iterator<V, K, HF, ExK, EqK, A>::operator++(int)
+{
+  const_iterator tmp = *this;
+  ++*this;
+  return tmp;
+}
+
+#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+template <class V, class K, class HF, class ExK, class EqK, class All>
+inline forward_iterator_tag
+iterator_category(const __hashtable_iterator<V, K, HF, ExK, EqK, All>&)
+{
+  return forward_iterator_tag();
+}
+
+template <class V, class K, class HF, class ExK, class EqK, class All>
+inline V* value_type(const __hashtable_iterator<V, K, HF, ExK, EqK, All>&)
+{
+  return (V*) 0;
+}
+
+template <class V, class K, class HF, class ExK, class EqK, class All>
+inline hashtable<V, K, HF, ExK, EqK, All>::difference_type*
+distance_type(const __hashtable_iterator<V, K, HF, ExK, EqK, All>&)
+{
+  return (hashtable<V, K, HF, ExK, EqK, All>::difference_type*) 0;
+}
+
+template <class V, class K, class HF, class ExK, class EqK, class All>
+inline forward_iterator_tag
+iterator_category(const __hashtable_const_iterator<V, K, HF, ExK, EqK, All>&)
+{
+  return forward_iterator_tag();
+}
+
+template <class V, class K, class HF, class ExK, class EqK, class All>
+inline V* 
+value_type(const __hashtable_const_iterator<V, K, HF, ExK, EqK, All>&)
+{
+  return (V*) 0;
+}
+
+template <class V, class K, class HF, class ExK, class EqK, class All>
+inline hashtable<V, K, HF, ExK, EqK, All>::difference_type*
+distance_type(const __hashtable_const_iterator<V, K, HF, ExK, EqK, All>&)
+{
+  return (hashtable<V, K, HF, ExK, EqK, All>::difference_type*) 0;
+}
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+template <class V, class K, class HF, class Ex, class Eq, class A>
+bool operator==(const hashtable<V, K, HF, Ex, Eq, A>& ht1,
+                const hashtable<V, K, HF, Ex, Eq, A>& ht2)
+{
+  typedef typename hashtable<V, K, HF, Ex, Eq, A>::node node;
+  if (ht1.buckets.size() != ht2.buckets.size())
+    return false;
+  for (int n = 0; n < ht1.buckets.size(); ++n) {
+    node* cur1 = ht1.buckets[n];
+    node* cur2 = ht2.buckets[n];
+    for ( ; cur1 && cur2 && cur1->val == cur2->val;
+          cur1 = cur1->next, cur2 = cur2->next)
+      {}
+    if (cur1 || cur2)
+      return false;
+  }
+  return true;
+}  
+
+#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class Val, class Key, class HF, class Extract, class EqKey, class A>
+inline void swap(hashtable<Val, Key, HF, Extract, EqKey, A>& ht1,
+                 hashtable<Val, Key, HF, Extract, EqKay, A>& ht2) {
+  ht1.swap(ht2);
+}
+
+#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
+
+
+template <class V, class K, class HF, class Ex, class Eq, class A>
+pair<typename hashtable<V, K, HF, Ex, Eq, A>::iterator, bool> 
+hashtable<V, K, HF, Ex, Eq, A>::insert_unique_noresize(const value_type& obj)
+{
+  const size_type n = bkt_num(obj);
+  node* first = buckets[n];
+
+  for (node* cur = first; cur; cur = cur->next) 
+    if (equals(get_key(cur->val), get_key(obj)))
+      return pair<iterator, bool>(iterator(cur, this), false);
+
+  node* tmp = new_node(obj);
+  tmp->next = first;
+  buckets[n] = tmp;
+  ++num_elements;
+  return pair<iterator, bool>(iterator(tmp, this), true);
+}
+
+template <class V, class K, class HF, class Ex, class Eq, class A>
+typename hashtable<V, K, HF, Ex, Eq, A>::iterator 
+hashtable<V, K, HF, Ex, Eq, A>::insert_equal_noresize(const value_type& obj)
+{
+  const size_type n = bkt_num(obj);
+  node* first = buckets[n];
+
+  for (node* cur = first; cur; cur = cur->next) 
+    if (equals(get_key(cur->val), get_key(obj))) {
+      node* tmp = new_node(obj);
+      tmp->next = cur->next;
+      cur->next = tmp;
+      ++num_elements;
+      return iterator(tmp, this);
+    }
+
+  node* tmp = new_node(obj);
+  tmp->next = first;
+  buckets[n] = tmp;
+  ++num_elements;
+  return iterator(tmp, this);
+}
+
+template <class V, class K, class HF, class Ex, class Eq, class A>
+typename hashtable<V, K, HF, Ex, Eq, A>::reference 
+hashtable<V, K, HF, Ex, Eq, A>::find_or_insert(const value_type& obj)
+{
+  resize(num_elements + 1);
+
+  size_type n = bkt_num(obj);
+  node* first = buckets[n];
+
+  for (node* cur = first; cur; cur = cur->next)
+    if (equals(get_key(cur->val), get_key(obj)))
+      return cur->val;
+
+  node* tmp = new_node(obj);
+  tmp->next = first;
+  buckets[n] = tmp;
+  ++num_elements;
+  return tmp->val;
+}
+
+template <class V, class K, class HF, class Ex, class Eq, class A>
+pair<typename hashtable<V, K, HF, Ex, Eq, A>::iterator,
+     typename hashtable<V, K, HF, Ex, Eq, A>::iterator> 
+hashtable<V, K, HF, Ex, Eq, A>::equal_range(const key_type& key)
+{
+  typedef pair<iterator, iterator> pii;
+  const size_type n = bkt_num_key(key);
+
+  for (node* first = buckets[n]; first; first = first->next) {
+    if (equals(get_key(first->val), key)) {
+      for (node* cur = first->next; cur; cur = cur->next)
+        if (!equals(get_key(cur->val), key))
+          return pii(iterator(first, this), iterator(cur, this));
+      for (size_type m = n + 1; m < buckets.size(); ++m)
+        if (buckets[m])
+          return pii(iterator(first, this),
+                     iterator(buckets[m], this));
+      return pii(iterator(first, this), end());
+    }
+  }
+  return pii(end(), end());
+}
+
+template <class V, class K, class HF, class Ex, class Eq, class A>
+pair<typename hashtable<V, K, HF, Ex, Eq, A>::const_iterator, 
+     typename hashtable<V, K, HF, Ex, Eq, A>::const_iterator> 
+hashtable<V, K, HF, Ex, Eq, A>::equal_range(const key_type& key) const
+{
+  typedef pair<const_iterator, const_iterator> pii;
+  const size_type n = bkt_num_key(key);
+
+  for (const node* first = buckets[n] ; first; first = first->next) {
+    if (equals(get_key(first->val), key)) {
+      for (const node* cur = first->next; cur; cur = cur->next)
+        if (!equals(get_key(cur->val), key))
+          return pii(const_iterator(first, this),
+                     const_iterator(cur, this));
+      for (size_type m = n + 1; m < buckets.size(); ++m)
+        if (buckets[m])
+          return pii(const_iterator(first, this),
+                     const_iterator(buckets[m], this));
+      return pii(const_iterator(first, this), end());
+    }
+  }
+  return pii(end(), end());
+}
+
+template <class V, class K, class HF, class Ex, class Eq, class A>
+typename hashtable<V, K, HF, Ex, Eq, A>::size_type 
+hashtable<V, K, HF, Ex, Eq, A>::erase(const key_type& key)
+{
+  const size_type n = bkt_num_key(key);
+  node* first = buckets[n];
+  size_type erased = 0;
+
+  if (first) {
+    node* cur = first;
+    node* next = cur->next;
+    while (next) {
+      if (equals(get_key(next->val), key)) {
+        cur->next = next->next;
+        delete_node(next);
+        next = cur->next;
+        ++erased;
+        --num_elements;
+      }
+      else {
+        cur = next;
+        next = cur->next;
+      }
+    }
+    if (equals(get_key(first->val), key)) {
+      buckets[n] = first->next;
+      delete_node(first);
+      ++erased;
+      --num_elements;
+    }
+  }
+  return erased;
+}
+
+template <class V, class K, class HF, class Ex, class Eq, class A>
+void hashtable<V, K, HF, Ex, Eq, A>::erase(const iterator& it)
+{
+  if (node* const p = it.cur) {
+    const size_type n = bkt_num(p->val);
+    node* cur = buckets[n];
+
+    if (cur == p) {
+      buckets[n] = cur->next;
+      delete_node(cur);
+      --num_elements;
+    }
+    else {
+      node* next = cur->next;
+      while (next) {
+        if (next == p) {
+          cur->next = next->next;
+          delete_node(next);
+          --num_elements;
+          break;
+        }
+        else {
+          cur = next;
+          next = cur->next;
+        }
+      }
+    }
+  }
+}
+
+template <class V, class K, class HF, class Ex, class Eq, class A>
+void hashtable<V, K, HF, Ex, Eq, A>::erase(iterator first, iterator last)
+{
+  size_type f_bucket = first.cur ? bkt_num(first.cur->val) : buckets.size();
+  size_type l_bucket = last.cur ? bkt_num(last.cur->val) : buckets.size();
+
+  if (first.cur == last.cur)
+    return;
+  else if (f_bucket == l_bucket)
+    erase_bucket(f_bucket, first.cur, last.cur);
+  else {
+    erase_bucket(f_bucket, first.cur, 0);
+    for (size_type n = f_bucket + 1; n < l_bucket; ++n)
+      erase_bucket(n, 0);
+    if (l_bucket != buckets.size())
+      erase_bucket(l_bucket, last.cur);
+  }
+}
+
+template <class V, class K, class HF, class Ex, class Eq, class A>
+inline void
+hashtable<V, K, HF, Ex, Eq, A>::erase(const_iterator first,
+                                      const_iterator last)
+{
+  erase(iterator(const_cast<node*>(first.cur),
+                 const_cast<hashtable*>(first.ht)),
+        iterator(const_cast<node*>(last.cur),
+                 const_cast<hashtable*>(last.ht)));
+}
+
+template <class V, class K, class HF, class Ex, class Eq, class A>
+inline void
+hashtable<V, K, HF, Ex, Eq, A>::erase(const const_iterator& it)
+{
+  erase(iterator(const_cast<node*>(it.cur),
+                 const_cast<hashtable*>(it.ht)));
+}
+
+template <class V, class K, class HF, class Ex, class Eq, class A>
+void hashtable<V, K, HF, Ex, Eq, A>::resize(size_type num_elements_hint)
+{
+  const size_type old_n = buckets.size();
+  if (num_elements_hint > old_n) {
+    const size_type n = next_size(num_elements_hint);
+    if (n > old_n) {
+      vector<node*, A> tmp(n, (node*) 0);
+      __STL_TRY {
+        for (size_type bucket = 0; bucket < old_n; ++bucket) {
+          node* first = buckets[bucket];
+          while (first) {
+            size_type new_bucket = bkt_num(first->val, n);
+            buckets[bucket] = first->next;
+            first->next = tmp[new_bucket];
+            tmp[new_bucket] = first;
+            first = buckets[bucket];          
+          }
+        }
+        buckets.swap(tmp);
+      }
+#         ifdef __STL_USE_EXCEPTIONS
+      catch(...) {
+        for (size_type bucket = 0; bucket < tmp.size(); ++bucket) {
+          while (tmp[bucket]) {
+            node* next = tmp[bucket]->next;
+            delete_node(tmp[bucket]);
+            tmp[bucket] = next;
+          }
+        }
+        throw;
+      }
+#         endif /* __STL_USE_EXCEPTIONS */
+    }
+  }
+}
+
+template <class V, class K, class HF, class Ex, class Eq, class A>
+void hashtable<V, K, HF, Ex, Eq, A>::erase_bucket(const size_type n, 
+                                                  node* first, node* last)
+{
+  node* cur = buckets[n];
+  if (cur == first)
+    erase_bucket(n, last);
+  else {
+    node* next;
+    for (next = cur->next; next != first; cur = next, next = cur->next)
+      ;
+    while (next) {
+      cur->next = next->next;
+      delete_node(next);
+      next = cur->next;
+      --num_elements;
+    }
+  }
+}
+
+template <class V, class K, class HF, class Ex, class Eq, class A>
+void 
+hashtable<V, K, HF, Ex, Eq, A>::erase_bucket(const size_type n, node* last)
+{
+  node* cur = buckets[n];
+  while (cur != last) {
+    node* next = cur->next;
+    delete_node(cur);
+    cur = next;
+    buckets[n] = cur;
+    --num_elements;
+  }
+}
+
+template <class V, class K, class HF, class Ex, class Eq, class A>
+void hashtable<V, K, HF, Ex, Eq, A>::clear()
+{
+  for (size_type i = 0; i < buckets.size(); ++i) {
+    node* cur = buckets[i];
+    while (cur != 0) {
+      node* next = cur->next;
+      delete_node(cur);
+      cur = next;
+    }
+    buckets[i] = 0;
+  }
+  num_elements = 0;
+}
+
+    
+template <class V, class K, class HF, class Ex, class Eq, class A>
+void hashtable<V, K, HF, Ex, Eq, A>::copy_from(const hashtable& ht)
+{
+  buckets.clear();
+  buckets.reserve(ht.buckets.size());
+  buckets.insert(buckets.end(), ht.buckets.size(), (node*) 0);
+  __STL_TRY {
+    for (size_type i = 0; i < ht.buckets.size(); ++i) {
+      if (const node* cur = ht.buckets[i]) {
+        node* copy = new_node(cur->val);
+        buckets[i] = copy;
+
+        for (node* next = cur->next; next; cur = next, next = cur->next) {
+          copy->next = new_node(next->val);
+          copy = copy->next;
+        }
+      }
+    }
+    num_elements = ht.num_elements;
+  }
+  __STL_UNWIND(clear());
+}
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_HASHTABLE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_heap.h b/libstdc++/stl/stl_heap.h
new file mode 100644 (file)
index 0000000..3fe24f8
--- /dev/null
@@ -0,0 +1,226 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_HEAP_H
+#define __SGI_STL_INTERNAL_HEAP_H
+
+__STL_BEGIN_NAMESPACE
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1209
+#endif
+
+template <class RandomAccessIterator, class Distance, class T>
+void __push_heap(RandomAccessIterator first, Distance holeIndex,
+                 Distance topIndex, T value) {
+  Distance parent = (holeIndex - 1) / 2;
+  while (holeIndex > topIndex && *(first + parent) < value) {
+    *(first + holeIndex) = *(first + parent);
+    holeIndex = parent;
+    parent = (holeIndex - 1) / 2;
+  }    
+  *(first + holeIndex) = value;
+}
+
+template <class RandomAccessIterator, class Distance, class T>
+inline void __push_heap_aux(RandomAccessIterator first,
+                            RandomAccessIterator last, Distance*, T*) {
+  __push_heap(first, Distance((last - first) - 1), Distance(0), 
+              T(*(last - 1)));
+}
+
+template <class RandomAccessIterator>
+inline void push_heap(RandomAccessIterator first, RandomAccessIterator last) {
+  __push_heap_aux(first, last, distance_type(first), value_type(first));
+}
+
+template <class RandomAccessIterator, class Distance, class T, class Compare>
+void __push_heap(RandomAccessIterator first, Distance holeIndex,
+                 Distance topIndex, T value, Compare comp) {
+  Distance parent = (holeIndex - 1) / 2;
+  while (holeIndex > topIndex && comp(*(first + parent), value)) {
+    *(first + holeIndex) = *(first + parent);
+    holeIndex = parent;
+    parent = (holeIndex - 1) / 2;
+  }
+  *(first + holeIndex) = value;
+}
+
+template <class RandomAccessIterator, class Compare, class Distance, class T>
+inline void __push_heap_aux(RandomAccessIterator first,
+                            RandomAccessIterator last, Compare comp,
+                            Distance*, T*) {
+  __push_heap(first, Distance((last - first) - 1), Distance(0), 
+              T(*(last - 1)), comp);
+}
+
+template <class RandomAccessIterator, class Compare>
+inline void push_heap(RandomAccessIterator first, RandomAccessIterator last,
+                      Compare comp) {
+  __push_heap_aux(first, last, comp, distance_type(first), value_type(first));
+}
+
+template <class RandomAccessIterator, class Distance, class T>
+void __adjust_heap(RandomAccessIterator first, Distance holeIndex,
+                   Distance len, T value) {
+  Distance topIndex = holeIndex;
+  Distance secondChild = 2 * holeIndex + 2;
+  while (secondChild < len) {
+    if (*(first + secondChild) < *(first + (secondChild - 1)))
+      secondChild--;
+    *(first + holeIndex) = *(first + secondChild);
+    holeIndex = secondChild;
+    secondChild = 2 * (secondChild + 1);
+  }
+  if (secondChild == len) {
+    *(first + holeIndex) = *(first + (secondChild - 1));
+    holeIndex = secondChild - 1;
+  }
+  __push_heap(first, holeIndex, topIndex, value);
+}
+
+template <class RandomAccessIterator, class T, class Distance>
+inline void __pop_heap(RandomAccessIterator first, RandomAccessIterator last,
+                       RandomAccessIterator result, T value, Distance*) {
+  *result = *first;
+  __adjust_heap(first, Distance(0), Distance(last - first), value);
+}
+
+template <class RandomAccessIterator, class T>
+inline void __pop_heap_aux(RandomAccessIterator first,
+                           RandomAccessIterator last, T*) {
+  __pop_heap(first, last - 1, last - 1, T(*(last - 1)), distance_type(first));
+}
+
+template <class RandomAccessIterator>
+inline void pop_heap(RandomAccessIterator first, RandomAccessIterator last) {
+  __pop_heap_aux(first, last, value_type(first));
+}
+
+template <class RandomAccessIterator, class Distance, class T, class Compare>
+void __adjust_heap(RandomAccessIterator first, Distance holeIndex,
+                   Distance len, T value, Compare comp) {
+  Distance topIndex = holeIndex;
+  Distance secondChild = 2 * holeIndex + 2;
+  while (secondChild < len) {
+    if (comp(*(first + secondChild), *(first + (secondChild - 1))))
+      secondChild--;
+    *(first + holeIndex) = *(first + secondChild);
+    holeIndex = secondChild;
+    secondChild = 2 * (secondChild + 1);
+  }
+  if (secondChild == len) {
+    *(first + holeIndex) = *(first + (secondChild - 1));
+    holeIndex = secondChild - 1;
+  }
+  __push_heap(first, holeIndex, topIndex, value, comp);
+}
+
+template <class RandomAccessIterator, class T, class Compare, class Distance>
+inline void __pop_heap(RandomAccessIterator first, RandomAccessIterator last,
+                       RandomAccessIterator result, T value, Compare comp,
+                       Distance*) {
+  *result = *first;
+  __adjust_heap(first, Distance(0), Distance(last - first), value, comp);
+}
+
+template <class RandomAccessIterator, class T, class Compare>
+inline void __pop_heap_aux(RandomAccessIterator first,
+                           RandomAccessIterator last, T*, Compare comp) {
+  __pop_heap(first, last - 1, last - 1, T(*(last - 1)), comp,
+             distance_type(first));
+}
+
+template <class RandomAccessIterator, class Compare>
+inline void pop_heap(RandomAccessIterator first, RandomAccessIterator last,
+                     Compare comp) {
+    __pop_heap_aux(first, last, value_type(first), comp);
+}
+
+template <class RandomAccessIterator, class T, class Distance>
+void __make_heap(RandomAccessIterator first, RandomAccessIterator last, T*,
+                 Distance*) {
+  if (last - first < 2) return;
+  Distance len = last - first;
+  Distance parent = (len - 2)/2;
+    
+  while (true) {
+    __adjust_heap(first, parent, len, T(*(first + parent)));
+    if (parent == 0) return;
+    parent--;
+  }
+}
+
+template <class RandomAccessIterator>
+inline void make_heap(RandomAccessIterator first, RandomAccessIterator last) {
+  __make_heap(first, last, value_type(first), distance_type(first));
+}
+
+template <class RandomAccessIterator, class Compare, class T, class Distance>
+void __make_heap(RandomAccessIterator first, RandomAccessIterator last,
+                 Compare comp, T*, Distance*) {
+  if (last - first < 2) return;
+  Distance len = last - first;
+  Distance parent = (len - 2)/2;
+    
+  while (true) {
+    __adjust_heap(first, parent, len, T(*(first + parent)), comp);
+    if (parent == 0) return;
+    parent--;
+  }
+}
+
+template <class RandomAccessIterator, class Compare>
+inline void make_heap(RandomAccessIterator first, RandomAccessIterator last,
+                      Compare comp) {
+  __make_heap(first, last, comp, value_type(first), distance_type(first));
+}
+
+template <class RandomAccessIterator>
+void sort_heap(RandomAccessIterator first, RandomAccessIterator last) {
+  while (last - first > 1) pop_heap(first, last--);
+}
+
+template <class RandomAccessIterator, class Compare>
+void sort_heap(RandomAccessIterator first, RandomAccessIterator last,
+               Compare comp) {
+  while (last - first > 1) pop_heap(first, last--, comp);
+}
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1209
+#endif
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_HEAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_iterator.h b/libstdc++/stl/stl_iterator.h
new file mode 100644 (file)
index 0000000..892db3e
--- /dev/null
@@ -0,0 +1,843 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_ITERATOR_H
+#define __SGI_STL_INTERNAL_ITERATOR_H
+
+__STL_BEGIN_NAMESPACE
+
+struct input_iterator_tag {};
+struct output_iterator_tag {};
+struct forward_iterator_tag : public input_iterator_tag {};
+struct bidirectional_iterator_tag : public forward_iterator_tag {};
+struct random_access_iterator_tag : public bidirectional_iterator_tag {};
+
+template <class T, class Distance> struct input_iterator {
+  typedef input_iterator_tag iterator_category;
+  typedef T                  value_type;
+  typedef Distance           difference_type;
+  typedef T*                 pointer;
+  typedef T&                 reference;
+};
+
+struct output_iterator {
+  typedef output_iterator_tag iterator_category;
+  typedef void                value_type;
+  typedef void                difference_type;
+  typedef void                pointer;
+  typedef void                reference;
+};
+
+template <class T, class Distance> struct forward_iterator {
+  typedef forward_iterator_tag iterator_category;
+  typedef T                    value_type;
+  typedef Distance             difference_type;
+  typedef T*                   pointer;
+  typedef T&                   reference;
+};
+
+
+template <class T, class Distance> struct bidirectional_iterator {
+  typedef bidirectional_iterator_tag iterator_category;
+  typedef T                          value_type;
+  typedef Distance                   difference_type;
+  typedef T*                         pointer;
+  typedef T&                         reference;
+};
+
+template <class T, class Distance> struct random_access_iterator {
+  typedef random_access_iterator_tag iterator_category;
+  typedef T                          value_type;
+  typedef Distance                   difference_type;
+  typedef T*                         pointer;
+  typedef T&                         reference;
+};
+
+#ifdef __STL_USE_NAMESPACES
+template <class Category, class T, class Distance = ptrdiff_t,
+          class Pointer = T*, class Reference = T&>
+struct iterator {
+  typedef Category  iterator_category;
+  typedef T         value_type;
+  typedef Distance  difference_type;
+  typedef Pointer   pointer;
+  typedef Reference reference;
+};
+#endif /* __STL_USE_NAMESPACES */
+
+#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+template <class Iterator>
+struct iterator_traits {
+  typedef typename Iterator::iterator_category iterator_category;
+  typedef typename Iterator::value_type        value_type;
+  typedef typename Iterator::difference_type   difference_type;
+  typedef typename Iterator::pointer           pointer;
+  typedef typename Iterator::reference         reference;
+};
+
+template <class T>
+struct iterator_traits<T*> {
+  typedef random_access_iterator_tag iterator_category;
+  typedef T                          value_type;
+  typedef ptrdiff_t                  difference_type;
+  typedef T*                         pointer;
+  typedef T&                         reference;
+};
+
+template <class T>
+struct iterator_traits<const T*> {
+  typedef random_access_iterator_tag iterator_category;
+  typedef T                          value_type;
+  typedef ptrdiff_t                  difference_type;
+  typedef const T*                   pointer;
+  typedef const T&                   reference;
+};
+
+template <class Iterator>
+inline typename iterator_traits<Iterator>::iterator_category
+iterator_category(const Iterator&) {
+  typedef typename iterator_traits<Iterator>::iterator_category category;
+  return category();
+}
+
+template <class Iterator>
+inline typename iterator_traits<Iterator>::difference_type*
+distance_type(const Iterator&) {
+  return static_cast<typename iterator_traits<Iterator>::difference_type*>(0);
+}
+
+template <class Iterator>
+inline typename iterator_traits<Iterator>::value_type*
+value_type(const Iterator&) {
+  return static_cast<typename iterator_traits<Iterator>::value_type*>(0);
+}
+
+#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+template <class T, class Distance> 
+inline input_iterator_tag 
+iterator_category(const input_iterator<T, Distance>&) {
+  return input_iterator_tag();
+}
+
+inline output_iterator_tag iterator_category(const output_iterator&) {
+  return output_iterator_tag();
+}
+
+template <class T, class Distance> 
+inline forward_iterator_tag
+iterator_category(const forward_iterator<T, Distance>&) {
+  return forward_iterator_tag();
+}
+
+template <class T, class Distance> 
+inline bidirectional_iterator_tag
+iterator_category(const bidirectional_iterator<T, Distance>&) {
+  return bidirectional_iterator_tag();
+}
+
+template <class T, class Distance> 
+inline random_access_iterator_tag
+iterator_category(const random_access_iterator<T, Distance>&) {
+  return random_access_iterator_tag();
+}
+
+template <class T>
+inline random_access_iterator_tag iterator_category(const T*) {
+  return random_access_iterator_tag();
+}
+
+template <class T, class Distance> 
+inline T* value_type(const input_iterator<T, Distance>&) {
+  return (T*)(0); 
+}
+
+template <class T, class Distance> 
+inline T* value_type(const forward_iterator<T, Distance>&) {
+  return (T*)(0);
+}
+
+template <class T, class Distance> 
+inline T* value_type(const bidirectional_iterator<T, Distance>&) {
+  return (T*)(0);
+}
+
+template <class T, class Distance> 
+inline T* value_type(const random_access_iterator<T, Distance>&) {
+  return (T*)(0);
+}
+
+template <class T>
+inline T* value_type(const T*) { return (T*)(0); }
+
+template <class T, class Distance> 
+inline Distance* distance_type(const input_iterator<T, Distance>&) {
+  return (Distance*)(0);
+}
+
+template <class T, class Distance> 
+inline Distance* distance_type(const forward_iterator<T, Distance>&) {
+  return (Distance*)(0);
+}
+
+template <class T, class Distance> 
+inline Distance* 
+distance_type(const bidirectional_iterator<T, Distance>&) {
+  return (Distance*)(0);
+}
+
+template <class T, class Distance> 
+inline Distance* 
+distance_type(const random_access_iterator<T, Distance>&) {
+  return (Distance*)(0);
+}
+
+template <class T>
+inline ptrdiff_t* distance_type(const T*) { return (ptrdiff_t*)(0); }
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+template <class InputIterator, class Distance>
+inline void __distance(InputIterator first, InputIterator last, Distance& n, 
+                       input_iterator_tag) {
+  while (first != last) { ++first; ++n; }
+}
+
+template <class RandomAccessIterator, class Distance>
+inline void __distance(RandomAccessIterator first, RandomAccessIterator last, 
+                       Distance& n, random_access_iterator_tag) {
+  n += last - first;
+}
+
+template <class InputIterator, class Distance>
+inline void distance(InputIterator first, InputIterator last, Distance& n) {
+  __distance(first, last, n, iterator_category(first));
+}
+
+#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+template <class InputIterator>
+inline iterator_traits<InputIterator>::difference_type
+__distance(InputIterator first, InputIterator last, input_iterator_tag) {
+  iterator_traits<InputIterator>::difference_type n = 0;
+  while (first != last) {
+    ++first; ++n;
+  }
+  return n;
+}
+
+template <class RandomAccessIterator>
+inline iterator_traits<RandomAccessIterator>::difference_type
+__distance(RandomAccessIterator first, RandomAccessIterator last,
+           random_access_iterator_tag) {
+  return last - first;
+}
+
+template <class InputIterator>
+inline iterator_traits<InputIterator>::difference_type
+distance(InputIterator first, InputIterator last) {
+  typedef typename iterator_traits<InputIterator>::iterator_category category;
+  return __distance(first, last, category());
+}
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+template <class InputIterator, class Distance>
+inline void __advance(InputIterator& i, Distance n, input_iterator_tag) {
+  while (n--) ++i;
+}
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1183
+#endif
+
+template <class BidirectionalIterator, class Distance>
+inline void __advance(BidirectionalIterator& i, Distance n, 
+                      bidirectional_iterator_tag) {
+  if (n >= 0)
+    while (n--) ++i;
+  else
+    while (n++) --i;
+}
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1183
+#endif
+
+template <class RandomAccessIterator, class Distance>
+inline void __advance(RandomAccessIterator& i, Distance n, 
+                      random_access_iterator_tag) {
+  i += n;
+}
+
+template <class InputIterator, class Distance>
+inline void advance(InputIterator& i, Distance n) {
+  __advance(i, n, iterator_category(i));
+}
+
+template <class Container>
+class back_insert_iterator {
+protected:
+  Container* container;
+public:
+  typedef output_iterator_tag iterator_category;
+  typedef void                value_type;
+  typedef void                difference_type;
+  typedef void                pointer;
+  typedef void                reference;
+
+  explicit back_insert_iterator(Container& x) : container(&x) {}
+  back_insert_iterator<Container>&
+  operator=(const typename Container::value_type& value) { 
+    container->push_back(value);
+    return *this;
+  }
+  back_insert_iterator<Container>& operator*() { return *this; }
+  back_insert_iterator<Container>& operator++() { return *this; }
+  back_insert_iterator<Container>& operator++(int) { return *this; }
+};
+
+#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+template <class Container>
+inline output_iterator_tag
+iterator_category(const back_insert_iterator<Container>&)
+{
+  return output_iterator_tag();
+}
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+template <class Container>
+inline back_insert_iterator<Container> back_inserter(Container& x) {
+  return back_insert_iterator<Container>(x);
+}
+
+template <class Container>
+class front_insert_iterator {
+protected:
+  Container* container;
+public:
+  typedef output_iterator_tag iterator_category;
+  typedef void                value_type;
+  typedef void                difference_type;
+  typedef void                pointer;
+  typedef void                reference;
+
+  explicit front_insert_iterator(Container& x) : container(&x) {}
+  front_insert_iterator<Container>&
+  operator=(const typename Container::value_type& value) { 
+    container->push_front(value);
+    return *this;
+  }
+  front_insert_iterator<Container>& operator*() { return *this; }
+  front_insert_iterator<Container>& operator++() { return *this; }
+  front_insert_iterator<Container>& operator++(int) { return *this; }
+};
+
+#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+template <class Container>
+inline output_iterator_tag
+iterator_category(const front_insert_iterator<Container>&)
+{
+  return output_iterator_tag();
+}
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+template <class Container>
+inline front_insert_iterator<Container> front_inserter(Container& x) {
+  return front_insert_iterator<Container>(x);
+}
+
+template <class Container>
+class insert_iterator {
+protected:
+  Container* container;
+  typename Container::iterator iter;
+public:
+  typedef output_iterator_tag iterator_category;
+  typedef void                value_type;
+  typedef void                difference_type;
+  typedef void                pointer;
+  typedef void                reference;
+
+  insert_iterator(Container& x, typename Container::iterator i) 
+    : container(&x), iter(i) {}
+  insert_iterator<Container>&
+  operator=(const typename Container::value_type& value) { 
+    iter = container->insert(iter, value);
+    ++iter;
+    return *this;
+  }
+  insert_iterator<Container>& operator*() { return *this; }
+  insert_iterator<Container>& operator++() { return *this; }
+  insert_iterator<Container>& operator++(int) { return *this; }
+};
+
+#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+template <class Container>
+inline output_iterator_tag
+iterator_category(const insert_iterator<Container>&)
+{
+  return output_iterator_tag();
+}
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+template <class Container, class Iterator>
+inline insert_iterator<Container> inserter(Container& x, Iterator i) {
+  typedef typename Container::iterator iter;
+  return insert_iterator<Container>(x, iter(i));
+}
+
+#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
+template <class BidirectionalIterator, class T, class Reference = T&, 
+          class Distance = ptrdiff_t> 
+#else
+template <class BidirectionalIterator, class T, class Reference, 
+          class Distance> 
+#endif
+class reverse_bidirectional_iterator {
+  typedef reverse_bidirectional_iterator<BidirectionalIterator, T, Reference,
+                                         Distance> self;
+protected:
+  BidirectionalIterator current;
+public:
+  typedef bidirectional_iterator_tag iterator_category;
+  typedef T                          value_type;
+  typedef Distance                   difference_type;
+  typedef T*                         pointer;
+  typedef Reference                  reference;
+
+  reverse_bidirectional_iterator() {}
+  explicit reverse_bidirectional_iterator(BidirectionalIterator x)
+    : current(x) {}
+  BidirectionalIterator base() const { return current; }
+  Reference operator*() const {
+    BidirectionalIterator tmp = current;
+    return *--tmp;
+  }
+#ifndef __SGI_STL_NO_ARROW_OPERATOR
+  pointer operator->() const { return &(operator*()); }
+#endif /* __SGI_STL_NO_ARROW_OPERATOR */
+  self& operator++() {
+    --current;
+    return *this;
+  }
+  self operator++(int) {
+    self tmp = *this;
+    --current;
+    return tmp;
+  }
+  self& operator--() {
+    ++current;
+    return *this;
+  }
+  self operator--(int) {
+    self tmp = *this;
+    ++current;
+    return tmp;
+  }
+};
+
+#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+template <class BidirectionalIterator, class T, class Reference, 
+          class Distance>
+inline bidirectional_iterator_tag
+iterator_category(const reverse_bidirectional_iterator<BidirectionalIterator,
+                                                       T,
+                                                       Reference, Distance>&) {
+  return bidirectional_iterator_tag();
+}
+
+template <class BidirectionalIterator, class T, class Reference, 
+          class Distance>
+inline T*
+value_type(const reverse_bidirectional_iterator<BidirectionalIterator, T,
+                                               Reference, Distance>&) {
+  return (T*) 0;
+}
+
+template <class BidirectionalIterator, class T, class Reference, 
+          class Distance>
+inline Distance*
+distance_type(const reverse_bidirectional_iterator<BidirectionalIterator, T,
+                                                  Reference, Distance>&) {
+  return (Distance*) 0;
+}
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+template <class BidirectionalIterator, class T, class Reference,
+          class Distance>
+inline bool operator==(
+    const reverse_bidirectional_iterator<BidirectionalIterator, T, Reference,
+                                         Distance>& x, 
+    const reverse_bidirectional_iterator<BidirectionalIterator, T, Reference,
+                                         Distance>& y) {
+  return x.base() == y.base();
+}
+
+#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+// This is the new version of reverse_iterator, as defined in the
+//  draft C++ standard.  It relies on the iterator_traits template,
+//  which in turn relies on partial specialization.  The class
+//  reverse_bidirectional_iterator is no longer part of the draft
+//  standard, but it is retained for backward compatibility.
+
+template <class Iterator>
+class reverse_iterator 
+{
+protected:
+  Iterator current;
+public:
+  typedef typename iterator_traits<Iterator>::iterator_category
+          iterator_category;
+  typedef typename iterator_traits<Iterator>::value_type
+          value_type;
+  typedef typename iterator_traits<Iterator>::difference_type
+          difference_type;
+  typedef typename iterator_traits<Iterator>::pointer
+          pointer;
+  typedef typename iterator_traits<Iterator>::reference
+          reference;
+
+  typedef Iterator iterator_type;
+  typedef reverse_iterator<Iterator> self;
+
+public:
+  reverse_iterator() {}
+  explicit reverse_iterator(iterator_type x) : current(x) {}
+
+  reverse_iterator(const self& x) : current(x.current) {}
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class Iter>
+  reverse_iterator(const reverse_iterator<Iter>& x) : current(x.current) {}
+#endif /* __STL_MEMBER_TEMPLATES */
+    
+  iterator_type base() const { return current; }
+  reference operator*() const {
+    Iterator tmp = current;
+    return *--tmp;
+  }
+#ifndef __SGI_STL_NO_ARROW_OPERATOR
+  pointer operator->() const { return &(operator*()); }
+#endif /* __SGI_STL_NO_ARROW_OPERATOR */
+
+  self& operator++() {
+    --current;
+    return *this;
+  }
+  self operator++(int) {
+    self tmp = *this;
+    --current;
+    return tmp;
+  }
+  self& operator--() {
+    ++current;
+    return *this;
+  }
+  self operator--(int) {
+    self tmp = *this;
+    ++current;
+    return tmp;
+  }
+
+  self operator+(difference_type n) const {
+    return self(current - n);
+  }
+  self& operator+=(difference_type n) {
+    current -= n;
+    return *this;
+  }
+  self operator-(difference_type n) const {
+    return self(current + n);
+  }
+  self& operator-=(difference_type n) {
+    current += n;
+    return *this;
+  }
+  reference operator[](difference_type n) const { return *(*this + n); }  
+}; 
+template <class Iterator>
+inline bool operator==(const reverse_iterator<Iterator>& x, 
+                       const reverse_iterator<Iterator>& y) {
+  return x.base() == y.base();
+}
+
+template <class Iterator>
+inline bool operator<(const reverse_iterator<Iterator>& x, 
+                      const reverse_iterator<Iterator>& y) {
+  return y.base() < x.base();
+}
+
+template <class Iterator>
+inline typename reverse_iterator<Iterator>::difference_type
+operator-(const reverse_iterator<Iterator>& x, 
+          const reverse_iterator<Iterator>& y) {
+  return y.base() - x.base();
+}
+
+template <class Iterator>
+inline reverse_iterator<Iterator> 
+operator+(reverse_iterator<Iterator>::difference_type n,
+          const reverse_iterator<Iterator>& x) {
+  return reverse_iterator<Iterator>(x.base() - n);
+}
+
+#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+// This is the old version of reverse_iterator, as found in the original
+//  HP STL.  It does not use partial specialization.
+
+#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
+template <class RandomAccessIterator, class T, class Reference = T&,
+          class Distance = ptrdiff_t> 
+#else
+template <class RandomAccessIterator, class T, class Reference,
+          class Distance> 
+#endif
+class reverse_iterator {
+  typedef reverse_iterator<RandomAccessIterator, T, Reference, Distance>
+        self;
+protected:
+  RandomAccessIterator current;
+public:
+  typedef random_access_iterator_tag iterator_category;
+  typedef T                          value_type;
+  typedef Distance                   difference_type;
+  typedef T*                         pointer;
+  typedef Reference                  reference;
+
+  reverse_iterator() {}
+  explicit reverse_iterator(RandomAccessIterator x) : current(x) {}
+  RandomAccessIterator base() const { return current; }
+  Reference operator*() const { return *(current - 1); }
+#ifndef __SGI_STL_NO_ARROW_OPERATOR
+  pointer operator->() const { return &(operator*()); }
+#endif /* __SGI_STL_NO_ARROW_OPERATOR */
+  self& operator++() {
+    --current;
+    return *this;
+  }
+  self operator++(int) {
+    self tmp = *this;
+    --current;
+    return tmp;
+  }
+  self& operator--() {
+    ++current;
+    return *this;
+  }
+  self operator--(int) {
+    self tmp = *this;
+    ++current;
+    return tmp;
+  }
+  self operator+(Distance n) const {
+    return self(current - n);
+  }
+  self& operator+=(Distance n) {
+    current -= n;
+    return *this;
+  }
+  self operator-(Distance n) const {
+    return self(current + n);
+  }
+  self& operator-=(Distance n) {
+    current += n;
+    return *this;
+  }
+  Reference operator[](Distance n) const { return *(*this + n); }
+};
+
+template <class RandomAccessIterator, class T, class Reference, class Distance>
+inline random_access_iterator_tag
+iterator_category(const reverse_iterator<RandomAccessIterator, T,
+                                         Reference, Distance>&) {
+  return random_access_iterator_tag();
+}
+
+template <class RandomAccessIterator, class T, class Reference, class Distance>
+inline T* value_type(const reverse_iterator<RandomAccessIterator, T,
+                                            Reference, Distance>&) {
+  return (T*) 0;
+}
+
+template <class RandomAccessIterator, class T, class Reference, class Distance>
+inline Distance* distance_type(const reverse_iterator<RandomAccessIterator, T,
+                                                      Reference, Distance>&) {
+  return (Distance*) 0;
+}
+
+
+template <class RandomAccessIterator, class T, class Reference, class Distance>
+inline bool operator==(const reverse_iterator<RandomAccessIterator, T,
+                                              Reference, Distance>& x, 
+                       const reverse_iterator<RandomAccessIterator, T,
+                                              Reference, Distance>& y) {
+  return x.base() == y.base();
+}
+
+template <class RandomAccessIterator, class T, class Reference, class Distance>
+inline bool operator<(const reverse_iterator<RandomAccessIterator, T,
+                                             Reference, Distance>& x, 
+                      const reverse_iterator<RandomAccessIterator, T,
+                                             Reference, Distance>& y) {
+  return y.base() < x.base();
+}
+
+template <class RandomAccessIterator, class T, class Reference, class Distance>
+inline Distance operator-(const reverse_iterator<RandomAccessIterator, T,
+                                                 Reference, Distance>& x, 
+                          const reverse_iterator<RandomAccessIterator, T,
+                                                 Reference, Distance>& y) {
+  return y.base() - x.base();
+}
+
+template <class RandomAccessIter, class T, class Ref, class Dist>
+inline reverse_iterator<RandomAccessIter, T, Ref, Dist> 
+operator+(Dist n, const reverse_iterator<RandomAccessIter, T, Ref, Dist>& x) {
+  return reverse_iterator<RandomAccessIter, T, Ref, Dist>(x.base() - n);
+}
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+template <class T, class Distance = ptrdiff_t> 
+class istream_iterator {
+  friend bool
+  operator== __STL_NULL_TMPL_ARGS (const istream_iterator<T, Distance>& x,
+                                   const istream_iterator<T, Distance>& y);
+protected:
+  istream* stream;
+  T value;
+  bool end_marker;
+  void read() {
+    end_marker = (*stream) ? true : false;
+    if (end_marker) *stream >> value;
+    end_marker = (*stream) ? true : false;
+  }
+public:
+  typedef input_iterator_tag iterator_category;
+  typedef T                  value_type;
+  typedef Distance           difference_type;
+  typedef const T*           pointer;
+  typedef const T&           reference;
+
+  istream_iterator() : stream(&cin), end_marker(false) {}
+  istream_iterator(istream& s) : stream(&s) { read(); }
+  reference operator*() const { return value; }
+#ifndef __SGI_STL_NO_ARROW_OPERATOR
+  pointer operator->() const { return &(operator*()); }
+#endif /* __SGI_STL_NO_ARROW_OPERATOR */
+  istream_iterator<T, Distance>& operator++() { 
+    read(); 
+    return *this;
+  }
+  istream_iterator<T, Distance> operator++(int)  {
+    istream_iterator<T, Distance> tmp = *this;
+    read();
+    return tmp;
+  }
+};
+
+#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+template <class T, class Distance>
+inline input_iterator_tag 
+iterator_category(const istream_iterator<T, Distance>&) {
+  return input_iterator_tag();
+}
+
+template <class T, class Distance>
+inline T* value_type(const istream_iterator<T, Distance>&) { return (T*) 0; }
+
+template <class T, class Distance>
+inline Distance* distance_type(const istream_iterator<T, Distance>&) {
+  return (Distance*) 0;
+}
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+template <class T, class Distance>
+inline bool operator==(const istream_iterator<T, Distance>& x,
+                       const istream_iterator<T, Distance>& y) {
+  return x.stream == y.stream && x.end_marker == y.end_marker ||
+         x.end_marker == false && y.end_marker == false;
+}
+
+template <class T>
+class ostream_iterator {
+protected:
+  ostream* stream;
+  const char* string;
+public:
+  typedef output_iterator_tag iterator_category;
+  typedef void                value_type;
+  typedef void                difference_type;
+  typedef void                pointer;
+  typedef void                reference;
+
+  ostream_iterator(ostream& s) : stream(&s), string(0) {}
+  ostream_iterator(ostream& s, const char* c) : stream(&s), string(c)  {}
+  ostream_iterator<T>& operator=(const T& value) { 
+    *stream << value;
+    if (string) *stream << string;
+    return *this;
+  }
+  ostream_iterator<T>& operator*() { return *this; }
+  ostream_iterator<T>& operator++() { return *this; } 
+  ostream_iterator<T>& operator++(int) { return *this; } 
+};
+
+#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+template <class T>
+inline output_iterator_tag 
+iterator_category(const ostream_iterator<T>&) {
+  return output_iterator_tag();
+}
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_ITERATOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_list.h b/libstdc++/stl/stl_list.h
new file mode 100644 (file)
index 0000000..ac836b6
--- /dev/null
@@ -0,0 +1,617 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_LIST_H
+#define __SGI_STL_INTERNAL_LIST_H
+
+__STL_BEGIN_NAMESPACE
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1174
+#endif
+
+template <class T>
+struct __list_node {
+  typedef void* void_pointer;
+  void_pointer next;
+  void_pointer prev;
+  T data;
+};
+
+template<class T, class Ref, class Ptr>
+struct __list_iterator {
+  typedef __list_iterator<T, T&, T*>             iterator;
+  typedef __list_iterator<T, const T&, const T*> const_iterator;
+  typedef __list_iterator<T, Ref, Ptr>           self;
+
+  typedef bidirectional_iterator_tag iterator_category;
+  typedef T value_type;
+  typedef Ptr pointer;
+  typedef Ref reference;
+  typedef __list_node<T>* link_type;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type;
+
+  link_type node;
+
+  __list_iterator(link_type x) : node(x) {}
+  __list_iterator() {}
+  __list_iterator(const iterator& x) : node(x.node) {}
+
+  bool operator==(const self& x) const { return node == x.node; }
+  bool operator!=(const self& x) const { return node != x.node; }
+  reference operator*() const { return (*node).data; }
+
+#ifndef __SGI_STL_NO_ARROW_OPERATOR
+  pointer operator->() const { return &(operator*()); }
+#endif /* __SGI_STL_NO_ARROW_OPERATOR */
+
+  self& operator++() { 
+    node = (link_type)((*node).next);
+    return *this;
+  }
+  self operator++(int) { 
+    self tmp = *this;
+    ++*this;
+    return tmp;
+  }
+  self& operator--() { 
+    node = (link_type)((*node).prev);
+    return *this;
+  }
+  self operator--(int) { 
+    self tmp = *this;
+    --*this;
+    return tmp;
+  }
+};
+
+#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+template <class T, class Ref, class Ptr>
+inline bidirectional_iterator_tag
+iterator_category(const __list_iterator<T, Ref, Ptr>&) {
+  return bidirectional_iterator_tag();
+}
+
+template <class T, class Ref, class Ptr>
+inline T*
+value_type(const __list_iterator<T, Ref, Ptr>&) {
+  return 0;
+}
+
+template <class T, class Ref, class Ptr>
+inline ptrdiff_t*
+distance_type(const __list_iterator<T, Ref, Ptr>&) {
+  return 0;
+}
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+template <class T, class Alloc = alloc>
+class list {
+protected:
+  typedef void* void_pointer;
+  typedef __list_node<T> list_node;
+  typedef simple_alloc<list_node, Alloc> list_node_allocator;
+public:      
+  typedef T value_type;
+  typedef value_type* pointer;
+  typedef const value_type* const_pointer;
+  typedef value_type& reference;
+  typedef const value_type& const_reference;
+  typedef list_node* link_type;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type;
+
+public:
+  typedef __list_iterator<T, T&, T*>             iterator;
+  typedef __list_iterator<T, const T&, const T*> const_iterator;
+
+#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
+  typedef reverse_iterator<const_iterator> const_reverse_iterator;
+  typedef reverse_iterator<iterator> reverse_iterator;
+#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+  typedef reverse_bidirectional_iterator<const_iterator, value_type,
+  const_reference, difference_type>
+  const_reverse_iterator;
+  typedef reverse_bidirectional_iterator<iterator, value_type, reference,
+  difference_type>
+  reverse_iterator; 
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+protected:
+  link_type get_node() { return list_node_allocator::allocate(); }
+  void put_node(link_type p) { list_node_allocator::deallocate(p); }
+
+  link_type create_node(const T& x) {
+    link_type p = get_node();
+    __STL_TRY {
+      construct(&p->data, x);
+    }
+    __STL_UNWIND(put_node(p));
+    return p;
+  }
+  void destroy_node(link_type p) {
+    destroy(&p->data);
+    put_node(p);
+  }
+
+protected:
+  void empty_initialize() { 
+    node = get_node();
+    node->next = node;
+    node->prev = node;
+  }
+
+  void fill_initialize(size_type n, const T& value) {
+    empty_initialize();
+    __STL_TRY {
+      insert(begin(), n, value);
+    }
+    __STL_UNWIND(clear(); put_node(node));
+  }
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  void range_initialize(InputIterator first, InputIterator last) {
+    empty_initialize();
+    __STL_TRY {
+      insert(begin(), first, last);
+    }
+    __STL_UNWIND(clear(); put_node(node));
+  }
+#else  /* __STL_MEMBER_TEMPLATES */
+  void range_initialize(const T* first, const T* last) {
+    empty_initialize();
+    __STL_TRY {
+      insert(begin(), first, last);
+    }
+    __STL_UNWIND(clear(); put_node(node));
+  }
+  void range_initialize(const_iterator first, const_iterator last) {
+    empty_initialize();
+    __STL_TRY {
+      insert(begin(), first, last);
+    }
+    __STL_UNWIND(clear(); put_node(node));
+  }
+#endif /* __STL_MEMBER_TEMPLATES */
+
+protected:
+  link_type node;
+
+public:
+  list() { empty_initialize(); }
+
+  iterator begin() { return (link_type)((*node).next); }
+  const_iterator begin() const { return (link_type)((*node).next); }
+  iterator end() { return node; }
+  const_iterator end() const { return node; }
+  reverse_iterator rbegin() { return reverse_iterator(end()); }
+  const_reverse_iterator rbegin() const { 
+    return const_reverse_iterator(end()); 
+  }
+  reverse_iterator rend() { return reverse_iterator(begin()); }
+  const_reverse_iterator rend() const { 
+    return const_reverse_iterator(begin());
+  } 
+  bool empty() const { return node->next == node; }
+  size_type size() const {
+    size_type result = 0;
+    distance(begin(), end(), result);
+    return result;
+  }
+  size_type max_size() const { return size_type(-1); }
+  reference front() { return *begin(); }
+  const_reference front() const { return *begin(); }
+  reference back() { return *(--end()); }
+  const_reference back() const { return *(--end()); }
+  void swap(list<T, Alloc>& x) { __STD::swap(node, x.node); }
+  iterator insert(iterator position, const T& x) {
+    link_type tmp = create_node(x);
+    tmp->next = position.node;
+    tmp->prev = position.node->prev;
+    (link_type(position.node->prev))->next = tmp;
+    position.node->prev = tmp;
+    return tmp;
+  }
+  iterator insert(iterator position) { return insert(position, T()); }
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  void insert(iterator position, InputIterator first, InputIterator last);
+#else /* __STL_MEMBER_TEMPLATES */
+  void insert(iterator position, const T* first, const T* last);
+  void insert(iterator position,
+              const_iterator first, const_iterator last);
+#endif /* __STL_MEMBER_TEMPLATES */
+  void insert(iterator pos, size_type n, const T& x);
+  void insert(iterator pos, int n, const T& x) {
+    insert(pos, (size_type)n, x);
+  }
+  void insert(iterator pos, long n, const T& x) {
+    insert(pos, (size_type)n, x);
+  }
+
+  void push_front(const T& x) { insert(begin(), x); }
+  void push_back(const T& x) { insert(end(), x); }
+  iterator erase(iterator position) {
+    link_type next_node = link_type(position.node->next);
+    link_type prev_node = link_type(position.node->prev);
+    prev_node->next = next_node;
+    next_node->prev = prev_node;
+    destroy_node(position.node);
+    return iterator(next_node);
+  }
+  iterator erase(iterator first, iterator last);
+  void resize(size_type new_size, const T& x);
+  void resize(size_type new_size) { resize(new_size, T()); }
+  void clear();
+
+  void pop_front() { erase(begin()); }
+  void pop_back() { 
+    iterator tmp = end();
+    erase(--tmp);
+  }
+  list(size_type n, const T& value) { fill_initialize(n, value); }
+  list(int n, const T& value) { fill_initialize(n, value); }
+  list(long n, const T& value) { fill_initialize(n, value); }
+  explicit list(size_type n) { fill_initialize(n, T()); }
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  list(InputIterator first, InputIterator last) {
+    range_initialize(first, last);
+  }
+
+#else /* __STL_MEMBER_TEMPLATES */
+  list(const T* first, const T* last) { range_initialize(first, last); }
+  list(const_iterator first, const_iterator last) {
+    range_initialize(first, last);
+  }
+#endif /* __STL_MEMBER_TEMPLATES */
+  list(const list<T, Alloc>& x) {
+    range_initialize(x.begin(), x.end());
+  }
+  ~list() {
+    clear();
+    put_node(node);
+  }
+  list<T, Alloc>& operator=(const list<T, Alloc>& x);
+
+protected:
+  void transfer(iterator position, iterator first, iterator last) {
+    if (position != last) {
+      (*(link_type((*last.node).prev))).next = position.node;
+      (*(link_type((*first.node).prev))).next = last.node;
+      (*(link_type((*position.node).prev))).next = first.node;  
+      link_type tmp = link_type((*position.node).prev);
+      (*position.node).prev = (*last.node).prev;
+      (*last.node).prev = (*first.node).prev; 
+      (*first.node).prev = tmp;
+    }
+  }
+
+public:
+  void splice(iterator position, list& x) {
+    if (!x.empty()) 
+      transfer(position, x.begin(), x.end());
+  }
+  void splice(iterator position, list&, iterator i) {
+    iterator j = i;
+    ++j;
+    if (position == i || position == j) return;
+    transfer(position, i, j);
+  }
+  void splice(iterator position, list&, iterator first, iterator last) {
+    if (first != last) 
+      transfer(position, first, last);
+  }
+  void remove(const T& value);
+  void unique();
+  void merge(list& x);
+  void reverse();
+  void sort();
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class Predicate> void remove_if(Predicate);
+  template <class BinaryPredicate> void unique(BinaryPredicate);
+  template <class StrictWeakOrdering> void merge(list&, StrictWeakOrdering);
+  template <class StrictWeakOrdering> void sort(StrictWeakOrdering);
+#endif /* __STL_MEMBER_TEMPLATES */
+
+  friend bool operator== __STL_NULL_TMPL_ARGS (const list& x, const list& y);
+};
+
+template <class T, class Alloc>
+inline bool operator==(const list<T,Alloc>& x, const list<T,Alloc>& y) {
+  typedef typename list<T,Alloc>::link_type link_type;
+  link_type e1 = x.node;
+  link_type e2 = y.node;
+  link_type n1 = (link_type) e1->next;
+  link_type n2 = (link_type) e2->next;
+  for ( ; n1 != e1 && n2 != e2 ;
+          n1 = (link_type) n1->next, n2 = (link_type) n2->next)
+    if (n1->data != n2->data)
+      return false;
+  return n1 == e1 && n2 == e2;
+}
+
+template <class T, class Alloc>
+inline bool operator<(const list<T, Alloc>& x, const list<T, Alloc>& y) {
+  return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());
+}
+
+#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class T, class Alloc>
+inline void swap(list<T, Alloc>& x, list<T, Alloc>& y) {
+  x.swap(y);
+}
+
+#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
+
+#ifdef __STL_MEMBER_TEMPLATES
+
+template <class T, class Alloc> template <class InputIterator>
+void list<T, Alloc>::insert(iterator position,
+                            InputIterator first, InputIterator last) {
+  for ( ; first != last; ++first)
+    insert(position, *first);
+}
+
+#else /* __STL_MEMBER_TEMPLATES */
+
+template <class T, class Alloc>
+void list<T, Alloc>::insert(iterator position, const T* first, const T* last) {
+  for ( ; first != last; ++first)
+    insert(position, *first);
+}
+
+template <class T, class Alloc>
+void list<T, Alloc>::insert(iterator position,
+                            const_iterator first, const_iterator last) {
+  for ( ; first != last; ++first)
+    insert(position, *first);
+}
+
+#endif /* __STL_MEMBER_TEMPLATES */
+
+template <class T, class Alloc>
+void list<T, Alloc>::insert(iterator position, size_type n, const T& x) {
+  for ( ; n > 0; --n)
+    insert(position, x);
+}
+
+template <class T, class Alloc>
+list<T,Alloc>::iterator list<T, Alloc>::erase(iterator first, iterator last) {
+  while (first != last) erase(first++);
+  return last;
+}
+
+template <class T, class Alloc>
+void list<T, Alloc>::resize(size_type new_size, const T& x)
+{
+  iterator i = begin();
+  size_type len = 0;
+  for ( ; i != end() && len < new_size; ++i, ++len)
+    ;
+  if (len == new_size)
+    erase(i, end());
+  else                          // i == end()
+    insert(end(), new_size - len, x);
+}
+
+template <class T, class Alloc> 
+void list<T, Alloc>::clear()
+{
+  link_type cur = (link_type) node->next;
+  while (cur != node) {
+    link_type tmp = cur;
+    cur = (link_type) cur->next;
+    destroy_node(tmp);
+  }
+  node->next = node;
+  node->prev = node;
+}
+
+template <class T, class Alloc>
+list<T, Alloc>& list<T, Alloc>::operator=(const list<T, Alloc>& x) {
+  if (this != &x) {
+    iterator first1 = begin();
+    iterator last1 = end();
+    const_iterator first2 = x.begin();
+    const_iterator last2 = x.end();
+    while (first1 != last1 && first2 != last2) *first1++ = *first2++;
+    if (first2 == last2)
+      erase(first1, last1);
+    else
+      insert(last1, first2, last2);
+  }
+  return *this;
+}
+
+template <class T, class Alloc>
+void list<T, Alloc>::remove(const T& value) {
+  iterator first = begin();
+  iterator last = end();
+  while (first != last) {
+    iterator next = first;
+    ++next;
+    if (*first == value) erase(first);
+    first = next;
+  }
+}
+
+template <class T, class Alloc>
+void list<T, Alloc>::unique() {
+  iterator first = begin();
+  iterator last = end();
+  if (first == last) return;
+  iterator next = first;
+  while (++next != last) {
+    if (*first == *next)
+      erase(next);
+    else
+      first = next;
+    next = first;
+  }
+}
+
+template <class T, class Alloc>
+void list<T, Alloc>::merge(list<T, Alloc>& x) {
+  iterator first1 = begin();
+  iterator last1 = end();
+  iterator first2 = x.begin();
+  iterator last2 = x.end();
+  while (first1 != last1 && first2 != last2)
+    if (*first2 < *first1) {
+      iterator next = first2;
+      transfer(first1, first2, ++next);
+      first2 = next;
+    }
+    else
+      ++first1;
+  if (first2 != last2) transfer(last1, first2, last2);
+}
+
+template <class T, class Alloc>
+void list<T, Alloc>::reverse() {
+  if (node->next == node || link_type(node->next)->next == node) return;
+  iterator first = begin();
+  ++first;
+  while (first != end()) {
+    iterator old = first;
+    ++first;
+    transfer(begin(), old, first);
+  }
+}    
+
+template <class T, class Alloc>
+void list<T, Alloc>::sort() {
+  if (node->next == node || link_type(node->next)->next == node) return;
+  list<T, Alloc> carry;
+  list<T, Alloc> counter[64];
+  int fill = 0;
+  while (!empty()) {
+    carry.splice(carry.begin(), *this, begin());
+    int i = 0;
+    while(i < fill && !counter[i].empty()) {
+      counter[i].merge(carry);
+      carry.swap(counter[i++]);
+    }
+    carry.swap(counter[i]);         
+    if (i == fill) ++fill;
+  } 
+
+  for (int i = 1; i < fill; ++i) counter[i].merge(counter[i-1]);
+  swap(counter[fill-1]);
+}
+
+#ifdef __STL_MEMBER_TEMPLATES
+
+template <class T, class Alloc> template <class Predicate>
+void list<T, Alloc>::remove_if(Predicate pred) {
+  iterator first = begin();
+  iterator last = end();
+  while (first != last) {
+    iterator next = first;
+    ++next;
+    if (pred(*first)) erase(first);
+    first = next;
+  }
+}
+
+template <class T, class Alloc> template <class BinaryPredicate>
+void list<T, Alloc>::unique(BinaryPredicate binary_pred) {
+  iterator first = begin();
+  iterator last = end();
+  if (first == last) return;
+  iterator next = first;
+  while (++next != last) {
+    if (binary_pred(*first, *next))
+      erase(next);
+    else
+      first = next;
+    next = first;
+  }
+}
+
+template <class T, class Alloc> template <class StrictWeakOrdering>
+void list<T, Alloc>::merge(list<T, Alloc>& x, StrictWeakOrdering comp) {
+  iterator first1 = begin();
+  iterator last1 = end();
+  iterator first2 = x.begin();
+  iterator last2 = x.end();
+  while (first1 != last1 && first2 != last2)
+    if (comp(*first2, *first1)) {
+      iterator next = first2;
+      transfer(first1, first2, ++next);
+      first2 = next;
+    }
+    else
+      ++first1;
+  if (first2 != last2) transfer(last1, first2, last2);
+}
+
+template <class T, class Alloc> template <class StrictWeakOrdering>
+void list<T, Alloc>::sort(StrictWeakOrdering comp) {
+  if (node->next == node || link_type(node->next)->next == node) return;
+  list<T, Alloc> carry;
+  list<T, Alloc> counter[64];
+  int fill = 0;
+  while (!empty()) {
+    carry.splice(carry.begin(), *this, begin());
+    int i = 0;
+    while(i < fill && !counter[i].empty()) {
+      counter[i].merge(carry, comp);
+      carry.swap(counter[i++]);
+    }
+    carry.swap(counter[i]);         
+    if (i == fill) ++fill;
+  } 
+
+  for (int i = 1; i < fill; ++i) counter[i].merge(counter[i-1], comp);
+  swap(counter[fill-1]);
+}
+
+#endif /* __STL_MEMBER_TEMPLATES */
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1174
+#endif
+
+__STL_END_NAMESPACE 
+
+#endif /* __SGI_STL_INTERNAL_LIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_map.h b/libstdc++/stl/stl_map.h
new file mode 100644 (file)
index 0000000..2a830cc
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_MAP_H
+#define __SGI_STL_INTERNAL_MAP_H
+
+__STL_BEGIN_NAMESPACE
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1174
+#endif
+
+#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
+template <class Key, class T, class Compare = less<Key>, class Alloc = alloc>
+#else
+template <class Key, class T, class Compare, class Alloc = alloc>
+#endif
+class map {
+public:
+
+// typedefs:
+
+  typedef Key key_type;
+  typedef T data_type;
+  typedef T mapped_type;
+  typedef pair<const Key, T> value_type;
+  typedef Compare key_compare;
+    
+  class value_compare
+    : public binary_function<value_type, value_type, bool> {
+  friend class map<Key, T, Compare, Alloc>;
+  protected :
+    Compare comp;
+    value_compare(Compare c) : comp(c) {}
+  public:
+    bool operator()(const value_type& x, const value_type& y) const {
+      return comp(x.first, y.first);
+    }
+  };
+
+private:
+  typedef rb_tree<key_type, value_type, 
+                  select1st<value_type>, key_compare, Alloc> rep_type;
+  rep_type t;  // red-black tree representing map
+public:
+  typedef typename rep_type::pointer pointer;
+  typedef typename rep_type::const_pointer const_pointer;
+  typedef typename rep_type::reference reference;
+  typedef typename rep_type::const_reference const_reference;
+  typedef typename rep_type::iterator iterator;
+  typedef typename rep_type::const_iterator const_iterator;
+  typedef typename rep_type::reverse_iterator reverse_iterator;
+  typedef typename rep_type::const_reverse_iterator const_reverse_iterator;
+  typedef typename rep_type::size_type size_type;
+  typedef typename rep_type::difference_type difference_type;
+
+  // allocation/deallocation
+
+  map() : t(Compare()) {}
+  explicit map(const Compare& comp) : t(comp) {}
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  map(InputIterator first, InputIterator last)
+    : t(Compare()) { t.insert_unique(first, last); }
+
+  template <class InputIterator>
+  map(InputIterator first, InputIterator last, const Compare& comp)
+    : t(comp) { t.insert_unique(first, last); }
+#else
+  map(const value_type* first, const value_type* last)
+    : t(Compare()) { t.insert_unique(first, last); }
+  map(const value_type* first, const value_type* last, const Compare& comp)
+    : t(comp) { t.insert_unique(first, last); }
+
+  map(const_iterator first, const_iterator last)
+    : t(Compare()) { t.insert_unique(first, last); }
+  map(const_iterator first, const_iterator last, const Compare& comp)
+    : t(comp) { t.insert_unique(first, last); }
+#endif /* __STL_MEMBER_TEMPLATES */
+
+  map(const map<Key, T, Compare, Alloc>& x) : t(x.t) {}
+  map<Key, T, Compare, Alloc>& operator=(const map<Key, T, Compare, Alloc>& x)
+  {
+    t = x.t;
+    return *this; 
+  }
+
+  // accessors:
+
+  key_compare key_comp() const { return t.key_comp(); }
+  value_compare value_comp() const { return value_compare(t.key_comp()); }
+  iterator begin() { return t.begin(); }
+  const_iterator begin() const { return t.begin(); }
+  iterator end() { return t.end(); }
+  const_iterator end() const { return t.end(); }
+  reverse_iterator rbegin() { return t.rbegin(); }
+  const_reverse_iterator rbegin() const { return t.rbegin(); }
+  reverse_iterator rend() { return t.rend(); }
+  const_reverse_iterator rend() const { return t.rend(); }
+  bool empty() const { return t.empty(); }
+  size_type size() const { return t.size(); }
+  size_type max_size() const { return t.max_size(); }
+  T& operator[](const key_type& k) {
+    return (*((insert(value_type(k, T()))).first)).second;
+  }
+  void swap(map<Key, T, Compare, Alloc>& x) { t.swap(x.t); }
+
+  // insert/erase
+
+  pair<iterator,bool> insert(const value_type& x) { return t.insert_unique(x); }
+  iterator insert(iterator position, const value_type& x) {
+    return t.insert_unique(position, x);
+  }
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  void insert(InputIterator first, InputIterator last) {
+    t.insert_unique(first, last);
+  }
+#else
+  void insert(const value_type* first, const value_type* last) {
+    t.insert_unique(first, last);
+  }
+  void insert(const_iterator first, const_iterator last) {
+    t.insert_unique(first, last);
+  }
+#endif /* __STL_MEMBER_TEMPLATES */
+
+  void erase(iterator position) { t.erase(position); }
+  size_type erase(const key_type& x) { return t.erase(x); }
+  void erase(iterator first, iterator last) { t.erase(first, last); }
+  void clear() { t.clear(); }
+
+  // map operations:
+
+  iterator find(const key_type& x) { return t.find(x); }
+  const_iterator find(const key_type& x) const { return t.find(x); }
+  size_type count(const key_type& x) const { return t.count(x); }
+  iterator lower_bound(const key_type& x) {return t.lower_bound(x); }
+  const_iterator lower_bound(const key_type& x) const {
+    return t.lower_bound(x); 
+  }
+  iterator upper_bound(const key_type& x) {return t.upper_bound(x); }
+  const_iterator upper_bound(const key_type& x) const {
+    return t.upper_bound(x); 
+  }
+  
+  pair<iterator,iterator> equal_range(const key_type& x) {
+    return t.equal_range(x);
+  }
+  pair<const_iterator,const_iterator> equal_range(const key_type& x) const {
+    return t.equal_range(x);
+  }
+  friend bool operator== __STL_NULL_TMPL_ARGS (const map&, const map&);
+  friend bool operator< __STL_NULL_TMPL_ARGS (const map&, const map&);
+};
+
+template <class Key, class T, class Compare, class Alloc>
+inline bool operator==(const map<Key, T, Compare, Alloc>& x, 
+                       const map<Key, T, Compare, Alloc>& y) {
+  return x.t == y.t;
+}
+
+template <class Key, class T, class Compare, class Alloc>
+inline bool operator<(const map<Key, T, Compare, Alloc>& x, 
+                      const map<Key, T, Compare, Alloc>& y) {
+  return x.t < y.t;
+}
+
+#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class Key, class T, class Compare, class Alloc>
+inline void swap(map<Key, T, Compare, Alloc>& x, 
+                 map<Key, T, Compare, Alloc>& y) {
+  x.swap(y);
+}
+
+#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1174
+#endif
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_MAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_multimap.h b/libstdc++/stl/stl_multimap.h
new file mode 100644 (file)
index 0000000..b82159b
--- /dev/null
@@ -0,0 +1,214 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_MULTIMAP_H
+#define __SGI_STL_INTERNAL_MULTIMAP_H
+
+__STL_BEGIN_NAMESPACE
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1174
+#endif
+
+#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
+template <class Key, class T, class Compare = less<Key>, class Alloc = alloc>
+#else
+template <class Key, class T, class Compare, class Alloc = alloc>
+#endif
+class multimap {
+public:
+
+// typedefs:
+
+  typedef Key key_type;
+  typedef T data_type;
+  typedef T mapped_type;
+  typedef pair<const Key, T> value_type;
+  typedef Compare key_compare;
+
+  class value_compare : public binary_function<value_type, value_type, bool> {
+  friend class multimap<Key, T, Compare, Alloc>;
+  protected:
+    Compare comp;
+    value_compare(Compare c) : comp(c) {}
+  public:
+    bool operator()(const value_type& x, const value_type& y) const {
+      return comp(x.first, y.first);
+    }
+  };
+
+private:
+  typedef rb_tree<key_type, value_type, 
+                  select1st<value_type>, key_compare, Alloc> rep_type;
+  rep_type t;  // red-black tree representing multimap
+public:
+  typedef typename rep_type::pointer pointer;
+  typedef typename rep_type::const_pointer const_pointer;
+  typedef typename rep_type::reference reference;
+  typedef typename rep_type::const_reference const_reference;
+  typedef typename rep_type::iterator iterator;
+  typedef typename rep_type::const_iterator const_iterator; 
+  typedef typename rep_type::reverse_iterator reverse_iterator;
+  typedef typename rep_type::const_reverse_iterator const_reverse_iterator;
+  typedef typename rep_type::size_type size_type;
+  typedef typename rep_type::difference_type difference_type;
+
+// allocation/deallocation
+
+  multimap() : t(Compare()) { }
+  explicit multimap(const Compare& comp) : t(comp) { }
+
+#ifdef __STL_MEMBER_TEMPLATES  
+  template <class InputIterator>
+  multimap(InputIterator first, InputIterator last)
+    : t(Compare()) { t.insert_equal(first, last); }
+
+  template <class InputIterator>
+  multimap(InputIterator first, InputIterator last, const Compare& comp)
+    : t(comp) { t.insert_equal(first, last); }
+#else
+  multimap(const value_type* first, const value_type* last)
+    : t(Compare()) { t.insert_equal(first, last); }
+  multimap(const value_type* first, const value_type* last,
+           const Compare& comp)
+    : t(comp) { t.insert_equal(first, last); }
+
+  multimap(const_iterator first, const_iterator last)
+    : t(Compare()) { t.insert_equal(first, last); }
+  multimap(const_iterator first, const_iterator last, const Compare& comp)
+    : t(comp) { t.insert_equal(first, last); }
+#endif /* __STL_MEMBER_TEMPLATES */
+
+  multimap(const multimap<Key, T, Compare, Alloc>& x) : t(x.t) { }
+  multimap<Key, T, Compare, Alloc>&
+  operator=(const multimap<Key, T, Compare, Alloc>& x) {
+    t = x.t;
+    return *this; 
+  }
+
+  // accessors:
+
+  key_compare key_comp() const { return t.key_comp(); }
+  value_compare value_comp() const { return value_compare(t.key_comp()); }
+  iterator begin() { return t.begin(); }
+  const_iterator begin() const { return t.begin(); }
+  iterator end() { return t.end(); }
+  const_iterator end() const { return t.end(); }
+  reverse_iterator rbegin() { return t.rbegin(); }
+  const_reverse_iterator rbegin() const { return t.rbegin(); }
+  reverse_iterator rend() { return t.rend(); }
+  const_reverse_iterator rend() const { return t.rend(); }
+  bool empty() const { return t.empty(); }
+  size_type size() const { return t.size(); }
+  size_type max_size() const { return t.max_size(); }
+  void swap(multimap<Key, T, Compare, Alloc>& x) { t.swap(x.t); }
+
+  // insert/erase
+
+  iterator insert(const value_type& x) { return t.insert_equal(x); }
+  iterator insert(iterator position, const value_type& x) {
+    return t.insert_equal(position, x);
+  }
+#ifdef __STL_MEMBER_TEMPLATES  
+  template <class InputIterator>
+  void insert(InputIterator first, InputIterator last) {
+    t.insert_equal(first, last);
+  }
+#else
+  void insert(const value_type* first, const value_type* last) {
+    t.insert_equal(first, last);
+  }
+  void insert(const_iterator first, const_iterator last) {
+    t.insert_equal(first, last);
+  }
+#endif /* __STL_MEMBER_TEMPLATES */
+  void erase(iterator position) { t.erase(position); }
+  size_type erase(const key_type& x) { return t.erase(x); }
+  void erase(iterator first, iterator last) { t.erase(first, last); }
+  void clear() { t.clear(); }
+
+  // multimap operations:
+
+  iterator find(const key_type& x) { return t.find(x); }
+  const_iterator find(const key_type& x) const { return t.find(x); }
+  size_type count(const key_type& x) const { return t.count(x); }
+  iterator lower_bound(const key_type& x) {return t.lower_bound(x); }
+  const_iterator lower_bound(const key_type& x) const {
+    return t.lower_bound(x); 
+  }
+  iterator upper_bound(const key_type& x) {return t.upper_bound(x); }
+  const_iterator upper_bound(const key_type& x) const {
+    return t.upper_bound(x); 
+  }
+   pair<iterator,iterator> equal_range(const key_type& x) {
+    return t.equal_range(x);
+  }
+  pair<const_iterator,const_iterator> equal_range(const key_type& x) const {
+    return t.equal_range(x);
+  }
+  friend bool operator== __STL_NULL_TMPL_ARGS (const multimap&,
+                                               const multimap&);
+  friend bool operator< __STL_NULL_TMPL_ARGS (const multimap&,
+                                              const multimap&);
+};
+
+template <class Key, class T, class Compare, class Alloc>
+inline bool operator==(const multimap<Key, T, Compare, Alloc>& x, 
+                       const multimap<Key, T, Compare, Alloc>& y) {
+  return x.t == y.t;
+}
+
+template <class Key, class T, class Compare, class Alloc>
+inline bool operator<(const multimap<Key, T, Compare, Alloc>& x, 
+                      const multimap<Key, T, Compare, Alloc>& y) {
+  return x.t < y.t;
+}
+
+#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class Key, class T, class Compare, class Alloc>
+inline void swap(multimap<Key, T, Compare, Alloc>& x, 
+                 multimap<Key, T, Compare, Alloc>& y) {
+  x.swap(y);
+}
+
+#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1174
+#endif
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_MULTIMAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_multiset.h b/libstdc++/stl/stl_multiset.h
new file mode 100644 (file)
index 0000000..ff5947e
--- /dev/null
@@ -0,0 +1,200 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_MULTISET_H
+#define __SGI_STL_INTERNAL_MULTISET_H
+
+__STL_BEGIN_NAMESPACE
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1174
+#endif
+
+#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
+template <class Key, class Compare = less<Key>, class Alloc = alloc>
+#else
+template <class Key, class Compare, class Alloc = alloc>
+#endif
+class multiset {
+public:
+  // typedefs:
+
+  typedef Key key_type;
+  typedef Key value_type;
+  typedef Compare key_compare;
+  typedef Compare value_compare;
+private:
+  typedef rb_tree<key_type, value_type, 
+                  identity<value_type>, key_compare, Alloc> rep_type;
+  rep_type t;  // red-black tree representing multiset
+public:
+  typedef typename rep_type::const_pointer pointer;
+  typedef typename rep_type::const_pointer const_pointer;
+  typedef typename rep_type::const_reference reference;
+  typedef typename rep_type::const_reference const_reference;
+  typedef typename rep_type::const_iterator iterator;
+  typedef typename rep_type::const_iterator const_iterator;
+  typedef typename rep_type::const_reverse_iterator reverse_iterator;
+  typedef typename rep_type::const_reverse_iterator const_reverse_iterator;
+  typedef typename rep_type::size_type size_type;
+  typedef typename rep_type::difference_type difference_type;
+
+  // allocation/deallocation
+
+  multiset() : t(Compare()) {}
+  explicit multiset(const Compare& comp) : t(comp) {}
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  multiset(InputIterator first, InputIterator last)
+    : t(Compare()) { t.insert_equal(first, last); }
+  template <class InputIterator>
+  multiset(InputIterator first, InputIterator last, const Compare& comp)
+    : t(comp) { t.insert_equal(first, last); }
+#else
+  multiset(const value_type* first, const value_type* last)
+    : t(Compare()) { t.insert_equal(first, last); }
+  multiset(const value_type* first, const value_type* last,
+           const Compare& comp)
+    : t(comp) { t.insert_equal(first, last); }
+
+  multiset(const_iterator first, const_iterator last)
+    : t(Compare()) { t.insert_equal(first, last); }
+  multiset(const_iterator first, const_iterator last, const Compare& comp)
+    : t(comp) { t.insert_equal(first, last); }
+#endif /* __STL_MEMBER_TEMPLATES */
+
+  multiset(const multiset<Key, Compare, Alloc>& x) : t(x.t) {}
+  multiset<Key, Compare, Alloc>&
+  operator=(const multiset<Key, Compare, Alloc>& x) {
+    t = x.t; 
+    return *this;
+  }
+
+  // accessors:
+
+  key_compare key_comp() const { return t.key_comp(); }
+  value_compare value_comp() const { return t.key_comp(); }
+  iterator begin() const { return t.begin(); }
+  iterator end() const { return t.end(); }
+  reverse_iterator rbegin() const { return t.rbegin(); } 
+  reverse_iterator rend() const { return t.rend(); }
+  bool empty() const { return t.empty(); }
+  size_type size() const { return t.size(); }
+  size_type max_size() const { return t.max_size(); }
+  void swap(multiset<Key, Compare, Alloc>& x) { t.swap(x.t); }
+
+  // insert/erase
+  iterator insert(const value_type& x) { 
+    return t.insert_equal(x);
+  }
+  iterator insert(iterator position, const value_type& x) {
+    typedef typename rep_type::iterator rep_iterator;
+    return t.insert_equal((rep_iterator&)position, x);
+  }
+
+#ifdef __STL_MEMBER_TEMPLATES  
+  template <class InputIterator>
+  void insert(InputIterator first, InputIterator last) {
+    t.insert_equal(first, last);
+  }
+#else
+  void insert(const value_type* first, const value_type* last) {
+    t.insert_equal(first, last);
+  }
+  void insert(const_iterator first, const_iterator last) {
+    t.insert_equal(first, last);
+  }
+#endif /* __STL_MEMBER_TEMPLATES */
+  void erase(iterator position) { 
+    typedef typename rep_type::iterator rep_iterator;
+    t.erase((rep_iterator&)position); 
+  }
+  size_type erase(const key_type& x) { 
+    return t.erase(x); 
+  }
+  void erase(iterator first, iterator last) { 
+    typedef typename rep_type::iterator rep_iterator;
+    t.erase((rep_iterator&)first, (rep_iterator&)last); 
+  }
+  void clear() { t.clear(); }
+
+  // multiset operations:
+
+  iterator find(const key_type& x) const { return t.find(x); }
+  size_type count(const key_type& x) const { return t.count(x); }
+  iterator lower_bound(const key_type& x) const {
+    return t.lower_bound(x);
+  }
+  iterator upper_bound(const key_type& x) const {
+    return t.upper_bound(x); 
+  }
+  pair<iterator,iterator> equal_range(const key_type& x) const {
+    return t.equal_range(x);
+  }
+  friend bool operator== __STL_NULL_TMPL_ARGS (const multiset&,
+                                               const multiset&);
+  friend bool operator< __STL_NULL_TMPL_ARGS (const multiset&,
+                                              const multiset&);
+};
+
+template <class Key, class Compare, class Alloc>
+inline bool operator==(const multiset<Key, Compare, Alloc>& x, 
+                       const multiset<Key, Compare, Alloc>& y) {
+  return x.t == y.t;
+}
+
+template <class Key, class Compare, class Alloc>
+inline bool operator<(const multiset<Key, Compare, Alloc>& x, 
+                      const multiset<Key, Compare, Alloc>& y) {
+  return x.t < y.t;
+}
+
+#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class Key, class Compare, class Alloc>
+inline void swap(multiset<Key, Compare, Alloc>& x, 
+                 multiset<Key, Compare, Alloc>& y) {
+  x.swap(y);
+}
+
+#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1174
+#endif
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_MULTISET_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_numeric.h b/libstdc++/stl/stl_numeric.h
new file mode 100644 (file)
index 0000000..57fee2b
--- /dev/null
@@ -0,0 +1,196 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+
+#ifndef __SGI_STL_INTERNAL_NUMERIC_H
+#define __SGI_STL_INTERNAL_NUMERIC_H
+
+__STL_BEGIN_NAMESPACE
+
+template <class InputIterator, class T>
+T accumulate(InputIterator first, InputIterator last, T init) {
+  for ( ; first != last; ++first)
+    init = init + *first;
+  return init;
+}
+
+template <class InputIterator, class T, class BinaryOperation>
+T accumulate(InputIterator first, InputIterator last, T init,
+             BinaryOperation binary_op) {
+  for ( ; first != last; ++first)
+    init = binary_op(init, *first);
+  return init;
+}
+
+template <class InputIterator1, class InputIterator2, class T>
+T inner_product(InputIterator1 first1, InputIterator1 last1,
+                InputIterator2 first2, T init) {
+  for ( ; first1 != last1; ++first1, ++first2)
+    init = init + (*first1 * *first2);
+  return init;
+}
+
+template <class InputIterator1, class InputIterator2, class T,
+          class BinaryOperation1, class BinaryOperation2>
+T inner_product(InputIterator1 first1, InputIterator1 last1,
+                InputIterator2 first2, T init, BinaryOperation1 binary_op1,
+                BinaryOperation2 binary_op2) {
+  for ( ; first1 != last1; ++first1, ++first2)
+    init = binary_op1(init, binary_op2(*first1, *first2));
+  return init;
+}
+
+template <class InputIterator, class OutputIterator, class T>
+OutputIterator __partial_sum(InputIterator first, InputIterator last,
+                             OutputIterator result, T*) {
+  T value = *first;
+  while (++first != last) {
+    value = value + *first;
+    *++result = value;
+  }
+  return ++result;
+}
+
+template <class InputIterator, class OutputIterator>
+OutputIterator partial_sum(InputIterator first, InputIterator last,
+                           OutputIterator result) {
+  if (first == last) return result;
+  *result = *first;
+  return __partial_sum(first, last, result, value_type(first));
+}
+
+template <class InputIterator, class OutputIterator, class T,
+          class BinaryOperation>
+OutputIterator __partial_sum(InputIterator first, InputIterator last,
+                             OutputIterator result, T*,
+                             BinaryOperation binary_op) {
+  T value = *first;
+  while (++first != last) {
+    value = binary_op(value, *first);
+    *++result = value;
+  }
+  return ++result;
+}
+
+template <class InputIterator, class OutputIterator, class BinaryOperation>
+OutputIterator partial_sum(InputIterator first, InputIterator last,
+                           OutputIterator result, BinaryOperation binary_op) {
+  if (first == last) return result;
+  *result = *first;
+  return __partial_sum(first, last, result, value_type(first), binary_op);
+}
+
+template <class InputIterator, class OutputIterator, class T>
+OutputIterator __adjacent_difference(InputIterator first, InputIterator last, 
+                                     OutputIterator result, T*) {
+  T value = *first;
+  while (++first != last) {
+    T tmp = *first;
+    *++result = tmp - value;
+    value = tmp;
+  }
+  return ++result;
+}
+
+template <class InputIterator, class OutputIterator>
+OutputIterator adjacent_difference(InputIterator first, InputIterator last, 
+                                   OutputIterator result) {
+  if (first == last) return result;
+  *result = *first;
+  return __adjacent_difference(first, last, result, value_type(first));
+}
+
+template <class InputIterator, class OutputIterator, class T, 
+          class BinaryOperation>
+OutputIterator __adjacent_difference(InputIterator first, InputIterator last, 
+                                     OutputIterator result, T*,
+                                     BinaryOperation binary_op) {
+  T value = *first;
+  while (++first != last) {
+    T tmp = *first;
+    *++result = binary_op(tmp, value);
+    value = tmp;
+  }
+  return ++result;
+}
+
+template <class InputIterator, class OutputIterator, class BinaryOperation>
+OutputIterator adjacent_difference(InputIterator first, InputIterator last,
+                                   OutputIterator result,
+                                   BinaryOperation binary_op) {
+  if (first == last) return result;
+  *result = *first;
+  return __adjacent_difference(first, last, result, value_type(first),
+                               binary_op);
+}
+
+// Returns x ** n, where n >= 0.  Note that "multiplication"
+//  is required to be associative, but not necessarily commutative.
+    
+template <class T, class Integer, class MonoidOperation>
+T power(T x, Integer n, MonoidOperation op) {
+  if (n == 0)
+    return identity_element(op);
+  else {
+    while ((n & 1) == 0) {
+      n >>= 1;
+      x = op(x, x);
+    }
+
+    T result = x;
+    n >>= 1;
+    while (n != 0) {
+      x = op(x, x);
+      if ((n & 1) != 0)
+        result = op(result, x);
+      n >>= 1;
+    }
+    return result;
+  }
+}
+
+template <class T, class Integer>
+inline T power(T x, Integer n) {
+  return power(x, n, multiplies<T>());
+}
+
+
+template <class ForwardIterator, class T>
+void iota(ForwardIterator first, ForwardIterator last, T value) {
+  while (first != last) *first++ = value++;
+}
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_NUMERIC_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_pair.h b/libstdc++/stl/stl_pair.h
new file mode 100644 (file)
index 0000000..10a9cb0
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_PAIR_H
+#define __SGI_STL_INTERNAL_PAIR_H
+
+__STL_BEGIN_NAMESPACE
+
+template <class T1, class T2>
+struct pair {
+  typedef T1 first_type;
+  typedef T2 second_type;
+
+  T1 first;
+  T2 second;
+  pair() : first(T1()), second(T2()) {}
+  pair(const T1& a, const T2& b) : first(a), second(b) {}
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class U1, class U2>
+  pair(const pair<U1, U2>& p) : first(p.first), second(p.second) {}
+#endif
+};
+
+template <class T1, class T2>
+inline bool operator==(const pair<T1, T2>& x, const pair<T1, T2>& y) { 
+  return x.first == y.first && x.second == y.second; 
+}
+
+template <class T1, class T2>
+inline bool operator<(const pair<T1, T2>& x, const pair<T1, T2>& y) { 
+  return x.first < y.first || (!(y.first < x.first) && x.second < y.second); 
+}
+
+template <class T1, class T2>
+inline pair<T1, T2> make_pair(const T1& x, const T2& y) {
+  return pair<T1, T2>(x, y);
+}
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_PAIR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_queue.h b/libstdc++/stl/stl_queue.h
new file mode 100644 (file)
index 0000000..ff6eede
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_QUEUE_H
+#define __SGI_STL_INTERNAL_QUEUE_H
+
+__STL_BEGIN_NAMESPACE
+
+#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
+template <class T, class Sequence = deque<T> >
+#else
+template <class T, class Sequence>
+#endif
+class queue {
+  friend bool operator== __STL_NULL_TMPL_ARGS (const queue& x, const queue& y);
+  friend bool operator< __STL_NULL_TMPL_ARGS (const queue& x, const queue& y);
+public:
+  typedef typename Sequence::value_type value_type;
+  typedef typename Sequence::size_type size_type;
+  typedef typename Sequence::reference reference;
+  typedef typename Sequence::const_reference const_reference;
+protected:
+  Sequence c;
+public:
+  bool empty() const { return c.empty(); }
+  size_type size() const { return c.size(); }
+  reference front() { return c.front(); }
+  const_reference front() const { return c.front(); }
+  reference back() { return c.back(); }
+  const_reference back() const { return c.back(); }
+  void push(const value_type& x) { c.push_back(x); }
+  void pop() { c.pop_front(); }
+};
+
+template <class T, class Sequence>
+bool operator==(const queue<T, Sequence>& x, const queue<T, Sequence>& y) {
+  return x.c == y.c;
+}
+
+template <class T, class Sequence>
+bool operator<(const queue<T, Sequence>& x, const queue<T, Sequence>& y) {
+  return x.c < y.c;
+}
+
+#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
+template <class T, class Sequence = vector<T>, 
+          class Compare = less<typename Sequence::value_type> >
+#else
+template <class T, class Sequence, class Compare>
+#endif
+class  priority_queue {
+public:
+  typedef typename Sequence::value_type value_type;
+  typedef typename Sequence::size_type size_type;
+  typedef typename Sequence::reference reference;
+  typedef typename Sequence::const_reference const_reference;
+protected:
+  Sequence c;
+  Compare comp;
+public:
+  priority_queue() : c() {}
+  explicit priority_queue(const Compare& x) :  c(), comp(x) {}
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  priority_queue(InputIterator first, InputIterator last, const Compare& x)
+    : c(first, last), comp(x) { make_heap(c.begin(), c.end(), comp); }
+  template <class InputIterator>
+  priority_queue(InputIterator first, InputIterator last) 
+    : c(first, last) { make_heap(c.begin(), c.end(), comp); }
+#else /* __STL_MEMBER_TEMPLATES */
+  priority_queue(const value_type* first, const value_type* last, 
+                 const Compare& x) : c(first, last), comp(x) {
+    make_heap(c.begin(), c.end(), comp);
+  }
+  priority_queue(const value_type* first, const value_type* last) 
+    : c(first, last) { make_heap(c.begin(), c.end(), comp); }
+#endif /* __STL_MEMBER_TEMPLATES */
+
+  bool empty() const { return c.empty(); }
+  size_type size() const { return c.size(); }
+  const_reference top() const { return c.front(); }
+  void push(const value_type& x) {
+    __STL_TRY {
+      c.push_back(x); 
+      push_heap(c.begin(), c.end(), comp);
+    }
+    __STL_UNWIND(c.clear());
+  }
+  void pop() {
+    __STL_TRY {
+      pop_heap(c.begin(), c.end(), comp);
+      c.pop_back();
+    }
+    __STL_UNWIND(c.clear());
+  }
+};
+
+// no equality is provided
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_QUEUE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_raw_storage_iter.h b/libstdc++/stl/stl_raw_storage_iter.h
new file mode 100644 (file)
index 0000000..5d3d074
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_RAW_STORAGE_ITERATOR_H
+#define __SGI_STL_INTERNAL_RAW_STORAGE_ITERATOR_H
+
+__STL_BEGIN_NAMESPACE
+
+template <class ForwardIterator, class T>
+class raw_storage_iterator {
+protected:
+  ForwardIterator iter;
+public:
+  typedef output_iterator_tag iterator_category;
+  typedef void                value_type;
+  typedef void                difference_type;
+  typedef void                pointer;
+  typedef void                reference;
+
+  explicit raw_storage_iterator(ForwardIterator x) : iter(x) {}
+  raw_storage_iterator<ForwardIterator, T>& operator*() { return *this; }
+  raw_storage_iterator<ForwardIterator, T>& operator=(const T& element) {
+    construct(&*iter, element);
+    return *this;
+  }        
+  raw_storage_iterator<ForwardIterator, T>& operator++() {
+    ++iter;
+    return *this;
+  }
+  raw_storage_iterator<ForwardIterator, T> operator++(int) {
+    raw_storage_iterator<ForwardIterator, T> tmp = *this;
+    ++iter;
+    return tmp;
+  }
+};
+
+#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+template <class ForwardIterator, class T>
+inline output_iterator_tag
+iterator_category(const raw_storage_iterator<ForwardIterator, T>&)
+{
+  return output_iterator_tag();
+}
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+#endif /* __SGI_STL_INTERNAL_RAW_STORAGE_ITERATOR_H */
+
+__STL_END_NAMESPACE
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_relops.h b/libstdc++/stl/stl_relops.h
new file mode 100644 (file)
index 0000000..01a0c7c
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_RELOPS
+#define __SGI_STL_INTERNAL_RELOPS
+
+__STL_BEGIN_RELOPS_NAMESPACE
+
+template <class T>
+inline bool operator!=(const T& x, const T& y) {
+  return !(x == y);
+}
+
+template <class T>
+inline bool operator>(const T& x, const T& y) {
+  return y < x;
+}
+
+template <class T>
+inline bool operator<=(const T& x, const T& y) {
+  return !(y < x);
+}
+
+template <class T>
+inline bool operator>=(const T& x, const T& y) {
+  return !(x < y);
+}
+
+__STL_END_RELOPS_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_RELOPS */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_rope.h b/libstdc++/stl/stl_rope.h
new file mode 100644 (file)
index 0000000..620db6f
--- /dev/null
@@ -0,0 +1,2112 @@
+/*
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_ROPE_H
+# define __SGI_STL_INTERNAL_ROPE_H
+
+# ifdef __GC
+#   define __GC_CONST const
+# else
+#   define __GC_CONST   // constant except for deallocation
+# endif
+# ifdef __STL_SGI_THREADS
+#    include <mutex.h>
+# endif
+
+__STL_BEGIN_NAMESPACE
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1174
+#endif
+
+// The end-of-C-string character.
+// This is what the draft standard says it should be.
+template <class charT>
+inline charT __eos(charT*) { return charT(); }
+
+// Test for basic character types.
+// For basic character types leaves having a trailing eos.
+template <class charT>
+inline bool __is_basic_char_type(charT *) { return false; }
+template <class charT>
+inline bool __is_one_byte_char_type(charT *) { return false; }
+
+inline bool __is_basic_char_type(char *) { return true; }
+inline bool __is_one_byte_char_type(char *) { return true; }
+inline bool __is_basic_char_type(wchar_t *) { return true; }
+
+// Store an eos iff charT is a basic character type.
+// Do not reference __eos if it isn't.
+template <class charT>
+inline void __cond_store_eos(charT&) {}
+
+inline void __cond_store_eos(char& c) { c = 0; }
+inline void __cond_store_eos(wchar_t& c) { c = 0; }
+       
+
+// rope<charT,Alloc> is a sequence of charT.
+// Ropes appear to be mutable, but update operations
+// really copy enough of the data structure to leave the original
+// valid.  Thus ropes can be logically copied by just copying
+// a pointer value.
+// The __eos function is used for those functions that
+// convert to/from C-like strings to detect the end of the string.
+// __compare is used as the character comparison function.
+template <class charT>
+class char_producer {
+    public:
+       virtual ~char_producer() {};
+       virtual void operator()(size_t start_pos, size_t len, charT* buffer)
+               = 0;
+       // Buffer should really be an arbitrary output iterator.
+       // That way we could flatten directly into an ostream, etc.
+       // This is thoroughly impossible, since iterator types don't
+       // have runtime descriptions.
+};
+
+// Sequence buffers:
+//
+// Sequence must provide an append operation that appends an
+// array to the sequence.  Sequence buffers are useful only if
+// appending an entire array is cheaper than appending element by element.
+// This is true for many string representations.
+// This should  perhaps inherit from ostream<sequence::value_type>
+// and be implemented correspondingly, so that they can be used
+// for formatted.  For the sake of portability, we don't do this yet.
+//
+// For now, sequence buffers behave as output iterators.  But they also
+// behave a little like basic_ostringstream<sequence::value_type> and a
+// little like containers.
+
+template<class sequence, size_t buf_sz = 100
+#   if defined(__sgi) && !defined(__GNUC__)
+#       define __TYPEDEF_WORKAROUND
+         ,class v = typename sequence::value_type
+#   endif
+        >
+// The 3rd parameter works around a common compiler bug.
+class sequence_buffer : public output_iterator {
+    public:
+#       ifndef __TYPEDEF_WORKAROUND
+           typedef typename sequence::value_type value_type;
+#      else
+           typedef v value_type;
+#      endif
+    protected:
+       sequence *prefix;
+       value_type buffer[buf_sz];
+       size_t buf_count;
+    public:
+       void flush() {
+           prefix->append(buffer, buffer + buf_count);
+           buf_count = 0;
+       }
+       ~sequence_buffer() { flush(); }
+       sequence_buffer() : prefix(0), buf_count(0) {}
+       sequence_buffer(const sequence_buffer & x) {
+           prefix = x.prefix;
+            buf_count = x.buf_count;
+            copy(x.buffer, x.buffer + x.buf_count, buffer);
+       }
+       sequence_buffer(sequence_buffer & x) {
+           x.flush();
+           prefix = x.prefix;
+           buf_count = 0;
+       }
+       sequence_buffer(sequence& s) : prefix(&s), buf_count(0) {}
+       sequence_buffer& operator= (sequence_buffer& x) {
+           x.flush();
+           prefix = x.prefix;
+           buf_count = 0;
+           return *this;
+       }
+       sequence_buffer& operator= (const sequence_buffer& x) {
+           prefix = x.prefix;
+           buf_count = x.buf_count;
+           copy(x.buffer, x.buffer + x.buf_count, buffer);
+           return *this;
+       }
+       void push_back(value_type x)
+       {
+           if (buf_count < buf_sz) {
+               buffer[buf_count] = x;
+               ++buf_count;
+           } else {
+               flush();
+               buffer[0] = x;
+               buf_count = 1;
+           }
+       }
+       void append(value_type *s, size_t len)
+       {
+           if (len + buf_count <= buf_sz) {
+               size_t i, j;
+               for (i = buf_count, j = 0; j < len; i++, j++) {
+                   buffer[i] = s[j];
+               }
+               buf_count += len;
+           } else if (0 == buf_count) {
+               prefix->append(s, s + len);
+           } else {
+               flush();
+               append(s, len);
+           }
+       }
+       sequence_buffer& write(value_type *s, size_t len)
+       {
+           append(s, len);
+           return *this;
+       }
+       sequence_buffer& put(value_type x)
+       {
+           push_back(x);
+           return *this;
+       }
+       sequence_buffer& operator=(const value_type& rhs)
+       {
+           push_back(rhs);
+           return *this;
+       }
+       sequence_buffer& operator*() { return *this; }
+       sequence_buffer& operator++() { return *this; }
+       sequence_buffer& operator++(int) { return *this; }
+};
+
+// The following should be treated as private, at least for now.
+template<class charT>
+class __rope_char_consumer {
+    public:
+       // If we had member templates, these should not be virtual.
+       // For now we need to use run-time parametrization where
+       // compile-time would do.  Hence this should all be private
+       // for now.
+       // The symmetry with char_producer is accidental and temporary.
+       virtual ~__rope_char_consumer() {};
+       virtual bool operator()(const charT* buffer, size_t len) = 0;
+};
+
+//
+// What follows should really be local to rope.  Unfortunately,
+// that doesn't work, since it makes it impossible to define generic
+// equality on rope iterators.  According to the draft standard, the
+// template parameters for such an equality operator cannot be inferred
+// from the occurence of a member class as a parameter.
+// (SGI compilers in fact allow this, but the result wouldn't be
+// portable.)
+// Similarly, some of the static member functions are member functions
+// only to avoid polluting the global namespace, and to circumvent
+// restrictions on type inference for template functions.
+//
+
+template<class CharT, class Alloc=__ALLOC> class rope;
+template<class CharT, class Alloc> struct __rope_RopeConcatenation;
+template<class CharT, class Alloc> struct __rope_RopeLeaf;
+template<class CharT, class Alloc> struct __rope_RopeFunction;
+template<class CharT, class Alloc> struct __rope_RopeSubstring;
+template<class CharT, class Alloc> class __rope_iterator;
+template<class CharT, class Alloc> class __rope_const_iterator;
+template<class CharT, class Alloc> class __rope_charT_ref_proxy;
+template<class CharT, class Alloc> class __rope_charT_ptr_proxy;
+
+//
+// The internal data structure for representing a rope.  This is
+// private to the implementation.  A rope is really just a pointer
+// to one of these.
+//
+// A few basic functions for manipulating this data structure
+// are members of RopeBase.  Most of the more complex algorithms
+// are implemented as rope members.
+//
+// Some of the static member functions of RopeBase have identically
+// named functions in rope that simply invoke the RopeBase versions.
+//
+
+template<class charT, class Alloc>
+struct __rope_RopeBase {
+    typedef rope<charT,Alloc> my_rope;
+    typedef simple_alloc<charT, Alloc> DataAlloc;
+    typedef simple_alloc<__rope_RopeConcatenation<charT,Alloc>, Alloc> CAlloc;
+    typedef simple_alloc<__rope_RopeLeaf<charT,Alloc>, Alloc> LAlloc;
+    typedef simple_alloc<__rope_RopeFunction<charT,Alloc>, Alloc> FAlloc;
+    typedef simple_alloc<__rope_RopeSubstring<charT,Alloc>, Alloc> SAlloc;
+    public:
+    enum { max_rope_depth = 45 };
+    enum {leaf, concat, substringfn, function} tag:8;
+    bool is_balanced:8;
+    unsigned char depth;
+    size_t size;
+    __GC_CONST charT * c_string;
+                       /* Flattened version of string, if needed.  */
+                       /* typically 0.                             */
+                       /* If it's not 0, then the memory is owned  */
+                       /* by this node.                            */
+                       /* In the case of a leaf, this may point to */
+                       /* the same memory as the data field.       */
+#   ifndef __GC
+#       if defined(__STL_WIN32THREADS)
+           long refcount;      // InterlockedIncrement wants a long *
+#      else
+           size_t refcount;
+#      endif
+       // We count references from rope instances
+       // and references from other rope nodes.  We
+       // do not count const_iterator references.
+       // Iterator references are counted so that rope modifications
+       // can be detected after the fact.
+       // Generally function results are counted, i.e.
+       // a pointer returned by a function is included at the
+       // point at which the pointer is returned.
+       // The recipient should decrement the count if the
+       // result is not needed.
+       // Generally function arguments are not reflected
+       // in the reference count.  The callee should increment
+       // the count before saving the argument someplace that
+       // will outlive the call.
+#   endif
+#   ifndef __GC
+#       ifdef __STL_SGI_THREADS
+           // Reference counting with multiple threads and no
+           // hardware or thread package support is pretty awful.
+           // Mutexes are normally too expensive.
+           // We'll assume a COMPARE_AND_SWAP(destp, old, new)
+           // operation, which might be cheaper.
+#           if __mips < 3 || !(defined (_ABIN32) || defined(_ABI64))
+#               define __add_and_fetch(l,v) add_then_test((unsigned long *)l,v)
+#           endif
+           void init_refcount_lock() {}
+           void incr_refcount ()
+           {
+               __add_and_fetch(&refcount, 1);
+           }
+           size_t decr_refcount ()
+           {
+               return __add_and_fetch(&refcount, (size_t)(-1));
+           }
+#       elif defined(__STL_WIN32THREADS)
+           void init_refcount_lock() {}
+            void incr_refcount ()
+            {
+                InterlockedIncrement(&refcount);
+            }
+            size_t decr_refcount ()
+            {
+                return InterlockedDecrement(&refcount);
+            }
+#      elif defined(_PTHREADS)
+           // This should be portable, but performance is expected
+           // to be quite awful.  This really needs platform specific
+           // code.
+           pthread_mutex_t refcount_lock;
+           void init_refcount_lock() {
+               pthread_mutex_init(&refcount_lock, 0);
+           }
+           void incr_refcount ()
+            {   
+               pthread_mutex_lock(&refcount_lock);
+                ++refcount;
+               pthread_mutex_unlock(&refcount_lock);
+            }
+            size_t decr_refcount ()
+            {   
+               size_t result;
+               pthread_mutex_lock(&refcount_lock);
+                result = --refcount;
+               pthread_mutex_unlock(&refcount_lock);
+                return result;
+            }
+#      else
+           void init_refcount_lock() {}
+           void incr_refcount ()
+           {
+               ++refcount;
+           }
+           size_t decr_refcount ()
+           {
+               --refcount;
+               return refcount;
+           }
+#       endif
+#   else
+       void incr_refcount () {}
+#   endif
+       static void free_string(charT *, size_t len);
+                       // Deallocate data section of a leaf.
+                       // This shouldn't be a member function.
+                       // But its hard to do anything else at the
+                       // moment, because it's templatized w.r.t.
+                       // an allocator.
+                       // Does nothing if __GC is defined.
+#   ifndef __GC
+         void free_c_string();
+         void free_tree();
+                       // Deallocate t. Assumes t is not 0.
+         void unref_nonnil()
+         {
+             if (0 == decr_refcount()) free_tree();
+         }
+         void ref_nonnil()
+         {
+             incr_refcount();
+         }
+         static void unref(__rope_RopeBase* t)
+         {
+             if (0 != t) {
+                 t -> unref_nonnil();
+             }
+         }
+         static void ref(__rope_RopeBase* t)
+         {
+             if (0 != t) t -> incr_refcount();
+         }
+         static void free_if_unref(__rope_RopeBase* t)
+         {
+             if (0 != t && 0 == t -> refcount) t -> free_tree();
+         }
+#   else /* __GC */
+         void unref_nonnil() {}
+         void ref_nonnil() {}
+         static void unref(__rope_RopeBase* t) {}
+         static void ref(__rope_RopeBase* t) {}
+         static void fn_finalization_proc(void * tree, void *);
+         static void free_if_unref(__rope_RopeBase* t) {}
+#   endif
+
+    // The data fields of leaves are allocated with some
+    // extra space, to accomodate future growth and for basic
+    // character types, to hold a trailing eos character.
+    enum { alloc_granularity = 8 };
+    static size_t rounded_up_size(size_t n) {
+        size_t size_with_eos;
+            
+        if (__is_basic_char_type((charT *)0)) {
+           size_with_eos = n + 1;
+       } else {
+           size_with_eos = n;
+       }
+#       ifdef __GC
+          return size_with_eos;
+#      else
+          // Allow slop for in-place expansion.
+          return (size_with_eos + alloc_granularity-1)
+                       &~ (alloc_granularity-1);
+#      endif
+    }
+};
+
+template<class charT, class Alloc>
+struct __rope_RopeLeaf : public __rope_RopeBase<charT,Alloc> {
+  public:  // Apparently needed by VC++
+    __GC_CONST charT* data;     /* Not necessarily 0 terminated. */
+                               /* The allocated size is         */
+                               /* rounded_up_size(size), except */
+                               /* in the GC case, in which it   */
+                               /* doesn't matter.               */
+};
+
+template<class charT, class Alloc>
+struct __rope_RopeConcatenation : public __rope_RopeBase<charT,Alloc> {
+  public:
+    __rope_RopeBase<charT,Alloc>* left;
+    __rope_RopeBase<charT,Alloc>* right;
+};
+
+template<class charT, class Alloc>
+struct __rope_RopeFunction : public __rope_RopeBase<charT,Alloc> {
+  public:
+    char_producer<charT>* fn;
+#   ifndef __GC
+      bool delete_when_done;   // Char_producer is owned by the
+                               // rope and should be explicitly
+                               // deleted when the rope becomes
+                               // inaccessible.
+#   else
+      // In the GC case, we either register the rope for
+      // finalization, or not.  Thus the field is unnecessary;
+      // the information is stored in the collector data structures.
+#   endif
+};
+// Substring results are usually represented using just
+// concatenation nodes.  But in the case of very long flat ropes
+// or ropes with a functional representation that isn't practical.
+// In that case, we represent the result as a special case of
+// RopeFunction, whose char_producer points back to the rope itself.
+// In all cases except repeated substring operations and
+// deallocation, we treat the result as a RopeFunction.
+template<class charT, class Alloc>
+struct __rope_RopeSubstring: public __rope_RopeFunction<charT,Alloc>,
+                            public char_producer<charT> {
+  public:
+    __rope_RopeBase<charT,Alloc> * base;       // not 0
+    size_t start;
+    virtual ~__rope_RopeSubstring() {}
+    virtual void operator()(size_t start_pos, size_t req_len,
+                           charT *buffer) {
+       switch(base -> tag) {
+           case function:
+           case substringfn:
+             {
+               char_producer<charT> *fn =
+                       ((__rope_RopeFunction<charT,Alloc> *)base) -> fn;
+               __stl_assert(start_pos + req_len <= size);
+               __stl_assert(start + size <= base -> size);
+               (*fn)(start_pos + start, req_len, buffer);
+             }
+             break;
+           case leaf:
+             {
+               __GC_CONST charT * s =
+                       ((__rope_RopeLeaf<charT,Alloc> *)base) -> data;
+               uninitialized_copy_n(s + start_pos + start, req_len,
+                                    buffer);
+             }
+             break;
+           default:
+             __stl_assert(false);
+       }
+    }
+    __rope_RopeSubstring(__rope_RopeBase<charT,Alloc> * b, size_t s, size_t l) :
+       base(b), start(s) {
+#       ifndef __GC
+           refcount = 1;
+           init_refcount_lock();
+           base -> ref_nonnil();
+#       endif
+       size = l;
+       tag = substringfn;
+       depth = 0;
+       c_string = 0;
+       fn = this;
+    }
+};
+
+
+// Self-destructing pointers to RopeBase.
+// These are not conventional smart pointers.  Their
+// only purpose in life is to ensure that unref is called
+// on the pointer either at normal exit or if an exception
+// is raised.  It is the caller's responsibility to
+// adjust reference counts when these pointers are initialized
+// or assigned to.  (This convention significantly reduces
+// the number of potentially expensive reference count
+// updates.)
+#ifndef __GC
+  template<class charT, class Alloc>
+  struct __rope_self_destruct_ptr {
+    __rope_RopeBase<charT,Alloc> * ptr;
+    ~__rope_self_destruct_ptr() { __rope_RopeBase<charT,Alloc>::unref(ptr); }
+#   ifdef __STL_USE_EXCEPTIONS
+       __rope_self_destruct_ptr() : ptr(0) {};
+#   else
+       __rope_self_destruct_ptr() {};
+#   endif
+    __rope_self_destruct_ptr(__rope_RopeBase<charT,Alloc> * p) : ptr(p) {}
+    __rope_RopeBase<charT,Alloc> & operator*() { return *ptr; }
+    __rope_RopeBase<charT,Alloc> * operator->() { return ptr; }
+    operator __rope_RopeBase<charT,Alloc> *() { return ptr; }
+    __rope_self_destruct_ptr & operator= (__rope_RopeBase<charT,Alloc> * x)
+       { ptr = x; return *this; }
+  };
+#endif
+
+// Dereferencing a nonconst iterator has to return something
+// that behaves almost like a reference.  It's not possible to
+// return an actual reference since assignment requires extra
+// work.  And we would get into the same problems as with the
+// CD2 version of basic_string.
+template<class charT, class Alloc>
+class __rope_charT_ref_proxy {
+    friend class rope<charT,Alloc>;
+    friend class __rope_iterator<charT,Alloc>;
+    friend class __rope_charT_ptr_proxy<charT,Alloc>;
+#   ifdef __GC
+       typedef __rope_RopeBase<charT,Alloc> * self_destruct_ptr;
+#   else
+       typedef __rope_self_destruct_ptr<charT,Alloc> self_destruct_ptr;
+#   endif
+    typedef __rope_RopeBase<charT,Alloc> RopeBase;
+    typedef rope<charT,Alloc> my_rope;
+    size_t pos;
+    charT current;
+    bool current_valid;
+    my_rope * root;     // The whole rope.
+  public:
+    __rope_charT_ref_proxy(my_rope * r, size_t p) :
+       pos(p), root(r), current_valid(false) {}
+    __rope_charT_ref_proxy(my_rope * r, size_t p,
+                   charT c) :
+       pos(p), root(r), current(c), current_valid(true) {}
+    operator charT () const;
+    __rope_charT_ref_proxy& operator= (charT c);
+    __rope_charT_ptr_proxy<charT,Alloc> operator& () const;
+    __rope_charT_ref_proxy& operator= (const __rope_charT_ref_proxy& c) {
+       return operator=((charT)c); 
+    }
+};
+
+template<class charT, class Alloc>
+class __rope_charT_ptr_proxy {
+    friend class __rope_charT_ref_proxy<charT,Alloc>;
+    size_t pos;
+    charT current;
+    bool current_valid;
+    rope<charT,Alloc> * root;     // The whole rope.
+  public:
+    __rope_charT_ptr_proxy(const __rope_charT_ref_proxy<charT,Alloc> & x) :
+       pos(x.pos), root(x.root), current_valid(x.current_valid),
+       current(x.current) {}
+    __rope_charT_ptr_proxy(const __rope_charT_ptr_proxy & x) :
+       pos(x.pos), root(x.root), current_valid(x.current_valid),
+       current(x.current) {}
+    __rope_charT_ptr_proxy() {}
+    __rope_charT_ptr_proxy(charT * x) : root(0), pos(0) {
+       __stl_assert(0 == x);
+    }
+    __rope_charT_ptr_proxy& operator= (const __rope_charT_ptr_proxy& x) {
+       pos = x.pos;
+       current = x.current;
+       current_valid = x.current_valid;
+       root = x.root;
+       return *this;
+    }
+    friend bool operator== __STL_NULL_TMPL_ARGS
+                (const __rope_charT_ptr_proxy<charT,Alloc> & x,
+                 const __rope_charT_ptr_proxy<charT,Alloc> & y);
+    __rope_charT_ref_proxy<charT,Alloc> operator *() const {
+       if (current_valid) {
+           return __rope_charT_ref_proxy<charT,Alloc>(root, pos, current);
+       } else {
+           return __rope_charT_ref_proxy<charT,Alloc>(root, pos);
+       }
+    }
+};
+
+// Rope iterators:
+// Unlike in the C version, we cache only part of the stack
+// for rope iterators, since they must be efficiently copyable.
+// When we run out of cache, we have to reconstruct the iterator
+// value.
+// Pointers from iterators are not included in reference counts.
+// Iterators are assumed to be thread private.  Ropes can
+// be shared.
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1375
+#endif
+
+template<class charT, class Alloc>
+class __rope_iterator_base:
+  public random_access_iterator<charT, ptrdiff_t> {
+  friend class rope<charT, Alloc>;
+  public:
+    typedef __rope_RopeBase<charT,Alloc> RopeBase;
+       // Borland doesnt want this to be protected.
+  protected:
+    enum { path_cache_len = 4 }; // Must be <= 9.
+    enum { iterator_buf_len = 15 };
+    size_t current_pos;
+    RopeBase * root;     // The whole rope.
+    size_t leaf_pos;    // Starting position for current leaf
+    __GC_CONST charT * buf_start;
+                       // Buffer possibly
+                       // containing current char.
+    __GC_CONST charT * buf_ptr;
+                       // Pointer to current char in buffer.
+                       // != 0 ==> buffer valid.
+    __GC_CONST charT * buf_end;
+                       // One past last valid char in buffer.
+    // What follows is the path cache.  We go out of our
+    // way to make this compact.
+    // Path_end contains the bottom section of the path from
+    // the root to the current leaf.
+    const RopeBase * path_end[path_cache_len];
+    int leaf_index;     // Last valid pos in path_end;
+                       // path_end[0] ... path_end[leaf_index-1]
+                       // point to concatenation nodes.
+    unsigned char path_directions;
+                         // (path_directions >> i) & 1 is 1
+                         // iff we got from path_end[leaf_index - i - 1]
+                         // to path_end[leaf_index - i] by going to the
+                         // right. Assumes path_cache_len <= 9.
+    charT tmp_buf[iterator_buf_len];
+                       // Short buffer for surrounding chars.
+                       // This is useful primarily for 
+                       // RopeFunctions.  We put the buffer
+                       // here to avoid locking in the
+                       // multithreaded case.
+    // The cached path is generally assumed to be valid
+    // only if the buffer is valid.
+    static void setbuf(__rope_iterator_base &x);
+                                       // Set buffer contents given
+                                       // path cache.
+    static void setcache(__rope_iterator_base &x);
+                                       // Set buffer contents and
+                                       // path cache.
+    static void setcache_for_incr(__rope_iterator_base &x);
+                                       // As above, but assumes path
+                                       // cache is valid for previous posn.
+    __rope_iterator_base() {}
+    __rope_iterator_base(RopeBase * root, size_t pos):
+                  root(root), current_pos(pos), buf_ptr(0) {}
+    __rope_iterator_base(const __rope_iterator_base& x) {
+       if (0 != x.buf_ptr) {
+           *this = x;
+       } else {
+           current_pos = x.current_pos;
+           root = x.root;
+           buf_ptr = 0;
+       }
+    }
+    void incr(size_t n);
+    void decr(size_t n);
+  public:
+    size_t index() const { return current_pos; }
+};
+
+template<class charT, class Alloc> class __rope_iterator;
+
+template<class charT, class Alloc>
+class __rope_const_iterator : public __rope_iterator_base<charT,Alloc> {
+    friend class rope<charT,Alloc>;
+  protected:
+    __rope_const_iterator(const RopeBase * root, size_t pos):
+                  __rope_iterator_base<charT,Alloc>(
+                    const_cast<RopeBase *>(root), pos)
+                  // Only nonconst iterators modify root ref count
+    {}
+  public:
+    typedef charT reference;    // Really a value.  Returning a reference
+                               // Would be a mess, since it would have
+                               // to be included in refcount.
+    typedef const charT* pointer;
+
+  public:
+    __rope_const_iterator() {};
+    __rope_const_iterator(const __rope_const_iterator & x) :
+                               __rope_iterator_base<charT,Alloc>(x) { }
+    __rope_const_iterator(const __rope_iterator<charT,Alloc> & x);
+    __rope_const_iterator(const rope<charT,Alloc> &r, size_t pos) :
+       __rope_iterator_base<charT,Alloc>(r.tree_ptr, pos) {}
+    __rope_const_iterator& operator= (const __rope_const_iterator & x) {
+       if (0 != x.buf_ptr) {
+           *this = x;
+       } else {
+           current_pos = x.current_pos;
+           root = x.root;
+           buf_ptr = 0;
+       }
+       return(*this);
+    }
+    reference operator*() {
+       if (0 == buf_ptr) setcache(*this);
+       return *buf_ptr;
+    }
+    __rope_const_iterator& operator++() {
+       __GC_CONST charT * next;
+       if (0 != buf_ptr && (next = buf_ptr + 1) < buf_end) {
+           buf_ptr = next;
+           ++current_pos;
+       } else {
+           incr(1);
+       }
+       return *this;
+    }
+    __rope_const_iterator& operator+=(ptrdiff_t n) {
+       if (n >= 0) {
+           incr(n);
+       } else {
+           decr(-n);
+       }
+       return *this;
+    }
+    __rope_const_iterator& operator--() {
+       decr(1);
+       return *this;
+    }
+    __rope_const_iterator& operator-=(ptrdiff_t n) {
+       if (n >= 0) {
+           decr(n);
+       } else {
+           incr(-n);
+       }
+       return *this;
+    }
+    __rope_const_iterator operator++(int) {
+       size_t old_pos = current_pos;
+       incr(1);
+       return __rope_const_iterator<charT,Alloc>(root, old_pos);
+       // This makes a subsequent dereference expensive.
+       // Perhaps we should instead copy the iterator
+       // if it has a valid cache?
+    }
+    __rope_const_iterator operator--(int) {
+       size_t old_pos = current_pos;
+       decr(1);
+       return __rope_const_iterator<charT,Alloc>(root, old_pos);
+    }
+    friend __rope_const_iterator<charT,Alloc> operator- __STL_NULL_TMPL_ARGS
+       (const __rope_const_iterator<charT,Alloc> & x,
+        ptrdiff_t n);
+    friend __rope_const_iterator<charT,Alloc> operator+ __STL_NULL_TMPL_ARGS
+       (const __rope_const_iterator<charT,Alloc> & x,
+        ptrdiff_t n);
+    friend __rope_const_iterator<charT,Alloc> operator+ __STL_NULL_TMPL_ARGS
+       (ptrdiff_t n,
+        const __rope_const_iterator<charT,Alloc> & x);
+    reference operator[](size_t n) {
+       return rope<charT,Alloc>::fetch(root, current_pos + n);
+    }
+    friend bool operator== __STL_NULL_TMPL_ARGS
+       (const __rope_const_iterator<charT,Alloc> & x,
+        const __rope_const_iterator<charT,Alloc> & y);
+    friend bool operator< __STL_NULL_TMPL_ARGS
+       (const __rope_const_iterator<charT,Alloc> & x,
+        const __rope_const_iterator<charT,Alloc> & y);
+    friend ptrdiff_t operator- __STL_NULL_TMPL_ARGS
+       (const __rope_const_iterator<charT,Alloc> & x,
+        const __rope_const_iterator<charT,Alloc> & y);
+};
+
+template<class charT, class Alloc>
+class __rope_iterator : public __rope_iterator_base<charT,Alloc> {
+    friend class rope<charT,Alloc>;
+  protected:
+    rope<charT,Alloc> * root_rope;
+       // root is treated as a cached version of this,
+       // and is used to detect changes to the underlying
+       // rope.
+       // Root is included in the reference count.
+       // This is necessary so that we can detect changes reliably.
+       // Unfortunately, it requires careful bookkeeping for the
+       // nonGC case.
+    __rope_iterator(rope<charT,Alloc> * r, size_t pos):
+            __rope_iterator_base<charT,Alloc>(r -> tree_ptr, pos),
+            root_rope(r) {
+               RopeBase::ref(root);
+            }
+    void check();
+  public:
+    typedef __rope_charT_ref_proxy<charT,Alloc>  reference;
+    typedef __rope_charT_ref_proxy<charT,Alloc>* pointer;
+
+  public:
+    rope<charT,Alloc>& container() { return *root_rope; }
+    __rope_iterator() {
+       root = 0;  // Needed for reference counting.
+    };
+    __rope_iterator(const __rope_iterator & x) :
+       __rope_iterator_base<charT,Alloc>(x) {
+       root_rope = x.root_rope;
+       RopeBase::ref(root);
+    }
+    __rope_iterator(rope<charT,Alloc>& r, size_t pos);
+    ~__rope_iterator() {
+       RopeBase::unref(root);
+    }
+    __rope_iterator& operator= (const __rope_iterator & x) {
+       RopeBase *old = root;
+
+       RopeBase::ref(x.root);
+       if (0 != x.buf_ptr) {
+           *this = x;
+       } else {
+           current_pos = x.current_pos;
+           root = x.root;
+           root_rope = x.root_rope;
+           buf_ptr = 0;
+       }
+       RopeBase::unref(old);
+       return(*this);
+    }
+    reference operator*() {
+       check();
+       if (0 == buf_ptr) {
+           return __rope_charT_ref_proxy<charT,Alloc>(root_rope, current_pos);
+       } else {
+           return __rope_charT_ref_proxy<charT,Alloc>(root_rope,
+                                                      current_pos, *buf_ptr);
+       }
+    }
+    __rope_iterator& operator++() {
+       incr(1);
+       return *this;
+    }
+    __rope_iterator& operator+=(difference_type n) {
+       if (n >= 0) {
+           incr(n);
+       } else {
+           decr(-n);
+       }
+       return *this;
+    }
+    __rope_iterator& operator--() {
+       decr(1);
+       return *this;
+    }
+    __rope_iterator& operator-=(difference_type n) {
+       if (n >= 0) {
+           decr(n);
+       } else {
+           incr(-n);
+       }
+       return *this;
+    }
+    __rope_iterator operator++(int) {
+       size_t old_pos = current_pos;
+       incr(1);
+       return __rope_iterator<charT,Alloc>(root_rope, old_pos);
+    }
+    __rope_iterator operator--(int) {
+       size_t old_pos = current_pos;
+       decr(1);
+       return __rope_iterator<charT,Alloc>(root_rope, old_pos);
+    }
+    reference operator[](ptrdiff_t n) {
+       return __rope_charT_ref_proxy<charT,Alloc>(root_rope, current_pos + n);
+    }
+    friend bool operator== __STL_NULL_TMPL_ARGS
+       (const __rope_iterator<charT,Alloc> & x,
+        const __rope_iterator<charT,Alloc> & y);
+    friend bool operator< __STL_NULL_TMPL_ARGS
+       (const __rope_iterator<charT,Alloc> & x,
+        const __rope_iterator<charT,Alloc> & y);
+    friend ptrdiff_t operator- __STL_NULL_TMPL_ARGS
+       (const __rope_iterator<charT,Alloc> & x,
+        const __rope_iterator<charT,Alloc> & y);
+    friend __rope_iterator<charT,Alloc> operator- __STL_NULL_TMPL_ARGS
+       (const __rope_iterator<charT,Alloc> & x,
+        ptrdiff_t n);
+    friend __rope_iterator<charT,Alloc> operator+ __STL_NULL_TMPL_ARGS
+       (const __rope_iterator<charT,Alloc> & x,
+        ptrdiff_t n);
+    friend __rope_iterator<charT,Alloc> operator+ __STL_NULL_TMPL_ARGS
+       (ptrdiff_t n,
+        const __rope_iterator<charT,Alloc> & x);
+
+};
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1375
+#endif
+
+template <class charT, class Alloc>
+class rope {
+    public:
+       typedef charT value_type;
+       typedef ptrdiff_t difference_type;
+       typedef size_t size_type;
+       typedef charT const_reference;
+       typedef const charT* const_pointer;
+       typedef __rope_iterator<charT,Alloc> iterator;
+       typedef __rope_const_iterator<charT,Alloc> const_iterator;
+       typedef __rope_charT_ref_proxy<charT,Alloc> reference;
+       typedef __rope_charT_ptr_proxy<charT,Alloc> pointer;
+
+       friend class __rope_iterator<charT,Alloc>;
+       friend class __rope_const_iterator<charT,Alloc>;
+       friend struct __rope_RopeBase<charT,Alloc>;
+       friend class __rope_iterator_base<charT,Alloc>;
+       friend class __rope_charT_ptr_proxy<charT,Alloc>;
+       friend class __rope_charT_ref_proxy<charT,Alloc>;
+       friend struct __rope_RopeSubstring<charT,Alloc>;
+
+    protected:
+       typedef __GC_CONST charT * cstrptr;
+#       ifdef __STL_SGI_THREADS
+           static cstrptr atomic_swap(cstrptr *p, cstrptr q) {
+#               if __mips < 3 || !(defined (_ABIN32) || defined(_ABI64))
+                    return (cstrptr) test_and_set((unsigned long *)p,
+                                                 (unsigned long)q);
+#              else
+                    return (cstrptr) __test_and_set((unsigned long *)p,
+                                                   (unsigned long)q);
+#              endif
+            }
+#       elif defined(__STL_WIN32THREADS)
+           static cstrptr atomic_swap(cstrptr *p, cstrptr q) {
+               return (cstrptr) InterlockedExchange((LPLONG)p, (LONG)q);
+           }
+#      elif defined(_PTHREADS)
+           // This should be portable, but performance is expected
+           // to be quite awful.  This really needs platform specific
+           // code.
+           static pthread_mutex_t swap_lock;
+           static cstrptr atomic_swap(cstrptr *p, cstrptr q) {
+               pthread_mutex_lock(&swap_lock);
+               cstrptr result = *p;
+               *p = q;
+               pthread_mutex_unlock(&swap_lock);
+               return result;
+            }
+#      else
+           static cstrptr atomic_swap(cstrptr *p, cstrptr q) {
+                cstrptr result = *p;
+                *p = q;
+               return result;
+           }
+#       endif
+
+       static charT empty_c_str[1];
+
+       typedef simple_alloc<charT, Alloc> DataAlloc;
+       typedef simple_alloc<__rope_RopeConcatenation<charT,Alloc>, Alloc> CAlloc;
+       typedef simple_alloc<__rope_RopeLeaf<charT,Alloc>, Alloc> LAlloc;
+       typedef simple_alloc<__rope_RopeFunction<charT,Alloc>, Alloc> FAlloc;
+       typedef simple_alloc<__rope_RopeSubstring<charT,Alloc>, Alloc> SAlloc;
+       static bool is0(charT c) { return c == __eos((charT *)0); }
+       enum { copy_max = 23 };
+               // For strings shorter than copy_max, we copy to
+               // concatenate.
+
+       typedef __rope_RopeBase<charT,Alloc> RopeBase;
+       typedef __rope_RopeConcatenation<charT,Alloc> RopeConcatenation;
+       typedef __rope_RopeLeaf<charT,Alloc> RopeLeaf;
+       typedef __rope_RopeFunction<charT,Alloc> RopeFunction;
+       typedef __rope_RopeSubstring<charT,Alloc> RopeSubstring;
+
+       // The only data member of a rope:
+       RopeBase *tree_ptr;
+
+       // Retrieve a character at the indicated position.
+       static charT fetch(RopeBase * r, size_type pos);
+
+#      ifndef __GC
+           // Obtain a pointer to the character at the indicated position.
+           // The pointer can be used to change the character.
+           // If such a pointer cannot be produced, as is frequently the
+           // case, 0 is returned instead.
+           // (Returns nonzero only if all nodes in the path have a refcount
+           // of 1.)
+           static charT * fetch_ptr(RopeBase * r, size_type pos);
+#      endif
+
+       static bool apply_to_pieces(
+                               // should be template parameter
+                               __rope_char_consumer<charT>& c,
+                               const RopeBase * r,
+                               size_t begin, size_t end);
+                               // begin and end are assumed to be in range.
+
+#      ifndef __GC
+         static void unref(RopeBase* t)
+         {
+             RopeBase::unref(t);
+         }
+         static void ref(RopeBase* t)
+         {
+             RopeBase::ref(t);
+         }
+#       else /* __GC */
+         static void unref(RopeBase* t) {}
+         static void ref(RopeBase* t) {}
+#       endif
+
+
+#       ifdef __GC
+           typedef __rope_RopeBase<charT,Alloc> * self_destruct_ptr;
+#      else
+           typedef __rope_self_destruct_ptr<charT,Alloc> self_destruct_ptr;
+#      endif
+
+       // Result is counted in refcount.
+       static RopeBase * substring(RopeBase * base,
+                                   size_t start, size_t endp1);
+
+       static RopeBase * concat_char_iter(RopeBase * r,
+                                         const charT *iter, size_t slen);
+               // Concatenate rope and char ptr, copying s.
+               // Should really take an arbitrary iterator.
+               // Result is counted in refcount.
+       static RopeBase * destr_concat_char_iter(RopeBase * r,
+                                                const charT *iter, size_t slen)
+               // As above, but one reference to r is about to be
+               // destroyed.  Thus the pieces may be recycled if all
+               // relevent reference counts are 1.
+#          ifdef __GC
+               // We can't really do anything since refcounts are unavailable.
+               { return concat_char_iter(r, iter, slen); }
+#          else
+               ;
+#          endif
+
+       static RopeBase * concat(RopeBase *left, RopeBase *right);
+               // General concatenation on RopeBase.  Result
+               // has refcount of 1.  Adjusts argument refcounts.
+
+   public:
+       void apply_to_pieces( size_t begin, size_t end,
+                             __rope_char_consumer<charT>& c) const {
+           apply_to_pieces(c, tree_ptr, begin, end);
+       }
+
+
+   protected:
+
+       static size_t rounded_up_size(size_t n) {
+           return RopeBase::rounded_up_size(n);
+       }
+
+       static size_t allocated_capacity(size_t n) {
+           if (__is_basic_char_type((charT *)0)) {
+               return rounded_up_size(n) - 1;
+           } else {
+               return rounded_up_size(n);
+           }
+       }
+               
+       // s should really be an arbitrary input iterator.
+       // Adds a trailing NULL for basic char types.
+       static charT * alloc_copy(const charT *s, size_t size)
+       {
+           charT * result = DataAlloc::allocate(rounded_up_size(size));
+
+           uninitialized_copy_n(s, size, result);
+           __cond_store_eos(result[size]);
+           return(result);
+       }
+
+       // Basic constructors for rope tree nodes.
+       // These return tree nodes with a 0 reference count.
+       static RopeLeaf * RopeLeaf_from_char_ptr(__GC_CONST charT *s,
+                                                size_t size);
+               // Takes ownership of its argument.
+               // Result has refcount 1.
+               // In the nonGC, basic_char_type  case it assumes that s
+               // is eos-terminated.
+               // In the nonGC case, it was allocated from Alloc with
+               // rounded_up_size(size).
+
+       static RopeLeaf * RopeLeaf_from_unowned_char_ptr(const charT *s,
+                                                        size_t size) {
+           charT * buf = alloc_copy(s, size);
+            __STL_TRY {
+              return RopeLeaf_from_char_ptr(buf, size);
+            }
+            __STL_UNWIND(RopeBase::free_string(buf, size))
+       }
+           
+
+       // Concatenation of nonempty strings.
+       // Always builds a concatenation node.
+       // Rebalances if the result is too deep.
+       // Result has refcount 1.
+       // Does not increment left and right ref counts even though
+       // they are referenced.
+       static RopeBase * tree_concat(RopeBase * left, RopeBase * right);
+
+       // Result has refcount 1.
+       // If delete_fn is true, then fn is deleted when the rope
+       // becomes inaccessible.
+       static RopeFunction * RopeFunction_from_fn
+                       (char_producer<charT> *fn, size_t size,
+                        bool delete_fn);
+
+       // Concatenation helper functions
+       static RopeLeaf * leaf_concat_char_iter
+                       (RopeLeaf * r, const charT * iter, size_t slen);
+               // Concatenate by copying leaf.
+               // should take an arbitrary iterator
+               // result has refcount 1.
+#      ifndef __GC
+         static RopeLeaf * destr_leaf_concat_char_iter
+                       (RopeLeaf * r, const charT * iter, size_t slen);
+         // A version that potentially clobbers r if r -> refcount == 1.
+#       endif
+
+       // A helper function for exponentiating strings.
+       // This uses a nonstandard refcount convention.
+       // The result has refcount 0.
+       struct concat_fn;
+       friend struct rope<charT,Alloc>::concat_fn;
+
+       struct concat_fn
+               : public binary_function<rope<charT,Alloc>, rope<charT,Alloc>,
+                                        rope<charT,Alloc> > {
+               rope operator() (const rope& x, const rope& y) {
+                   return x + y;
+               }
+       };
+
+        friend rope identity_element(concat_fn) { return rope<charT,Alloc>(); }
+
+       static size_t char_ptr_len(const charT * s);
+                       // slightly generalized strlen
+
+       rope(RopeBase *t) : tree_ptr(t) { }
+
+
+       // Copy r to the CharT buffer.
+       // Returns buffer + r -> size.
+       // Assumes that buffer is uninitialized.
+       static charT * flatten(RopeBase * r, charT * buffer);
+
+       // Again, with explicit starting position and length.
+       // Assumes that buffer is uninitialized.
+       static charT * flatten(RopeBase * r,
+                              size_t start, size_t len,
+                              charT * buffer);
+
+       static const unsigned long min_len[RopeBase::max_rope_depth + 1];
+
+       static bool is_balanced(RopeBase *r)
+               { return (r -> size >= min_len[r -> depth]); }
+
+       static bool is_almost_balanced(RopeBase *r)
+               { return (r -> depth == 0 ||
+                         r -> size >= min_len[r -> depth - 1]); }
+
+       static bool is_roughly_balanced(RopeBase *r)
+               { return (r -> depth <= 1 ||
+                         r -> size >= min_len[r -> depth - 2]); }
+
+       // Assumes the result is not empty.
+       static RopeBase * concat_and_set_balanced(RopeBase *left,
+                                                 RopeBase *right)
+       {
+           RopeBase * result = concat(left, right);
+           if (is_balanced(result)) result -> is_balanced = true;
+           return result;
+       }
+
+       // The basic rebalancing operation.  Logically copies the
+       // rope.  The result has refcount of 1.  The client will
+       // usually decrement the reference count of r.
+       // The result isd within height 2 of balanced by the above
+       // definition.
+       static RopeBase * balance(RopeBase * r);
+
+       // Add all unbalanced subtrees to the forest of balanceed trees.
+       // Used only by balance.
+       static void add_to_forest(RopeBase *r, RopeBase **forest);
+       
+       // Add r to forest, assuming r is already balanced.
+       static void add_leaf_to_forest(RopeBase *r, RopeBase **forest);
+
+       // Print to stdout, exposing structure
+       static void dump(RopeBase * r, int indent = 0);
+
+       // Return -1, 0, or 1 if x < y, x == y, or x > y resp.
+       static int compare(const RopeBase *x, const RopeBase *y);
+
+   public:
+       bool empty() const { return 0 == tree_ptr; }
+
+       // Comparison member function.  This is public only for those
+       // clients that need a ternary comparison.  Others
+       // should use the comparison operators below.
+       int compare(const rope &y) const {
+           return compare(tree_ptr, y.tree_ptr);
+       }
+
+       rope(const charT *s)
+       {
+           size_t len = char_ptr_len(s);
+
+           if (0 == len) {
+               tree_ptr = 0;
+           } else {
+               tree_ptr = RopeLeaf_from_unowned_char_ptr(s, len);
+#              ifndef __GC
+                 __stl_assert(1 == tree_ptr -> refcount);
+#              endif
+           }
+       }
+
+       rope(const charT *s, size_t len)
+       {
+           if (0 == len) {
+               tree_ptr = 0;
+           } else {
+               tree_ptr = RopeLeaf_from_unowned_char_ptr(s, len);
+           }
+       }
+
+       rope(const charT *s, charT *e)
+       {
+           size_t len = e - s;
+
+           if (0 == len) {
+               tree_ptr = 0;
+           } else {
+               tree_ptr = RopeLeaf_from_unowned_char_ptr(s, len);
+           }
+       }
+
+       rope(const const_iterator& s, const const_iterator& e)
+       {
+           tree_ptr = substring(s.root, s.current_pos, e.current_pos);
+       }
+
+       rope(const iterator& s, const iterator& e)
+       {
+           tree_ptr = substring(s.root, s.current_pos, e.current_pos);
+       }
+
+       rope(charT c)
+       {
+           charT * buf = DataAlloc::allocate(rounded_up_size(1));
+
+           construct(buf, c);
+           __STL_TRY {
+               tree_ptr = RopeLeaf_from_char_ptr(buf, 1);
+            }
+            __STL_UNWIND(RopeBase::free_string(buf, 1))
+       }
+
+       rope(size_t n, charT c);
+
+       // Should really be templatized with respect to the iterator type
+       // and use sequence_buffer.  (It should perhaps use sequence_buffer
+       // even now.)
+       rope(const charT *i, const charT *j)
+       {
+           if (i == j) {
+               tree_ptr = 0;
+           } else {
+               size_t len = j - i;
+               tree_ptr = RopeLeaf_from_unowned_char_ptr(i, len);
+           }
+       }
+
+       rope()
+       {
+           tree_ptr = 0;
+       }
+
+       // Construct a rope from a function that can compute its members
+       rope(char_producer<charT> *fn, size_t len, bool delete_fn)
+       {
+           tree_ptr = RopeFunction_from_fn(fn, len, delete_fn);
+       }
+
+       rope(const rope &x)
+       {
+           tree_ptr = x.tree_ptr;
+           ref(tree_ptr);
+       }
+
+       ~rope()
+       {
+           unref(tree_ptr);
+       }
+
+       rope& operator=(const rope& x)
+       {
+           RopeBase *old = tree_ptr;
+           tree_ptr = x.tree_ptr;
+           ref(tree_ptr);
+           unref(old);
+           return(*this);
+       }
+
+       void push_back(charT x)
+       {
+           RopeBase *old = tree_ptr;
+           tree_ptr = concat_char_iter(tree_ptr, &x, 1);
+           unref(old);
+       }
+
+       void pop_back()
+       {
+           RopeBase *old = tree_ptr;
+           tree_ptr = substring(tree_ptr, 0, tree_ptr -> size - 1);
+           unref(old);
+       }
+
+       charT back() const
+       {
+           return fetch(tree_ptr, tree_ptr -> size - 1);
+       }
+
+       void push_front(charT x)
+       {
+           RopeBase *old = tree_ptr;
+           RopeBase *left;
+
+           left = RopeLeaf_from_unowned_char_ptr(&x, 1);
+           __STL_TRY {
+             tree_ptr = concat(left, tree_ptr);
+             unref(old);
+              unref(left);
+            }
+           __STL_UNWIND(unref(left))
+       }
+
+       void pop_front()
+       {
+           RopeBase *old = tree_ptr;
+           tree_ptr = substring(tree_ptr, 1, tree_ptr -> size);
+           unref(old);
+       }
+
+       charT front() const
+       {
+           return fetch(tree_ptr, 0);
+       }
+
+       void balance()
+       {
+           RopeBase *old = tree_ptr;
+           tree_ptr = balance(tree_ptr);
+           unref(old);
+       }
+
+       void copy(charT * buffer) const {
+           destroy(buffer, buffer + size());
+           flatten(tree_ptr, buffer);
+       }
+
+       // This is the copy function from the standard, but
+       // with the arguments reordered to make it consistent with the
+       // rest of the interface.
+       // Note that this guaranteed not to compile if the draft standard
+       // order is assumed.
+       size_type copy(size_type pos, size_type n, charT *buffer) const {
+           size_t sz = size();
+           size_t len = (pos + n > sz? sz - pos : n);
+
+           destroy(buffer, buffer + len);
+           flatten(tree_ptr, pos, len, buffer);
+           return len;
+       }
+
+       // Print to stdout, exposing structure.  May be useful for
+       // performance debugging.
+       void dump() {
+           dump(tree_ptr);
+       }
+
+       // Convert to 0 terminated string in new allocated memory.
+       // Embedded 0s in the input do not terminate the copy.
+       const charT * c_str() const;
+
+       // As above, but lso use the flattened representation as the
+       // the new rope representation.
+       const charT * replace_with_c_str();
+
+       // Reclaim memory for the c_str generated flattened string.
+       // Intentionally undocumented, since it's hard to say when this
+       // is safe for multiple threads.
+       void delete_c_str () {
+           if (0 == tree_ptr) return;
+           if (RopeBase::leaf == tree_ptr -> tag
+               && ((RopeLeaf *)tree_ptr) -> data == tree_ptr -> c_string) {
+               // Representation shared
+               return;
+           }
+#          ifndef __GC
+             tree_ptr -> free_c_string();
+#          endif
+           tree_ptr -> c_string = 0;
+       }
+
+       charT operator[] (size_type pos) const {
+           return fetch(tree_ptr, pos);
+       }
+
+       charT at(size_type pos) const {
+          // if (pos >= size()) throw out_of_range;
+          return (*this)[pos];
+       }
+
+       const_iterator begin() const {
+           return(const_iterator(tree_ptr, 0));
+       }
+
+       // An easy way to get a const iterator from a non-const container.
+       const_iterator const_begin() const {
+           return(const_iterator(tree_ptr, 0));
+       }
+
+       const_iterator end() const {
+           return(const_iterator(tree_ptr, size()));
+       }
+
+       const_iterator const_end() const {
+           return(const_iterator(tree_ptr, size()));
+       }
+
+       size_type size() const { 
+           return(0 == tree_ptr? 0 : tree_ptr -> size);
+       }
+
+       size_type length() const {
+           return size();
+       }
+
+       size_type max_size() const {
+           return min_len[RopeBase::max_rope_depth-1] - 1;
+           //  Guarantees that the result can be sufficirntly
+           //  balanced.  Longer ropes will probably still work,
+           //  but it's harder to make guarantees.
+       }
+
+#     ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
+        typedef reverse_iterator<const_iterator> const_reverse_iterator;
+#     else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+       typedef reverse_iterator<const_iterator, value_type, const_reference,
+                                difference_type>  const_reverse_iterator;
+#     endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ 
+
+       const_reverse_iterator rbegin() const {
+           return const_reverse_iterator(end());
+       }
+
+       const_reverse_iterator const_rbegin() const {
+           return const_reverse_iterator(end());
+       }
+
+       const_reverse_iterator rend() const {
+           return const_reverse_iterator(begin());
+       }
+
+       const_reverse_iterator const_rend() const {
+           return const_reverse_iterator(begin());
+       }
+
+       friend rope<charT,Alloc>
+        operator+ __STL_NULL_TMPL_ARGS (const rope<charT,Alloc> &left,
+                                        const rope<charT,Alloc> &right);
+       
+       friend rope<charT,Alloc>
+        operator+ __STL_NULL_TMPL_ARGS (const rope<charT,Alloc> &left,
+                                        const charT* right);
+       
+       friend rope<charT,Alloc>
+        operator+ __STL_NULL_TMPL_ARGS (const rope<charT,Alloc> &left,
+                                        charT right);
+       
+       // The symmetric cases are intentionally omitted, since they're presumed
+       // to be less common, and we don't handle them as well.
+
+       // The following should really be templatized.
+       // The first argument should be an input iterator or
+       // forward iterator with value_type charT.
+       rope& append(const charT* iter, size_t n) {
+           RopeBase* result = destr_concat_char_iter(tree_ptr, iter, n);
+           unref(tree_ptr);
+           tree_ptr = result;
+           return *this;
+       }
+
+       rope& append(const charT* c_string) {
+           size_t len = char_ptr_len(c_string);
+           append(c_string, len);
+           return(*this);
+       }
+
+       rope& append(const charT* s, const charT* e) {
+           RopeBase* result =
+                       destr_concat_char_iter(tree_ptr, s, e - s);
+           unref(tree_ptr);
+           tree_ptr = result;
+           return *this;
+       }
+
+       rope& append(const_iterator s, const_iterator e) {
+           __stl_assert(s.root == e.root);
+           self_destruct_ptr appendee(substring(s.root, s.current_pos,
+                                                e.current_pos));
+           RopeBase* result = concat(tree_ptr, (RopeBase *)appendee);
+           unref(tree_ptr);
+           tree_ptr = result;
+           return *this;
+       }
+
+       rope& append(charT c) {
+           RopeBase* result = destr_concat_char_iter(tree_ptr, &c, 1);
+           unref(tree_ptr);
+           tree_ptr = result;
+           return *this;
+       }
+
+       rope& append() { return append(charT()); }
+
+       rope& append(const rope& y) {
+           RopeBase* result = concat(tree_ptr, y.tree_ptr);
+           unref(tree_ptr);
+           tree_ptr = result;
+           return *this;
+       }
+
+       rope& append(size_t n, charT c) {
+           rope<charT,Alloc> last(n, c);
+           return append(last);
+       }
+
+       void swap(rope& b) {
+           RopeBase * tmp = tree_ptr;
+           tree_ptr = b.tree_ptr;
+           b.tree_ptr = tmp;
+       }
+
+
+    protected:
+       // Result is included in refcount.
+       static RopeBase * replace(RopeBase *old, size_t pos1,
+                                 size_t pos2, RopeBase *r) {
+           if (0 == old) { ref(r); return r; }
+           self_destruct_ptr left(substring(old, 0, pos1));
+           self_destruct_ptr right(substring(old, pos2, old -> size));
+           RopeBase * result;
+
+           if (0 == r) {
+               result = concat(left, right);
+           } else {
+               self_destruct_ptr left_result(concat(left, r));
+               result = concat(left_result, right);
+           }
+           return result;
+       }
+
+    public:
+       void insert(size_t p, const rope& r) {
+           RopeBase * result = replace(tree_ptr, p, p,
+                                              r.tree_ptr);
+           unref(tree_ptr);
+           tree_ptr = result;
+       }
+
+       void insert(size_t p, size_t n, charT c) {
+           rope<charT,Alloc> r(n,c);
+           insert(p, r);
+       }
+
+       void insert(size_t p, const charT * i, size_t n) {
+           self_destruct_ptr left(substring(tree_ptr, 0, p));
+           self_destruct_ptr right(substring(tree_ptr, p, size()));
+           self_destruct_ptr left_result(concat_char_iter(left, i, n));
+           RopeBase * result =
+                               concat(left_result, right);
+           unref(tree_ptr);
+           tree_ptr = result;
+       }
+
+       void insert(size_t p, const charT * c_string) {
+           insert(p, c_string, char_ptr_len(c_string));
+       }
+
+       void insert(size_t p, charT c) {
+           insert(p, &c, 1);
+       }
+
+       void insert(size_t p) {
+           charT c = charT();
+           insert(p, &c, 1);
+       }
+
+       void insert(size_t p, const charT *i, const charT *j) {
+           rope r(i, j);
+           insert(p, r);
+       }
+
+       void insert(size_t p, const const_iterator& i,
+                             const const_iterator& j) {
+           rope r(i, j);
+           insert(p, r);
+       }
+
+       void insert(size_t p, const iterator& i,
+                             const iterator& j) {
+           rope r(i, j);
+           insert(p, r);
+       }
+
+       // (position, length) versions of replace operations:
+
+       void replace(size_t p, size_t n, const rope& r) {
+           RopeBase * result = replace(tree_ptr, p, p + n,
+                                              r.tree_ptr);
+           unref(tree_ptr);
+           tree_ptr = result;
+       }
+
+       void replace(size_t p, size_t n, const charT *i, size_t i_len) {
+           rope r(i, i_len);
+           replace(p, n, r);
+       }
+
+       void replace(size_t p, size_t n, charT c) {
+           rope r(c);
+           replace(p, n, r);
+       }
+
+       void replace(size_t p, size_t n, const charT *c_string) {
+           rope r(c_string);
+           replace(p, n, r);
+       }
+
+       void replace(size_t p, size_t n, const charT *i, const charT *j) {
+           rope r(i, j);
+           replace(p, n, r);
+       }
+
+       void replace(size_t p, size_t n,
+                    const const_iterator& i, const const_iterator& j) {
+           rope r(i, j);
+           replace(p, n, r);
+       }
+
+       void replace(size_t p, size_t n,
+                    const iterator& i, const iterator& j) {
+           rope r(i, j);
+           replace(p, n, r);
+       }
+
+       // Single character variants:
+       void replace(size_t p, charT c) {
+           iterator i(this, p);
+           *i = c;
+       }
+
+       void replace(size_t p, const rope& r) {
+           replace(p, 1, r);
+       }
+
+       void replace(size_t p, const charT *i, size_t i_len) {
+           replace(p, 1, i, i_len);
+       }
+
+       void replace(size_t p, const charT *c_string) {
+           replace(p, 1, c_string);
+       }
+
+       void replace(size_t p, const charT *i, const charT *j) {
+           replace(p, 1, i, j);
+       }
+
+       void replace(size_t p, const const_iterator& i,
+                              const const_iterator& j) {
+           replace(p, 1, i, j);
+       }
+
+       void replace(size_t p, const iterator& i,
+                              const iterator& j) {
+           replace(p, 1, i, j);
+       }
+
+       // Erase, (position, size) variant.
+       void erase(size_t p, size_t n) {
+           RopeBase * result = replace(tree_ptr, p, p + n, 0);
+           unref(tree_ptr);
+           tree_ptr = result;
+       }
+
+       // Erase, single character
+       void erase(size_t p) {
+           erase(p, p + 1);
+       }
+
+       // Insert, iterator variants.  
+       iterator insert(const iterator& p, const rope& r)
+               { insert(p.index(), r); return p; }
+       iterator insert(const iterator& p, size_t n, charT c)
+               { insert(p.index(), n, c); return p; }
+       iterator insert(const iterator& p, charT c) 
+               { insert(p.index(), c); return p; }
+       iterator insert(const iterator& p ) 
+               { insert(p.index()); return p; }
+       iterator insert(const iterator& p, const charT *c_string) 
+               { insert(p.index(), c_string); return p; }
+       iterator insert(const iterator& p, const charT *i, size_t n)
+               { insert(p.index(), i, n); return p; }
+       iterator insert(const iterator& p, const charT *i, const charT *j)
+               { insert(p.index(), i, j);  return p; }
+       iterator insert(const iterator& p,
+                       const const_iterator& i, const const_iterator& j)
+               { insert(p.index(), i, j); return p; }
+       iterator insert(const iterator& p,
+                       const iterator& i, const iterator& j)
+               { insert(p.index(), i, j); return p; }
+
+       // Replace, range variants.
+       void replace(const iterator& p, const iterator& q,
+                    const rope& r)
+               { replace(p.index(), q.index() - p.index(), r); }
+       void replace(const iterator& p, const iterator& q, charT c)
+               { replace(p.index(), q.index() - p.index(), c); }
+       void replace(const iterator& p, const iterator& q,
+                    const charT * c_string)
+               { replace(p.index(), q.index() - p.index(), c_string); }
+       void replace(const iterator& p, const iterator& q,
+                    const charT *i, size_t n)
+               { replace(p.index(), q.index() - p.index(), i, n); }
+       void replace(const iterator& p, const iterator& q,
+                    const charT *i, const charT *j)
+               { replace(p.index(), q.index() - p.index(), i, j); }
+       void replace(const iterator& p, const iterator& q,
+                    const const_iterator& i, const const_iterator& j)
+               { replace(p.index(), q.index() - p.index(), i, j); }
+       void replace(const iterator& p, const iterator& q,
+                    const iterator& i, const iterator& j)
+               { replace(p.index(), q.index() - p.index(), i, j); }
+
+       // Replace, iterator variants.
+       void replace(const iterator& p, const rope& r)
+               { replace(p.index(), r); }
+       void replace(const iterator& p, charT c)
+               { replace(p.index(), c); }
+       void replace(const iterator& p, const charT * c_string)
+               { replace(p.index(), c_string); }
+       void replace(const iterator& p, const charT *i, size_t n)
+               { replace(p.index(), i, n); }
+       void replace(const iterator& p, const charT *i, const charT *j)
+               { replace(p.index(), i, j); }
+       void replace(const iterator& p, const_iterator i, const_iterator j)
+               { replace(p.index(), i, j); }
+       void replace(const iterator& p, iterator i, iterator j)
+               { replace(p.index(), i, j); }
+
+       // Iterator and range variants of erase
+       iterator erase(const iterator &p, const iterator &q) {
+            size_t p_index = p.index();
+            erase(p_index, q.index() - p_index);
+            return iterator(this, p_index);
+        }
+        iterator erase(const iterator &p) {
+            size_t p_index = p.index();
+            erase(p_index, 1);
+            return iterator(this, p_index);
+        }
+
+       rope substr(size_t start, size_t len = 1) const {
+           return rope<charT,Alloc>(
+                       substring(tree_ptr, start, start + len));
+       }
+
+       rope substr(iterator start, iterator end) const {
+           return rope<charT,Alloc>(
+                       substring(tree_ptr, start.index(), end.index()));
+       }
+       
+       rope substr(iterator start) const {
+           size_t pos = start.index();
+           return rope<charT,Alloc>(
+                       substring(tree_ptr, pos, pos + 1));
+       }
+       
+       rope substr(const_iterator start, const_iterator end) const {
+           // This might eventually take advantage of the cache in the
+           // iterator.
+           return rope<charT,Alloc>
+               (substring(tree_ptr, start.index(), end.index()));
+       }
+
+       rope<charT,Alloc> substr(const_iterator start) {
+           size_t pos = start.index();
+           return rope<charT,Alloc>(substring(tree_ptr, pos, pos + 1));
+       }
+
+       size_type find(charT c, size_type pos = 0) const;
+       size_type find(charT *s, size_type pos = 0) const {
+           const_iterator result = search(const_begin() + pos, const_end(),
+                                          s, s + char_ptr_len(s));
+           return result.index();
+       }
+
+       iterator mutable_begin() {
+           return(iterator(this, 0));
+       }
+
+       iterator mutable_end() {
+           return(iterator(this, size()));
+       }
+
+#     ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
+        typedef reverse_iterator<iterator> reverse_iterator;
+#     else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+       typedef reverse_iterator<iterator, value_type, reference,
+                                difference_type>  reverse_iterator;
+#     endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ 
+
+       reverse_iterator mutable_rbegin() {
+           return reverse_iterator(mutable_end());
+       }
+
+       reverse_iterator mutable_rend() {
+           return reverse_iterator(mutable_begin());
+       }
+
+       reference mutable_reference_at(size_type pos) {
+           return reference(this, pos);
+       }
+
+#      ifdef __STD_STUFF
+           reference operator[] (size_type pos) {
+               return charT_ref_proxy(this, pos);
+           }
+
+           reference at(size_type pos) {
+               // if (pos >= size()) throw out_of_range;
+               return (*this)[pos];
+           }
+
+           void resize(size_type n, charT c) {}
+           void resize(size_type n) {}
+           void reserve(size_type res_arg = 0) {}
+           size_type capacity() const {
+               return max_size();
+           }
+
+         // Stuff below this line is dangerous because it's error prone.
+         // I would really like to get rid of it.
+           // copy function with funny arg ordering.
+             size_type copy(charT *buffer, size_type n, size_type pos = 0)
+                                                               const {
+               return copy(pos, n, buffer);
+             }
+
+           iterator end() { return mutable_end(); }
+
+           iterator begin() { return mutable_begin(); }
+
+           reverse_iterator rend() { return mutable_rend(); }
+
+           reverse_iterator rbegin() { return mutable_rbegin(); }
+
+#      else
+
+           const_iterator end() { return const_end(); }
+
+           const_iterator begin() { return const_begin(); }
+
+           const_reverse_iterator rend() { return const_rend(); }
+  
+           const_reverse_iterator rbegin() { return const_rbegin(); }
+
+#      endif
+       
+};
+
+template <class charT, class Alloc>
+inline bool operator== (const __rope_const_iterator<charT,Alloc> & x,
+                       const __rope_const_iterator<charT,Alloc> & y) {
+       return (x.current_pos == y.current_pos && x.root == y.root);
+}
+
+template <class charT, class Alloc>
+inline bool operator< (const __rope_const_iterator<charT,Alloc> & x,
+                      const __rope_const_iterator<charT,Alloc> & y) {
+       return (x.current_pos < y.current_pos);
+}
+
+template <class charT, class Alloc>
+inline ptrdiff_t operator-(const __rope_const_iterator<charT,Alloc> & x,
+                          const __rope_const_iterator<charT,Alloc> & y) {
+       return x.current_pos - y.current_pos;
+}
+
+template <class charT, class Alloc>
+inline __rope_const_iterator<charT,Alloc>
+operator-(const __rope_const_iterator<charT,Alloc> & x,
+         ptrdiff_t n) {
+       return __rope_const_iterator<charT,Alloc>(x.root, x.current_pos - n);
+}
+
+template <class charT, class Alloc>
+inline __rope_const_iterator<charT,Alloc>
+operator+(const __rope_const_iterator<charT,Alloc> & x,
+         ptrdiff_t n) {
+       return __rope_const_iterator<charT,Alloc>(x.root, x.current_pos + n);
+}
+
+template <class charT, class Alloc>
+inline __rope_const_iterator<charT,Alloc>
+operator+(ptrdiff_t n,
+         const __rope_const_iterator<charT,Alloc> & x) {
+       return __rope_const_iterator<charT,Alloc>(x.root, x.current_pos + n);
+}
+
+template <class charT, class Alloc>
+inline bool operator== (const __rope_iterator<charT,Alloc> & x,
+                       const __rope_iterator<charT,Alloc> & y) {
+       return (x.current_pos == y.current_pos && x.root_rope == y.root_rope);
+}
+
+template <class charT, class Alloc>
+inline bool operator< (const __rope_iterator<charT,Alloc> & x,
+                       const __rope_iterator<charT,Alloc> & y) {
+       return (x.current_pos < y.current_pos);
+}
+
+template <class charT, class Alloc>
+inline ptrdiff_t operator-(const __rope_iterator<charT,Alloc> & x,
+                          const __rope_iterator<charT,Alloc> & y) {
+       return x.current_pos - y.current_pos;
+}
+
+template <class charT, class Alloc>
+inline __rope_iterator<charT,Alloc>
+operator-(const __rope_iterator<charT,Alloc> & x,
+         ptrdiff_t n) {
+       return __rope_iterator<charT,Alloc>(x.root_rope, x.current_pos - n);
+}
+
+template <class charT, class Alloc>
+inline __rope_iterator<charT,Alloc>
+operator+(const __rope_iterator<charT,Alloc> & x,
+         ptrdiff_t n) {
+       return __rope_iterator<charT,Alloc>(x.root_rope, x.current_pos + n);
+}
+
+template <class charT, class Alloc>
+inline __rope_iterator<charT,Alloc>
+operator+(ptrdiff_t n,
+         const __rope_iterator<charT,Alloc> & x) {
+       return __rope_iterator<charT,Alloc>(x.root_rope, x.current_pos + n);
+}
+
+template <class charT, class Alloc>
+inline
+rope<charT,Alloc>
+operator+ (const rope<charT,Alloc> &left,
+          const rope<charT,Alloc> &right)
+{
+    return rope<charT,Alloc>
+               (rope<charT,Alloc>::concat(left.tree_ptr, right.tree_ptr));
+    // Inlining this should make it possible to keep left and
+    // right in registers.
+}
+
+template <class charT, class Alloc>
+inline
+rope<charT,Alloc>&
+operator+= (rope<charT,Alloc> &left,
+           const rope<charT,Alloc> &right)
+{
+    left.append(right);
+    return left;
+}
+
+template <class charT, class Alloc>
+inline
+rope<charT,Alloc>
+operator+ (const rope<charT,Alloc> &left,
+          const charT* right) {
+    size_t rlen = rope<charT,Alloc>::char_ptr_len(right);
+    return rope<charT,Alloc>
+          (rope<charT,Alloc>::concat_char_iter(left.tree_ptr, right, rlen)); 
+}
+
+template <class charT, class Alloc>
+inline
+rope<charT,Alloc>&
+operator+= (rope<charT,Alloc> &left,
+           const charT* right) {
+    left.append(right);
+    return left;
+}
+
+template <class charT, class Alloc>
+inline
+rope<charT,Alloc>
+operator+ (const rope<charT,Alloc> &left, charT right) {
+    return rope<charT,Alloc>
+               (rope<charT,Alloc>::concat_char_iter(left.tree_ptr, &right, 1));
+}
+
+template <class charT, class Alloc>
+inline
+rope<charT,Alloc>&
+operator+= (rope<charT,Alloc> &left, charT right) {
+    left.append(right);
+    return left;
+}
+
+template <class charT, class Alloc>
+bool
+operator< (const rope<charT,Alloc> &left, const rope<charT,Alloc> &right) {
+    return left.compare(right) < 0;
+}
+       
+template <class charT, class Alloc>
+bool
+operator== (const rope<charT,Alloc> &left, const rope<charT,Alloc> &right) {
+    return left.compare(right) == 0;
+}
+
+template <class charT, class Alloc>
+inline bool operator== (const __rope_charT_ptr_proxy<charT,Alloc> & x,
+                       const __rope_charT_ptr_proxy<charT,Alloc> & y) {
+       return (x.pos == y.pos && x.root == y.root);
+}
+
+template<class charT, class Alloc>
+ostream& operator<< (ostream& o, const rope<charT, Alloc>& r);        
+       
+typedef rope<char, __ALLOC> crope;
+typedef rope<wchar_t, __ALLOC> wrope;
+
+inline crope::reference __mutable_reference_at(crope& c, size_t i)
+{
+    return c.mutable_reference_at(i);
+}
+
+inline wrope::reference __mutable_reference_at(wrope& c, size_t i)
+{
+    return c.mutable_reference_at(i);
+}
+
+#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class charT, class Alloc>
+inline void swap(rope<charT, Alloc>& x, rope<charT, Alloc>& y) {
+  x.swap(y);
+}
+
+#else
+
+inline void swap(crope x, crope y) { x.swap(y); }
+inline void swap(wrope x, wrope y) { x.swap(y); }
+
+#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
+
+// Hash functions should probably be revisited later:
+__STL_TEMPLATE_NULL struct hash<crope>
+{
+  size_t operator()(const crope& str) const
+  {
+    size_t sz = str.size();
+
+    if (0 == sz) return 0;
+    return 13*str[0] + 5*str[sz - 1] + sz;
+  }
+};
+
+
+__STL_TEMPLATE_NULL struct hash<wrope>
+{
+  size_t operator()(const wrope& str) const
+  {
+    size_t sz = str.size();
+
+    if (0 == sz) return 0;
+    return 13*str[0] + 5*str[sz - 1] + sz;
+  }
+};
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1174
+#endif
+
+__STL_END_NAMESPACE
+
+# include <ropeimpl.h>
+# endif /* __SGI_STL_INTERNAL_ROPE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_set.h b/libstdc++/stl/stl_set.h
new file mode 100644 (file)
index 0000000..9ffeaa7
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_SET_H
+#define __SGI_STL_INTERNAL_SET_H
+
+__STL_BEGIN_NAMESPACE
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1174
+#endif
+
+#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
+template <class Key, class Compare = less<Key>, class Alloc = alloc>
+#else
+template <class Key, class Compare, class Alloc = alloc>
+#endif
+class set {
+public:
+  // typedefs:
+
+  typedef Key key_type;
+  typedef Key value_type;
+  typedef Compare key_compare;
+  typedef Compare value_compare;
+private:
+  typedef rb_tree<key_type, value_type, 
+                  identity<value_type>, key_compare, Alloc> rep_type;
+  rep_type t;  // red-black tree representing set
+public:
+  typedef typename rep_type::const_pointer pointer;
+  typedef typename rep_type::const_pointer const_pointer;
+  typedef typename rep_type::const_reference reference;
+  typedef typename rep_type::const_reference const_reference;
+  typedef typename rep_type::const_iterator iterator;
+  typedef typename rep_type::const_iterator const_iterator;
+  typedef typename rep_type::const_reverse_iterator reverse_iterator;
+  typedef typename rep_type::const_reverse_iterator const_reverse_iterator;
+  typedef typename rep_type::size_type size_type;
+  typedef typename rep_type::difference_type difference_type;
+
+  // allocation/deallocation
+
+  set() : t(Compare()) {}
+  explicit set(const Compare& comp) : t(comp) {}
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  set(InputIterator first, InputIterator last)
+    : t(Compare()) { t.insert_unique(first, last); }
+
+  template <class InputIterator>
+  set(InputIterator first, InputIterator last, const Compare& comp)
+    : t(comp) { t.insert_unique(first, last); }
+#else
+  set(const value_type* first, const value_type* last) 
+    : t(Compare()) { t.insert_unique(first, last); }
+  set(const value_type* first, const value_type* last, const Compare& comp)
+    : t(comp) { t.insert_unique(first, last); }
+
+  set(const_iterator first, const_iterator last)
+    : t(Compare()) { t.insert_unique(first, last); }
+  set(const_iterator first, const_iterator last, const Compare& comp)
+    : t(comp) { t.insert_unique(first, last); }
+#endif /* __STL_MEMBER_TEMPLATES */
+
+  set(const set<Key, Compare, Alloc>& x) : t(x.t) {}
+  set<Key, Compare, Alloc>& operator=(const set<Key, Compare, Alloc>& x) { 
+    t = x.t; 
+    return *this;
+  }
+
+  // accessors:
+
+  key_compare key_comp() const { return t.key_comp(); }
+  value_compare value_comp() const { return t.key_comp(); }
+  iterator begin() const { return t.begin(); }
+  iterator end() const { return t.end(); }
+  reverse_iterator rbegin() const { return t.rbegin(); } 
+  reverse_iterator rend() const { return t.rend(); }
+  bool empty() const { return t.empty(); }
+  size_type size() const { return t.size(); }
+  size_type max_size() const { return t.max_size(); }
+  void swap(set<Key, Compare, Alloc>& x) { t.swap(x.t); }
+
+  // insert/erase
+  typedef  pair<iterator, bool> pair_iterator_bool; 
+  pair<iterator,bool> insert(const value_type& x) { 
+    pair<typename rep_type::iterator, bool> p = t.insert_unique(x); 
+    return pair<iterator, bool>(p.first, p.second);
+  }
+  iterator insert(iterator position, const value_type& x) {
+    typedef typename rep_type::iterator rep_iterator;
+    return t.insert_unique((rep_iterator&)position, x);
+  }
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  void insert(InputIterator first, InputIterator last) {
+    t.insert_unique(first, last);
+  }
+#else
+  void insert(const_iterator first, const_iterator last) {
+    t.insert_unique(first, last);
+  }
+  void insert(const value_type* first, const value_type* last) {
+    t.insert_unique(first, last);
+  }
+#endif /* __STL_MEMBER_TEMPLATES */
+  void erase(iterator position) { 
+    typedef typename rep_type::iterator rep_iterator;
+    t.erase((rep_iterator&)position); 
+  }
+  size_type erase(const key_type& x) { 
+    return t.erase(x); 
+  }
+  void erase(iterator first, iterator last) { 
+    typedef typename rep_type::iterator rep_iterator;
+    t.erase((rep_iterator&)first, (rep_iterator&)last); 
+  }
+  void clear() { t.clear(); }
+
+  // set operations:
+
+  iterator find(const key_type& x) const { return t.find(x); }
+  size_type count(const key_type& x) const { return t.count(x); }
+  iterator lower_bound(const key_type& x) const {
+    return t.lower_bound(x);
+  }
+  iterator upper_bound(const key_type& x) const {
+    return t.upper_bound(x); 
+  }
+  pair<iterator,iterator> equal_range(const key_type& x) const {
+    return t.equal_range(x);
+  }
+  friend bool operator== __STL_NULL_TMPL_ARGS (const set&, const set&);
+  friend bool operator< __STL_NULL_TMPL_ARGS (const set&, const set&);
+};
+
+template <class Key, class Compare, class Alloc>
+inline bool operator==(const set<Key, Compare, Alloc>& x, 
+                       const set<Key, Compare, Alloc>& y) {
+  return x.t == y.t;
+}
+
+template <class Key, class Compare, class Alloc>
+inline bool operator<(const set<Key, Compare, Alloc>& x, 
+                      const set<Key, Compare, Alloc>& y) {
+  return x.t < y.t;
+}
+
+#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class Key, class Compare, class Alloc>
+inline void swap(set<Key, Compare, Alloc>& x, 
+                 set<Key, Compare, Alloc>& y) {
+  x.swap(y);
+}
+
+#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1174
+#endif
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_SET_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_slist.h b/libstdc++/stl/stl_slist.h
new file mode 100644 (file)
index 0000000..f31ea9e
--- /dev/null
@@ -0,0 +1,740 @@
+/*
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_SLIST_H
+#define __SGI_STL_INTERNAL_SLIST_H
+
+
+__STL_BEGIN_NAMESPACE 
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1174
+#endif
+
+struct __slist_node_base
+{
+  __slist_node_base* next;
+};
+
+inline __slist_node_base* __slist_make_link(__slist_node_base* prev_node,
+                                            __slist_node_base* new_node)
+{
+  new_node->next = prev_node->next;
+  prev_node->next = new_node;
+  return new_node;
+}
+
+inline __slist_node_base* __slist_previous(__slist_node_base* head,
+                                           const __slist_node_base* node)
+{
+  while (head && head->next != node)
+    head = head->next;
+  return head;
+}
+
+inline const __slist_node_base* __slist_previous(const __slist_node_base* head,
+                                                 const __slist_node_base* node)
+{
+  while (head && head->next != node)
+    head = head->next;
+  return head;
+}
+
+inline void __slist_splice_after(__slist_node_base* pos,
+                                 __slist_node_base* before_first,
+                                 __slist_node_base* before_last)
+{
+  if (pos != before_first && pos != before_last) {
+    __slist_node_base* first = before_first->next;
+    __slist_node_base* after = pos->next;
+    before_first->next = before_last->next;
+    pos->next = first;
+    before_last->next = after;
+  }
+}
+
+inline __slist_node_base* __slist_reverse(__slist_node_base* node)
+{
+  __slist_node_base* result = node;
+  node = node->next;
+  result->next = 0;
+  while(node) {
+    __slist_node_base* next = node->next;
+    node->next = result;
+    result = node;
+    node = next;
+  }
+  return result;
+}
+
+template <class T>
+struct __slist_node : public __slist_node_base
+{
+  T data;
+};
+
+struct __slist_iterator_base
+{
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type;
+  typedef forward_iterator_tag iterator_category;
+
+  __slist_node_base* node;
+
+  __slist_iterator_base(__slist_node_base* x) : node(x) {}
+  void incr() { node = node->next; }
+
+  bool operator==(const __slist_iterator_base& x) const {
+    return node == x.node;
+  }
+  bool operator!=(const __slist_iterator_base& x) const {
+    return node != x.node;
+  }
+};
+
+template <class T, class Ref, class Ptr>
+struct __slist_iterator : public __slist_iterator_base
+{
+  typedef __slist_iterator<T, T&, T*>             iterator;
+  typedef __slist_iterator<T, const T&, const T*> const_iterator;
+  typedef __slist_iterator<T, Ref, Ptr>           self;
+
+  typedef T value_type;
+  typedef Ptr pointer;
+  typedef Ref reference;
+  typedef __slist_node<T> list_node;
+
+  __slist_iterator(list_node* x) : __slist_iterator_base(x) {}
+  __slist_iterator() : __slist_iterator_base(0) {}
+  __slist_iterator(const iterator& x) : __slist_iterator_base(x.node) {}
+
+  reference operator*() const { return ((list_node*) node)->data; }
+#ifndef __SGI_STL_NO_ARROW_OPERATOR
+  pointer operator->() const { return &(operator*()); }
+#endif /* __SGI_STL_NO_ARROW_OPERATOR */
+
+  self& operator++()
+  {
+    incr();
+    return *this;
+  }
+  self operator++(int)
+  {
+    self tmp = *this;
+    incr();
+    return tmp;
+  }
+};
+
+#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+inline ptrdiff_t*
+distance_type(const __slist_iterator_base&)
+{
+  return 0;
+}
+
+inline forward_iterator_tag
+iterator_category(const __slist_iterator_base&)
+{
+  return forward_iterator_tag();
+}
+
+template <class T, class Ref, class Ptr> 
+inline T* 
+value_type(const __slist_iterator<T, Ref, Ptr>&) {
+  return 0;
+}
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+inline size_t __slist_size(__slist_node_base* node)
+{
+  size_t result = 0;
+  for ( ; node != 0; node = node->next)
+    ++result;
+  return result;
+}
+
+template <class T, class Alloc = alloc>
+class slist
+{
+public:
+  typedef T value_type;
+  typedef value_type* pointer;
+  typedef const value_type* const_pointer;
+  typedef value_type& reference;
+  typedef const value_type& const_reference;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type;
+
+  typedef __slist_iterator<T, T&, T*>             iterator;
+  typedef __slist_iterator<T, const T&, const T*> const_iterator;
+
+private:
+  typedef __slist_node<T> list_node;
+  typedef __slist_node_base list_node_base;
+  typedef __slist_iterator_base iterator_base;
+  typedef simple_alloc<list_node, Alloc> list_node_allocator;
+
+  static list_node* create_node(const value_type& x) {
+    list_node* node = list_node_allocator::allocate();
+    __STL_TRY {
+      construct(&node->data, x);
+      node->next = 0;
+    }
+    __STL_UNWIND(list_node_allocator::deallocate(node));
+    return node;
+  }
+  
+  static void destroy_node(list_node* node) {
+    destroy(&node->data);
+    list_node_allocator::deallocate(node);
+  }
+
+  void fill_initialize(size_type n, const value_type& x) {
+    head.next = 0;
+    __STL_TRY {
+      _insert_after_fill(&head, n, x);
+    }
+    __STL_UNWIND(clear());
+  }    
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  void range_initialize(InputIterator first, InputIterator last) {
+    head.next = 0;
+    __STL_TRY {
+      _insert_after_range(&head, first, last);
+    }
+    __STL_UNWIND(clear());
+  }
+#else /* __STL_MEMBER_TEMPLATES */
+  void range_initialize(const value_type* first, const value_type* last) {
+    head.next = 0;
+    __STL_TRY {
+      _insert_after_range(&head, first, last);
+    }
+    __STL_UNWIND(clear());
+  }
+  void range_initialize(const_iterator first, const_iterator last) {
+    head.next = 0;
+    __STL_TRY {
+      _insert_after_range(&head, first, last);
+    }
+    __STL_UNWIND(clear());
+  }
+#endif /* __STL_MEMBER_TEMPLATES */
+
+private:
+  list_node_base head;
+
+public:
+  slist() { head.next = 0; }
+
+  slist(size_type n, const value_type& x) { fill_initialize(n, x); }
+  slist(int n, const value_type& x) { fill_initialize(n, x); }
+  slist(long n, const value_type& x) { fill_initialize(n, x); }
+  explicit slist(size_type n) { fill_initialize(n, value_type()); }
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  slist(InputIterator first, InputIterator last) {
+    range_initialize(first, last);
+  }
+
+#else /* __STL_MEMBER_TEMPLATES */
+  slist(const_iterator first, const_iterator last) {
+    range_initialize(first, last);
+  }
+  slist(const value_type* first, const value_type* last) {
+    range_initialize(first, last);
+  }
+#endif /* __STL_MEMBER_TEMPLATES */
+
+  slist(const slist& L) { range_initialize(L.begin(), L.end()); }
+
+  slist& operator= (const slist& L);
+
+  ~slist() { clear(); }
+
+public:
+
+  iterator begin() { return iterator((list_node*)head.next); }
+  const_iterator begin() const { return const_iterator((list_node*)head.next);}
+
+  iterator end() { return iterator(0); }
+  const_iterator end() const { return const_iterator(0); }
+
+  size_type size() const { return __slist_size(head.next); }
+  
+  size_type max_size() const { return size_type(-1); }
+
+  bool empty() const { return head.next == 0; }
+
+  void swap(slist& L)
+  {
+    list_node_base* tmp = head.next;
+    head.next = L.head.next;
+    L.head.next = tmp;
+  }
+
+public:
+  friend bool operator== __STL_NULL_TMPL_ARGS(const slist<T, Alloc>& L1,
+                                              const slist<T, Alloc>& L2);
+
+public:
+
+  reference front() { return ((list_node*) head.next)->data; }
+  const_reference front() const { return ((list_node*) head.next)->data; }
+  void push_front(const value_type& x)   {
+    __slist_make_link(&head, create_node(x));
+  }
+  void pop_front() {
+    list_node* node = (list_node*) head.next;
+    head.next = node->next;
+    destroy_node(node);
+  }
+
+  iterator previous(const_iterator pos) {
+    return iterator((list_node*) __slist_previous(&head, pos.node));
+  }
+  const_iterator previous(const_iterator pos) const {
+    return const_iterator((list_node*) __slist_previous(&head, pos.node));
+  }
+
+private:
+  list_node* _insert_after(list_node_base* pos, const value_type& x) {
+    return (list_node*) (__slist_make_link(pos, create_node(x)));
+  }
+
+  void _insert_after_fill(list_node_base* pos,
+                          size_type n, const value_type& x) {
+    for (size_type i = 0; i < n; ++i)
+      pos = __slist_make_link(pos, create_node(x));
+  }
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InIter>
+  void _insert_after_range(list_node_base* pos, InIter first, InIter last) {
+    while (first != last) {
+      pos = __slist_make_link(pos, create_node(*first));
+      ++first;
+    }
+  }
+#else /* __STL_MEMBER_TEMPLATES */
+  void _insert_after_range(list_node_base* pos,
+                           const_iterator first, const_iterator last) {
+    while (first != last) {
+      pos = __slist_make_link(pos, create_node(*first));
+      ++first;
+    }
+  }
+  void _insert_after_range(list_node_base* pos,
+                           const value_type* first, const value_type* last) {
+    while (first != last) {
+      pos = __slist_make_link(pos, create_node(*first));
+      ++first;
+    }
+  }
+#endif /* __STL_MEMBER_TEMPLATES */
+
+  list_node_base* erase_after(list_node_base* pos) {
+    list_node* next = (list_node*) (pos->next);
+    list_node_base* next_next = next->next;
+    pos->next = next_next;
+    destroy_node(next);
+    return next_next;
+  }
+   
+  list_node_base* erase_after(list_node_base* before_first,
+                              list_node_base* last_node) {
+    list_node* cur = (list_node*) (before_first->next);
+    while (cur != last_node) {
+      list_node* tmp = cur;
+      cur = (list_node*) cur->next;
+      destroy_node(tmp);
+    }
+    before_first->next = last_node;
+    return last_node;
+  }
+
+
+public:
+
+  iterator insert_after(iterator pos, const value_type& x) {
+    return iterator(_insert_after(pos.node, x));
+  }
+
+  iterator insert_after(iterator pos) {
+    return insert_after(pos, value_type());
+  }
+
+  void insert_after(iterator pos, size_type n, const value_type& x) {
+    _insert_after_fill(pos.node, n, x);
+  }
+  void insert_after(iterator pos, int n, const value_type& x) {
+    _insert_after_fill(pos.node, (size_type) n, x);
+  }
+  void insert_after(iterator pos, long n, const value_type& x) {
+    _insert_after_fill(pos.node, (size_type) n, x);
+  }
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InIter>
+  void insert_after(iterator pos, InIter first, InIter last) {
+    _insert_after_range(pos.node, first, last);
+  }
+#else /* __STL_MEMBER_TEMPLATES */
+  void insert_after(iterator pos, const_iterator first, const_iterator last) {
+    _insert_after_range(pos.node, first, last);
+  }
+  void insert_after(iterator pos,
+                    const value_type* first, const value_type* last) {
+    _insert_after_range(pos.node, first, last);
+  }
+#endif /* __STL_MEMBER_TEMPLATES */
+
+  iterator insert(iterator pos, const value_type& x) {
+    return iterator(_insert_after(__slist_previous(&head, pos.node), x));
+  }
+
+  iterator insert(iterator pos) {
+    return iterator(_insert_after(__slist_previous(&head, pos.node),
+                                  value_type()));
+  }
+
+  void insert(iterator pos, size_type n, const value_type& x) {
+    _insert_after_fill(__slist_previous(&head, pos.node), n, x);
+  } 
+  void insert(iterator pos, int n, const value_type& x) {
+    _insert_after_fill(__slist_previous(&head, pos.node), (size_type) n, x);
+  } 
+  void insert(iterator pos, long n, const value_type& x) {
+    _insert_after_fill(__slist_previous(&head, pos.node), (size_type) n, x);
+  } 
+    
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InIter>
+  void insert(iterator pos, InIter first, InIter last) {
+    _insert_after_range(__slist_previous(&head, pos.node), first, last);
+  }
+#else /* __STL_MEMBER_TEMPLATES */
+  void insert(iterator pos, const_iterator first, const_iterator last) {
+    _insert_after_range(__slist_previous(&head, pos.node), first, last);
+  }
+  void insert(iterator pos, const value_type* first, const value_type* last) {
+    _insert_after_range(__slist_previous(&head, pos.node), first, last);
+  }
+#endif /* __STL_MEMBER_TEMPLATES */
+
+
+public:
+  iterator erase_after(iterator pos) {
+    return iterator((list_node*)erase_after(pos.node));
+  }
+  iterator erase_after(iterator before_first, iterator last) {
+    return iterator((list_node*)erase_after(before_first.node, last.node));
+  }
+
+  iterator erase(iterator pos) {
+    return (list_node*) erase_after(__slist_previous(&head, pos.node));
+  }
+  iterator erase(iterator first, iterator last) {
+    return (list_node*) erase_after(__slist_previous(&head, first.node),
+                                    last.node);
+  }
+
+  void resize(size_type new_size, const T& x);
+  void resize(size_type new_size) { resize(new_size, T()); }
+  void clear() { erase_after(&head, 0); }
+
+public:
+  // Moves the range [before_first + 1, before_last + 1) to *this,
+  //  inserting it immediately after pos.  This is constant time.
+  void splice_after(iterator pos, 
+                    iterator before_first, iterator before_last)
+  {
+    if (before_first != before_last) 
+      __slist_splice_after(pos.node, before_first.node, before_last.node);
+  }
+
+  // Moves the element that follows prev to *this, inserting it immediately
+  //  after pos.  This is constant time.
+  void splice_after(iterator pos, iterator prev)
+  {
+    __slist_splice_after(pos.node, prev.node, prev.node->next);
+  }
+
+
+  // Linear in distance(begin(), pos), and linear in L.size().
+  void splice(iterator pos, slist& L) {
+    if (L.head.next)
+      __slist_splice_after(__slist_previous(&head, pos.node),
+                           &L.head,
+                           __slist_previous(&L.head, 0));
+  }
+
+  // Linear in distance(begin(), pos), and in distance(L.begin(), i).
+  void splice(iterator pos, slist& L, iterator i) {
+    __slist_splice_after(__slist_previous(&head, pos.node),
+                         __slist_previous(&L.head, i.node),
+                         i.node);
+  }
+
+  // Linear in distance(begin(), pos), in distance(L.begin(), first),
+  // and in distance(first, last).
+  void splice(iterator pos, slist& L, iterator first, iterator last)
+  {
+    if (first != last)
+      __slist_splice_after(__slist_previous(&head, pos.node),
+                           __slist_previous(&L.head, first.node),
+                           __slist_previous(first.node, last.node));
+  }
+
+public:
+  void reverse() { if (head.next) head.next = __slist_reverse(head.next); }
+
+  void remove(const T& val); 
+  void unique(); 
+  void merge(slist& L);
+  void sort();     
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class Predicate> void remove_if(Predicate pred);
+  template <class BinaryPredicate> void unique(BinaryPredicate pred); 
+  template <class StrictWeakOrdering> void merge(slist&, StrictWeakOrdering); 
+  template <class StrictWeakOrdering> void sort(StrictWeakOrdering comp); 
+#endif /* __STL_MEMBER_TEMPLATES */
+};
+
+template <class T, class Alloc>
+slist<T, Alloc>& slist<T,Alloc>::operator=(const slist<T, Alloc>& L)
+{
+  if (&L != this) {
+    list_node_base* p1 = &head;
+    list_node* n1 = (list_node*) head.next;
+    const list_node* n2 = (const list_node*) L.head.next;
+    while (n1 && n2) {
+      n1->data = n2->data;
+      p1 = n1;
+      n1 = (list_node*) n1->next;
+      n2 = (const list_node*) n2->next;
+    }
+    if (n2 == 0)
+      erase_after(p1, 0);
+    else
+      _insert_after_range(p1,
+                          const_iterator((list_node*)n2), const_iterator(0));
+  }
+  return *this;
+} 
+
+template <class T, class Alloc>
+bool operator==(const slist<T, Alloc>& L1, const slist<T, Alloc>& L2)
+{
+  typedef typename slist<T,Alloc>::list_node list_node;
+  list_node* n1 = (list_node*) L1.head.next;
+  list_node* n2 = (list_node*) L2.head.next;
+  while (n1 && n2 && n1->data == n2->data) {
+    n1 = (list_node*) n1->next;
+    n2 = (list_node*) n2->next;
+  }
+  return n1 == 0 && n2 == 0;
+}
+
+template <class T, class Alloc>
+inline bool operator<(const slist<T, Alloc>& L1, const slist<T, Alloc>& L2)
+{
+  return lexicographical_compare(L1.begin(), L1.end(), L2.begin(), L2.end());
+}
+
+#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class T, class Alloc>
+inline void swap(slist<T, Alloc>& x, slist<T, Alloc>& y) {
+  x.swap(y);
+}
+
+#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
+
+
+template <class T, class Alloc>
+void slist<T, Alloc>::resize(size_type len, const T& x)
+{
+  list_node_base* cur = &head;
+  while (cur->next != 0 && len > 0) {
+    --len;
+    cur = cur->next;
+  }
+  if (cur->next) 
+    erase_after(cur, 0);
+  else
+    _insert_after_fill(cur, len, x);
+}
+
+template <class T, class Alloc>
+void slist<T,Alloc>::remove(const T& val)
+{
+  list_node_base* cur = &head;
+  while (cur && cur->next) {
+    if (((list_node*) cur->next)->data == val)
+      erase_after(cur);
+    else
+      cur = cur->next;
+  }
+}
+
+template <class T, class Alloc> 
+void slist<T,Alloc>::unique()
+{
+  list_node_base* cur = head.next;
+  if (cur) {
+    while (cur->next) {
+      if (((list_node*)cur)->data == ((list_node*)(cur->next))->data)
+        erase_after(cur);
+      else
+        cur = cur->next;
+    }
+  }
+}
+
+template <class T, class Alloc>
+void slist<T,Alloc>::merge(slist<T,Alloc>& L)
+{
+  list_node_base* n1 = &head;
+  while (n1->next && L.head.next) {
+    if (((list_node*) L.head.next)->data < ((list_node*) n1->next)->data) 
+      __slist_splice_after(n1, &L.head, L.head.next);
+    n1 = n1->next;
+  }
+  if (L.head.next) {
+    n1->next = L.head.next;
+    L.head.next = 0;
+  }
+}
+
+template <class T, class Alloc>
+void slist<T,Alloc>::sort()
+{
+  if (head.next && head.next->next) {
+    slist carry;
+    slist counter[64];
+    int fill = 0;
+    while (!empty()) {
+      __slist_splice_after(&carry.head, &head, head.next);
+      int i = 0;
+      while (i < fill && !counter[i].empty()) {
+        counter[i].merge(carry);
+        carry.swap(counter[i]);
+        ++i;
+      }
+      carry.swap(counter[i]);
+      if (i == fill)
+        ++fill;
+    }
+
+    for (int i = 1; i < fill; ++i)
+      counter[i].merge(counter[i-1]);
+    this->swap(counter[fill-1]);
+  }
+}
+
+#ifdef __STL_MEMBER_TEMPLATES
+
+template <class T, class Alloc> 
+template <class Predicate> void slist<T,Alloc>::remove_if(Predicate pred)
+{
+  list_node_base* cur = &head;
+  while (cur->next) {
+    if (pred(((list_node*) cur->next)->data))
+      erase_after(cur);
+    else
+      cur = cur->next;
+  }
+}
+
+template <class T, class Alloc> template <class BinaryPredicate> 
+void slist<T,Alloc>::unique(BinaryPredicate pred)
+{
+  list_node* cur = (list_node*) head.next;
+  if (cur) {
+    while (cur->next) {
+      if (pred(((list_node*)cur)->data, ((list_node*)(cur->next))->data))
+        erase_after(cur);
+      else
+        cur = (list_node*) cur->next;
+    }
+  }
+}
+
+template <class T, class Alloc> template <class StrictWeakOrdering>
+void slist<T,Alloc>::merge(slist<T,Alloc>& L, StrictWeakOrdering comp)
+{
+  list_node_base* n1 = &head;
+  while (n1->next && L.head.next) {
+    if (comp(((list_node*) L.head.next)->data,
+             ((list_node*) n1->next)->data))
+      __slist_splice_after(n1, &L.head, L.head.next);
+    n1 = n1->next;
+  }
+  if (L.head.next) {
+    n1->next = L.head.next;
+    L.head.next = 0;
+  }
+}
+
+template <class T, class Alloc> template <class StrictWeakOrdering> 
+void slist<T,Alloc>::sort(StrictWeakOrdering comp)
+{
+  if (head.next && head.next->next) {
+    slist carry;
+    slist counter[64];
+    int fill = 0;
+    while (!empty()) {
+      __slist_splice_after(&carry.head, &head, head.next);
+      int i = 0;
+      while (i < fill && !counter[i].empty()) {
+        counter[i].merge(carry, comp);
+        carry.swap(counter[i]);
+        ++i;
+      }
+      carry.swap(counter[i]);
+      if (i == fill)
+        ++fill;
+    }
+
+    for (int i = 1; i < fill; ++i)
+      counter[i].merge(counter[i-1], comp);
+    this->swap(counter[fill-1]);
+  }
+}
+
+#endif /* __STL_MEMBER_TEMPLATES */
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1174
+#endif
+
+__STL_END_NAMESPACE 
+
+#endif /* __SGI_STL_INTERNAL_SLIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_stack.h b/libstdc++/stl/stl_stack.h
new file mode 100644 (file)
index 0000000..d380e81
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_STACK_H
+#define __SGI_STL_INTERNAL_STACK_H
+
+__STL_BEGIN_NAMESPACE
+
+#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
+template <class T, class Sequence = deque<T> >
+#else
+template <class T, class Sequence>
+#endif
+class stack {
+  friend bool operator== __STL_NULL_TMPL_ARGS (const stack&, const stack&);
+  friend bool operator< __STL_NULL_TMPL_ARGS (const stack&, const stack&);
+public:
+  typedef typename Sequence::value_type value_type;
+  typedef typename Sequence::size_type size_type;
+  typedef typename Sequence::reference reference;
+  typedef typename Sequence::const_reference const_reference;
+protected:
+  Sequence c;
+public:
+  bool empty() const { return c.empty(); }
+  size_type size() const { return c.size(); }
+  reference top() { return c.back(); }
+  const_reference top() const { return c.back(); }
+  void push(const value_type& x) { c.push_back(x); }
+  void pop() { c.pop_back(); }
+};
+
+template <class T, class Sequence>
+bool operator==(const stack<T, Sequence>& x, const stack<T, Sequence>& y) {
+  return x.c == y.c;
+}
+
+template <class T, class Sequence>
+bool operator<(const stack<T, Sequence>& x, const stack<T, Sequence>& y) {
+  return x.c < y.c;
+}
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_STACK_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_tempbuf.h b/libstdc++/stl/stl_tempbuf.h
new file mode 100644 (file)
index 0000000..5c971e6
--- /dev/null
@@ -0,0 +1,123 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_TEMPBUF_H
+#define __SGI_STL_INTERNAL_TEMPBUF_H
+
+
+__STL_BEGIN_NAMESPACE
+
+template <class T>
+pair<T*, ptrdiff_t> get_temporary_buffer(ptrdiff_t len, T*) {
+  if (len > ptrdiff_t(INT_MAX / sizeof(T)))
+    len = INT_MAX / sizeof(T);
+
+  while (len > 0) {
+    T* tmp = (T*) malloc((size_t)len * sizeof(T));
+    if (tmp != 0)
+      return pair<T*, ptrdiff_t>(tmp, len);
+    len /= 2;
+  }
+
+  return pair<T*, ptrdiff_t>((T*)0, 0);
+}
+
+template <class T>
+void return_temporary_buffer(T* p) {
+  free(p);
+}
+
+template <class ForwardIterator,
+          class T 
+#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
+                  = iterator_traits<ForwardIterator>::value_type 
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+         >
+class temporary_buffer {
+private:
+  ptrdiff_t original_len;
+  ptrdiff_t len;
+  T* buffer;
+
+  void allocate_buffer() {
+    original_len = len;
+    buffer = 0;
+
+    if (len > (ptrdiff_t)(INT_MAX / sizeof(T)))
+      len = INT_MAX / sizeof(T);
+
+    while (len > 0) {
+      buffer = (T*) malloc(len * sizeof(T));
+      if (buffer)
+        break;
+      len /= 2;
+    }
+  }
+
+  void initialize_buffer(const T&, __true_type) {}
+  void initialize_buffer(const T& val, __false_type) {
+    uninitialized_fill_n(buffer, len, val);
+  }
+
+public:
+  ptrdiff_t size() const { return len; }
+  ptrdiff_t requested_size() const { return original_len; }
+  T* begin() { return buffer; }
+  T* end() { return buffer + len; }
+
+  temporary_buffer(ForwardIterator first, ForwardIterator last) {
+    __STL_TRY {
+      len = 0;
+      distance(first, last, len);
+      allocate_buffer();
+      if (len > 0)
+        initialize_buffer(*first,
+                          __type_traits<T>::has_trivial_default_constructor());
+    }
+    __STL_UNWIND(free(buffer); buffer = 0; len = 0);
+  }
+  ~temporary_buffer() {  
+    destroy(buffer, buffer + len);
+    free(buffer);
+  }
+
+private:
+  temporary_buffer(const temporary_buffer&) {}
+  void operator=(const temporary_buffer&) {}
+};
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_TEMPBUF_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_tree.h b/libstdc++/stl/stl_tree.h
new file mode 100644 (file)
index 0000000..55a6c0e
--- /dev/null
@@ -0,0 +1,1099 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_TREE_H
+#define __SGI_STL_INTERNAL_TREE_H
+
+/*
+
+Red-black tree class, designed for use in implementing STL
+associative containers (set, multiset, map, and multimap). The
+insertion and deletion algorithms are based on those in Cormen,
+Leiserson, and Rivest, Introduction to Algorithms (MIT Press, 1990),
+except that
+
+(1) the header cell is maintained with links not only to the root
+but also to the leftmost node of the tree, to enable constant time
+begin(), and to the rightmost node of the tree, to enable linear time
+performance when used with the generic set algorithms (set_union,
+etc.);
+
+(2) when a node being deleted has two children its successor node is
+relinked into its place, rather than copied, so that the only
+iterators invalidated are those referring to the deleted node.
+
+*/
+
+#include <stl_algobase.h>
+#include <stl_alloc.h>
+#include <stl_construct.h>
+#include <stl_function.h>
+
+__STL_BEGIN_NAMESPACE 
+
+typedef bool __rb_tree_color_type;
+const __rb_tree_color_type __rb_tree_red = false;
+const __rb_tree_color_type __rb_tree_black = true;
+
+struct __rb_tree_node_base
+{
+  typedef __rb_tree_color_type color_type;
+  typedef __rb_tree_node_base* base_ptr;
+
+  color_type color; 
+  base_ptr parent;
+  base_ptr left;
+  base_ptr right;
+
+  static base_ptr minimum(base_ptr x)
+  {
+    while (x->left != 0) x = x->left;
+    return x;
+  }
+
+  static base_ptr maximum(base_ptr x)
+  {
+    while (x->right != 0) x = x->right;
+    return x;
+  }
+};
+
+template <class Value>
+struct __rb_tree_node : public __rb_tree_node_base
+{
+  typedef __rb_tree_node<Value>* link_type;
+  Value value_field;
+};
+
+
+struct __rb_tree_base_iterator
+{
+  typedef __rb_tree_node_base::base_ptr base_ptr;
+  typedef bidirectional_iterator_tag iterator_category;
+  typedef ptrdiff_t difference_type;
+  base_ptr node;
+
+  void increment()
+  {
+    if (node->right != 0) {
+      node = node->right;
+      while (node->left != 0)
+        node = node->left;
+    }
+    else {
+      base_ptr y = node->parent;
+      while (node == y->right) {
+        node = y;
+        y = y->parent;
+      }
+      if (node->right != y)
+        node = y;
+    }
+  }
+
+  void decrement()
+  {
+    if (node->color == __rb_tree_red &&
+        node->parent->parent == node)
+      node = node->right;
+    else if (node->left != 0) {
+      base_ptr y = node->left;
+      while (y->right != 0)
+        y = y->right;
+      node = y;
+    }
+    else {
+      base_ptr y = node->parent;
+      while (node == y->left) {
+        node = y;
+        y = y->parent;
+      }
+      node = y;
+    }
+  }
+};
+
+template <class Value, class Ref, class Ptr>
+struct __rb_tree_iterator : public __rb_tree_base_iterator
+{
+  typedef Value value_type;
+  typedef Ref reference;
+  typedef Ptr pointer;
+  typedef __rb_tree_iterator<Value, Value&, Value*>             iterator;
+  typedef __rb_tree_iterator<Value, const Value&, const Value*> const_iterator;
+  typedef __rb_tree_iterator<Value, Ref, Ptr>                   self;
+  typedef __rb_tree_node<Value>* link_type;
+
+  __rb_tree_iterator() {}
+  __rb_tree_iterator(link_type x) { node = x; }
+  __rb_tree_iterator(const iterator& it) { node = it.node; }
+
+  reference operator*() const { return link_type(node)->value_field; }
+#ifndef __SGI_STL_NO_ARROW_OPERATOR
+  pointer operator->() const { return &(operator*()); }
+#endif /* __SGI_STL_NO_ARROW_OPERATOR */
+
+  self& operator++() { increment(); return *this; }
+  self operator++(int) {
+    self tmp = *this;
+    increment();
+    return tmp;
+  }
+    
+  self& operator--() { decrement(); return *this; }
+  self operator--(int) {
+    self tmp = *this;
+    decrement();
+    return tmp;
+  }
+};
+
+inline bool operator==(const __rb_tree_base_iterator& x,
+                       const __rb_tree_base_iterator& y) {
+  return x.node == y.node;
+}
+
+inline bool operator!=(const __rb_tree_base_iterator& x,
+                       const __rb_tree_base_iterator& y) {
+  return x.node != y.node;
+}
+
+#ifndef __STL_CLASS_PARTIAL_SPECIALIZATION
+
+inline bidirectional_iterator_tag
+iterator_category(const __rb_tree_base_iterator&) {
+  return bidirectional_iterator_tag();
+}
+
+inline __rb_tree_base_iterator::difference_type*
+distance_type(const __rb_tree_base_iterator&) {
+  return (__rb_tree_base_iterator::difference_type*) 0;
+}
+
+template <class Value, class Ref, class Ptr>
+inline Value* value_type(const __rb_tree_iterator<Value, Ref, Ptr>&) {
+  return (Value*) 0;
+}
+
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+
+inline void 
+__rb_tree_rotate_left(__rb_tree_node_base* x, __rb_tree_node_base*& root)
+{
+  __rb_tree_node_base* y = x->right;
+  x->right = y->left;
+  if (y->left !=0)
+    y->left->parent = x;
+  y->parent = x->parent;
+
+  if (x == root)
+    root = y;
+  else if (x == x->parent->left)
+    x->parent->left = y;
+  else
+    x->parent->right = y;
+  y->left = x;
+  x->parent = y;
+}
+
+inline void 
+__rb_tree_rotate_right(__rb_tree_node_base* x, __rb_tree_node_base*& root)
+{
+  __rb_tree_node_base* y = x->left;
+  x->left = y->right;
+  if (y->right != 0)
+    y->right->parent = x;
+  y->parent = x->parent;
+
+  if (x == root)
+    root = y;
+  else if (x == x->parent->right)
+    x->parent->right = y;
+  else
+    x->parent->left = y;
+  y->right = x;
+  x->parent = y;
+}
+
+inline void 
+__rb_tree_rebalance(__rb_tree_node_base* x, __rb_tree_node_base*& root)
+{
+  x->color = __rb_tree_red;
+  while (x != root && x->parent->color == __rb_tree_red) {
+    if (x->parent == x->parent->parent->left) {
+      __rb_tree_node_base* y = x->parent->parent->right;
+      if (y && y->color == __rb_tree_red) {
+        x->parent->color = __rb_tree_black;
+        y->color = __rb_tree_black;
+        x->parent->parent->color = __rb_tree_red;
+        x = x->parent->parent;
+      }
+      else {
+        if (x == x->parent->right) {
+          x = x->parent;
+          __rb_tree_rotate_left(x, root);
+        }
+        x->parent->color = __rb_tree_black;
+        x->parent->parent->color = __rb_tree_red;
+        __rb_tree_rotate_right(x->parent->parent, root);
+      }
+    }
+    else {
+      __rb_tree_node_base* y = x->parent->parent->left;
+      if (y && y->color == __rb_tree_red) {
+        x->parent->color = __rb_tree_black;
+        y->color = __rb_tree_black;
+        x->parent->parent->color = __rb_tree_red;
+        x = x->parent->parent;
+      }
+      else {
+        if (x == x->parent->left) {
+          x = x->parent;
+          __rb_tree_rotate_right(x, root);
+        }
+        x->parent->color = __rb_tree_black;
+        x->parent->parent->color = __rb_tree_red;
+        __rb_tree_rotate_left(x->parent->parent, root);
+      }
+    }
+  }
+  root->color = __rb_tree_black;
+}
+
+inline __rb_tree_node_base*
+__rb_tree_rebalance_for_erase(__rb_tree_node_base* z,
+                              __rb_tree_node_base*& root,
+                              __rb_tree_node_base*& leftmost,
+                              __rb_tree_node_base*& rightmost)
+{
+  __rb_tree_node_base* y = z;
+  __rb_tree_node_base* x = 0;
+  __rb_tree_node_base* x_parent = 0;
+  if (y->left == 0)             // z has at most one non-null child. y == z.
+    x = y->right;               // x might be null.
+  else
+    if (y->right == 0)          // z has exactly one non-null child.  y == z.
+      x = y->left;              // x is not null.
+    else {                      // z has two non-null children.  Set y to
+      y = y->right;             //   z's successor.  x might be null.
+      while (y->left != 0)
+        y = y->left;
+      x = y->right;
+    }
+  if (y != z) {                 // relink y in place of z.  y is z's successor
+    z->left->parent = y; 
+    y->left = z->left;
+    if (y != z->right) {
+      x_parent = y->parent;
+      if (x) x->parent = y->parent;
+      y->parent->left = x;      // y must be a left child
+      y->right = z->right;
+      z->right->parent = y;
+    }
+    else
+      x_parent = y;  
+    if (root == z)
+      root = y;
+    else if (z->parent->left == z)
+      z->parent->left = y;
+    else 
+      z->parent->right = y;
+    y->parent = z->parent;
+    __STD::swap(y->color, z->color);
+    y = z;
+    // y now points to node to be actually deleted
+  }
+  else {                        // y == z
+    x_parent = y->parent;
+    if (x) x->parent = y->parent;   
+    if (root == z)
+      root = x;
+    else 
+      if (z->parent->left == z)
+        z->parent->left = x;
+      else
+        z->parent->right = x;
+    if (leftmost == z) 
+      if (z->right == 0)        // z->left must be null also
+        leftmost = z->parent;
+    // makes leftmost == header if z == root
+      else
+        leftmost = __rb_tree_node_base::minimum(x);
+    if (rightmost == z)  
+      if (z->left == 0)         // z->right must be null also
+        rightmost = z->parent;  
+    // makes rightmost == header if z == root
+      else                      // x == z->left
+        rightmost = __rb_tree_node_base::maximum(x);
+  }
+  if (y->color != __rb_tree_red) { 
+    while (x != root && (x == 0 || x->color == __rb_tree_black))
+      if (x == x_parent->left) {
+        __rb_tree_node_base* w = x_parent->right;
+        if (w->color == __rb_tree_red) {
+          w->color = __rb_tree_black;
+          x_parent->color = __rb_tree_red;
+          __rb_tree_rotate_left(x_parent, root);
+          w = x_parent->right;
+        }
+        if ((w->left == 0 || w->left->color == __rb_tree_black) &&
+            (w->right == 0 || w->right->color == __rb_tree_black)) {
+          w->color = __rb_tree_red;
+          x = x_parent;
+          x_parent = x_parent->parent;
+        } else {
+          if (w->right == 0 || w->right->color == __rb_tree_black) {
+            if (w->left) w->left->color = __rb_tree_black;
+            w->color = __rb_tree_red;
+            __rb_tree_rotate_right(w, root);
+            w = x_parent->right;
+          }
+          w->color = x_parent->color;
+          x_parent->color = __rb_tree_black;
+          if (w->right) w->right->color = __rb_tree_black;
+          __rb_tree_rotate_left(x_parent, root);
+          break;
+        }
+      } else {                  // same as above, with right <-> left.
+        __rb_tree_node_base* w = x_parent->left;
+        if (w->color == __rb_tree_red) {
+          w->color = __rb_tree_black;
+          x_parent->color = __rb_tree_red;
+          __rb_tree_rotate_right(x_parent, root);
+          w = x_parent->left;
+        }
+        if ((w->right == 0 || w->right->color == __rb_tree_black) &&
+            (w->left == 0 || w->left->color == __rb_tree_black)) {
+          w->color = __rb_tree_red;
+          x = x_parent;
+          x_parent = x_parent->parent;
+        } else {
+          if (w->left == 0 || w->left->color == __rb_tree_black) {
+            if (w->right) w->right->color = __rb_tree_black;
+            w->color = __rb_tree_red;
+            __rb_tree_rotate_left(w, root);
+            w = x_parent->left;
+          }
+          w->color = x_parent->color;
+          x_parent->color = __rb_tree_black;
+          if (w->left) w->left->color = __rb_tree_black;
+          __rb_tree_rotate_right(x_parent, root);
+          break;
+        }
+      }
+    if (x) x->color = __rb_tree_black;
+  }
+  return y;
+}
+
+template <class Key, class Value, class KeyOfValue, class Compare,
+          class Alloc = alloc>
+class rb_tree {
+protected:
+  typedef void* void_pointer;
+  typedef __rb_tree_node_base* base_ptr;
+  typedef __rb_tree_node<Value> rb_tree_node;
+  typedef simple_alloc<rb_tree_node, Alloc> rb_tree_node_allocator;
+  typedef __rb_tree_color_type color_type;
+public:
+  typedef Key key_type;
+  typedef Value value_type;
+  typedef value_type* pointer;
+  typedef const value_type* const_pointer;
+  typedef value_type& reference;
+  typedef const value_type& const_reference;
+  typedef rb_tree_node* link_type;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type;
+protected:
+  link_type get_node() { return rb_tree_node_allocator::allocate(); }
+  void put_node(link_type p) { rb_tree_node_allocator::deallocate(p); }
+
+  link_type create_node(const value_type& x) {
+    link_type tmp = get_node();
+    __STL_TRY {
+      construct(&tmp->value_field, x);
+    }
+    __STL_UNWIND(put_node(tmp));
+    return tmp;
+  }
+
+  link_type clone_node(link_type x) {
+    link_type tmp = create_node(x->value_field);
+    tmp->color = x->color;
+    tmp->left = 0;
+    tmp->right = 0;
+    return tmp;
+  }
+
+  void destroy_node(link_type p) {
+    destroy(&p->value_field);
+    put_node(p);
+  }
+
+protected:
+  size_type node_count; // keeps track of size of tree
+  link_type header;  
+  Compare key_compare;
+
+  link_type& root() const { return (link_type&) header->parent; }
+  link_type& leftmost() const { return (link_type&) header->left; }
+  link_type& rightmost() const { return (link_type&) header->right; }
+
+  static link_type& left(link_type x) { return (link_type&)(x->left); }
+  static link_type& right(link_type x) { return (link_type&)(x->right); }
+  static link_type& parent(link_type x) { return (link_type&)(x->parent); }
+  static reference value(link_type x) { return x->value_field; }
+  static const Key& key(link_type x) { return KeyOfValue()(value(x)); }
+  static color_type& color(link_type x) { return (color_type&)(x->color); }
+
+  static link_type& left(base_ptr x) { return (link_type&)(x->left); }
+  static link_type& right(base_ptr x) { return (link_type&)(x->right); }
+  static link_type& parent(base_ptr x) { return (link_type&)(x->parent); }
+  static reference value(base_ptr x) { return ((link_type)x)->value_field; }
+  static const Key& key(base_ptr x) { return KeyOfValue()(value(link_type(x)));} 
+  static color_type& color(base_ptr x) { return (color_type&)(link_type(x)->color); }
+
+  static link_type minimum(link_type x) { 
+    return (link_type)  __rb_tree_node_base::minimum(x);
+  }
+  static link_type maximum(link_type x) {
+    return (link_type) __rb_tree_node_base::maximum(x);
+  }
+
+public:
+  typedef __rb_tree_iterator<value_type, reference, pointer> iterator;
+  typedef __rb_tree_iterator<value_type, const_reference, const_pointer> 
+          const_iterator;
+
+#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
+  typedef reverse_iterator<const_iterator> const_reverse_iterator;
+  typedef reverse_iterator<iterator> reverse_iterator;
+#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+  typedef reverse_bidirectional_iterator<iterator, value_type, reference,
+                                         difference_type>
+          reverse_iterator; 
+  typedef reverse_bidirectional_iterator<const_iterator, value_type,
+                                         const_reference, difference_type>
+          const_reverse_iterator;
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */ 
+private:
+  iterator __insert(base_ptr x, base_ptr y, const value_type& v);
+  link_type __copy(link_type x, link_type p);
+  void __erase(link_type x);
+  void init() {
+    header = get_node();
+    color(header) = __rb_tree_red; // used to distinguish header from 
+                                   // root, in iterator.operator++
+    root() = 0;
+    leftmost() = header;
+    rightmost() = header;
+  }
+public:
+                                // allocation/deallocation
+  rb_tree(const Compare& comp = Compare())
+    : node_count(0), key_compare(comp) { init(); }
+
+  rb_tree(const rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& x) 
+    : node_count(0), key_compare(x.key_compare)
+  { 
+    header = get_node();
+    color(header) = __rb_tree_red;
+    if (x.root() == 0) {
+      root() = 0;
+      leftmost() = header;
+      rightmost() = header;
+    }
+    else {
+      __STL_TRY {
+        root() = __copy(x.root(), header);
+      }
+      __STL_UNWIND(put_node(header));
+      leftmost() = minimum(root());
+      rightmost() = maximum(root());
+    }
+    node_count = x.node_count;
+  }
+  ~rb_tree() {
+    clear();
+    put_node(header);
+  }
+  rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& 
+  operator=(const rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& x);
+
+public:    
+                                // accessors:
+  Compare key_comp() const { return key_compare; }
+  iterator begin() { return leftmost(); }
+  const_iterator begin() const { return leftmost(); }
+  iterator end() { return header; }
+  const_iterator end() const { return header; }
+  reverse_iterator rbegin() { return reverse_iterator(end()); }
+  const_reverse_iterator rbegin() const { 
+    return const_reverse_iterator(end()); 
+  }
+  reverse_iterator rend() { return reverse_iterator(begin()); }
+  const_reverse_iterator rend() const { 
+    return const_reverse_iterator(begin());
+  } 
+  bool empty() const { return node_count == 0; }
+  size_type size() const { return node_count; }
+  size_type max_size() const { return size_type(-1); }
+
+  void swap(rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& t) {
+    __STD::swap(header, t.header);
+    __STD::swap(node_count, t.node_count);
+    __STD::swap(key_compare, t.key_compare);
+  }
+    
+public:
+                                // insert/erase
+  pair<iterator,bool> insert_unique(const value_type& x);
+  iterator insert_equal(const value_type& x);
+
+  iterator insert_unique(iterator position, const value_type& x);
+  iterator insert_equal(iterator position, const value_type& x);
+
+#ifdef __STL_MEMBER_TEMPLATES  
+  template <class InputIterator>
+  void insert_unique(InputIterator first, InputIterator last);
+  template <class InputIterator>
+  void insert_equal(InputIterator first, InputIterator last);
+#else /* __STL_MEMBER_TEMPLATES */
+  void insert_unique(const_iterator first, const_iterator last);
+  void insert_unique(const value_type* first, const value_type* last);
+  void insert_equal(const_iterator first, const_iterator last);
+  void insert_equal(const value_type* first, const value_type* last);
+#endif /* __STL_MEMBER_TEMPLATES */
+
+  void erase(iterator position);
+  size_type erase(const key_type& x);
+  void erase(iterator first, iterator last);
+  void erase(const key_type* first, const key_type* last);
+  void clear() {
+    if (node_count != 0) {
+      __erase(root());
+      leftmost() = header;
+      root() = 0;
+      rightmost() = header;
+      node_count = 0;
+    }
+  }      
+
+public:
+                                // set operations:
+  iterator find(const key_type& x);
+  const_iterator find(const key_type& x) const;
+  size_type count(const key_type& x) const;
+  iterator lower_bound(const key_type& x);
+  const_iterator lower_bound(const key_type& x) const;
+  iterator upper_bound(const key_type& x);
+  const_iterator upper_bound(const key_type& x) const;
+  pair<iterator,iterator> equal_range(const key_type& x);
+  pair<const_iterator, const_iterator> equal_range(const key_type& x) const;
+
+public:
+                                // Debugging.
+  bool __rb_verify() const;
+};
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+inline bool operator==(const rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& x, 
+                       const rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& y) {
+  return x.size() == y.size() && equal(x.begin(), x.end(), y.begin());
+}
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+inline bool operator<(const rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& x, 
+                      const rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& y) {
+  return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());
+}
+
+#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+inline void swap(rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& x, 
+                 rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& y) {
+  x.swap(y);
+}
+
+#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
+
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& 
+rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::
+operator=(const rb_tree<Key, Value, KeyOfValue, Compare, Alloc>& x) {
+  if (this != &x) {
+                                // Note that Key may be a constant type.
+    clear();
+    node_count = 0;
+    key_compare = x.key_compare;        
+    if (x.root() == 0) {
+      root() = 0;
+      leftmost() = header;
+      rightmost() = header;
+    }
+    else {
+      root() = __copy(x.root(), header);
+      leftmost() = minimum(root());
+      rightmost() = maximum(root());
+      node_count = x.node_count;
+    }
+  }
+  return *this;
+}
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iterator
+rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::
+__insert(base_ptr x_, base_ptr y_, const Value& v) {
+  link_type x = (link_type) x_;
+  link_type y = (link_type) y_;
+  link_type z;
+
+  if (y == header || x != 0 || key_compare(KeyOfValue()(v), key(y))) {
+    z = create_node(v);
+    left(y) = z;                // also makes leftmost() = z when y == header
+    if (y == header) {
+      root() = z;
+      rightmost() = z;
+    }
+    else if (y == leftmost())
+      leftmost() = z;           // maintain leftmost() pointing to min node
+  }
+  else {
+    z = create_node(v);
+    right(y) = z;
+    if (y == rightmost())
+      rightmost() = z;          // maintain rightmost() pointing to max node
+  }
+  parent(z) = y;
+  left(z) = 0;
+  right(z) = 0;
+  __rb_tree_rebalance(z, header->parent);
+  ++node_count;
+  return iterator(z);
+}
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iterator
+rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::insert_equal(const Value& v)
+{
+  link_type y = header;
+  link_type x = root();
+  while (x != 0) {
+    y = x;
+    x = key_compare(KeyOfValue()(v), key(x)) ? left(x) : right(x);
+  }
+  return __insert(x, y, v);
+}
+
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+pair<typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iterator, bool>
+rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::insert_unique(const Value& v)
+{
+  link_type y = header;
+  link_type x = root();
+  bool comp = true;
+  while (x != 0) {
+    y = x;
+    comp = key_compare(KeyOfValue()(v), key(x));
+    x = comp ? left(x) : right(x);
+  }
+  iterator j = iterator(y);   
+  if (comp)
+    if (j == begin())     
+      return pair<iterator,bool>(__insert(x, y, v), true);
+    else
+      --j;
+  if (key_compare(key(j.node), KeyOfValue()(v)))
+    return pair<iterator,bool>(__insert(x, y, v), true);
+  return pair<iterator,bool>(j, false);
+}
+
+
+template <class Key, class Val, class KeyOfValue, class Compare, class Alloc>
+typename rb_tree<Key, Val, KeyOfValue, Compare, Alloc>::iterator 
+rb_tree<Key, Val, KeyOfValue, Compare, Alloc>::insert_unique(iterator position,
+                                                             const Val& v) {
+  if (position.node == header->left) // begin()
+    if (size() > 0 && key_compare(KeyOfValue()(v), key(position.node)))
+      return __insert(position.node, position.node, v);
+  // first argument just needs to be non-null 
+    else
+      return insert_unique(v).first;
+  else if (position.node == header) // end()
+    if (key_compare(key(rightmost()), KeyOfValue()(v)))
+      return __insert(0, rightmost(), v);
+    else
+      return insert_unique(v).first;
+  else {
+    iterator before = position;
+    --before;
+    if (key_compare(key(before.node), KeyOfValue()(v))
+        && key_compare(KeyOfValue()(v), key(position.node)))
+      if (right(before.node) == 0)
+        return __insert(0, before.node, v); 
+      else
+        return __insert(position.node, position.node, v);
+    // first argument just needs to be non-null 
+    else
+      return insert_unique(v).first;
+  }
+}
+
+template <class Key, class Val, class KeyOfValue, class Compare, class Alloc>
+typename rb_tree<Key, Val, KeyOfValue, Compare, Alloc>::iterator 
+rb_tree<Key, Val, KeyOfValue, Compare, Alloc>::insert_equal(iterator position,
+                                                            const Val& v) {
+  if (position.node == header->left) // begin()
+    if (size() > 0 && key_compare(KeyOfValue()(v), key(position.node)))
+      return __insert(position.node, position.node, v);
+  // first argument just needs to be non-null 
+    else
+      return insert_equal(v);
+  else if (position.node == header) // end()
+    if (!key_compare(KeyOfValue()(v), key(rightmost())))
+      return __insert(0, rightmost(), v);
+    else
+      return insert_equal(v);
+  else {
+    iterator before = position;
+    --before;
+    if (!key_compare(KeyOfValue()(v), key(before.node))
+        && !key_compare(key(position.node), KeyOfValue()(v)))
+      if (right(before.node) == 0)
+        return __insert(0, before.node, v); 
+      else
+        return __insert(position.node, position.node, v);
+    // first argument just needs to be non-null 
+    else
+      return insert_equal(v);
+  }
+}
+
+#ifdef __STL_MEMBER_TEMPLATES  
+
+template <class K, class V, class KoV, class Cmp, class Al> template<class II>
+void rb_tree<K, V, KoV, Cmp, Al>::insert_equal(II first, II last) {
+  for ( ; first != last; ++first)
+    insert_equal(*first);
+}
+
+template <class K, class V, class KoV, class Cmp, class Al> template<class II>
+void rb_tree<K, V, KoV, Cmp, Al>::insert_unique(II first, II last) {
+  for ( ; first != last; ++first)
+    insert_unique(*first);
+}
+
+#else /* __STL_MEMBER_TEMPLATES */
+
+template <class K, class V, class KoV, class Cmp, class Al>
+void
+rb_tree<K, V, KoV, Cmp, Al>::insert_equal(const V* first, const V* last) {
+  for ( ; first != last; ++first)
+    insert_equal(*first);
+}
+
+template <class K, class V, class KoV, class Cmp, class Al>
+void
+rb_tree<K, V, KoV, Cmp, Al>::insert_equal(const_iterator first,
+                                          const_iterator last) {
+  for ( ; first != last; ++first)
+    insert_equal(*first);
+}
+
+template <class K, class V, class KoV, class Cmp, class A>
+void 
+rb_tree<K, V, KoV, Cmp, A>::insert_unique(const V* first, const V* last) {
+  for ( ; first != last; ++first)
+    insert_unique(*first);
+}
+
+template <class K, class V, class KoV, class Cmp, class A>
+void 
+rb_tree<K, V, KoV, Cmp, A>::insert_unique(const_iterator first,
+                                          const_iterator last) {
+  for ( ; first != last; ++first)
+    insert_unique(*first);
+}
+
+#endif /* __STL_MEMBER_TEMPLATES */
+         
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+inline void
+rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::erase(iterator position) {
+  link_type y = (link_type) __rb_tree_rebalance_for_erase(position.node,
+                                                          header->parent,
+                                                          header->left,
+                                                          header->right);
+  destroy_node(y);
+  --node_count;
+}
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::size_type 
+rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::erase(const Key& x) {
+  pair<iterator,iterator> p = equal_range(x);
+  size_type n = 0;
+  distance(p.first, p.second, n);
+  erase(p.first, p.second);
+  return n;
+}
+
+template <class K, class V, class KeyOfValue, class Compare, class Alloc>
+typename rb_tree<K, V, KeyOfValue, Compare, Alloc>::link_type 
+rb_tree<K, V, KeyOfValue, Compare, Alloc>::__copy(link_type x, link_type p) {
+                                // structural copy.  x and p must be non-null.
+  link_type top = clone_node(x);
+  top->parent = p;
+  __STL_TRY {
+    if (x->right)
+      top->right = __copy(right(x), top);
+    p = top;
+    x = left(x);
+
+    while (x != 0) {
+      link_type y = clone_node(x);
+      p->left = y;
+      y->parent = p;
+      if (x->right)
+        y->right = __copy(right(x), y);
+      p = y;
+      x = left(x);
+    }
+  }
+  __STL_UNWIND(__erase(top));
+
+  return top;
+}
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+void rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::__erase(link_type x) {
+                                // erase without rebalancing
+  while (x != 0) {
+    __erase(right(x));
+    link_type y = left(x);
+    destroy_node(x);
+    x = y;
+  }
+}
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+void rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::erase(iterator first, 
+                                                            iterator last) {
+  if (first == begin() && last == end())
+    clear();
+  else
+    while (first != last) erase(first++);
+}
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+void rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::erase(const Key* first, 
+                                                            const Key* last) {
+  while (first != last) erase(*first++);
+}
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iterator 
+rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::find(const Key& k) {
+  link_type y = header;        // Last node which is not less than k. 
+  link_type x = root();        // Current node. 
+
+  while (x != 0) 
+    if (!key_compare(key(x), k))
+      y = x, x = left(x);
+    else
+      x = right(x);
+
+  iterator j = iterator(y);   
+  return (j == end() || key_compare(k, key(j.node))) ? end() : j;
+}
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::const_iterator 
+rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::find(const Key& k) const {
+  link_type y = header; /* Last node which is not less than k. */
+  link_type x = root(); /* Current node. */
+
+  while (x != 0) {
+    if (!key_compare(key(x), k))
+      y = x, x = left(x);
+    else
+      x = right(x);
+  }
+  const_iterator j = const_iterator(y);   
+  return (j == end() || key_compare(k, key(j.node))) ? end() : j;
+}
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::size_type 
+rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::count(const Key& k) const {
+  pair<const_iterator, const_iterator> p = equal_range(k);
+  size_type n = 0;
+  distance(p.first, p.second, n);
+  return n;
+}
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iterator 
+rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::lower_bound(const Key& k) {
+  link_type y = header; /* Last node which is not less than k. */
+  link_type x = root(); /* Current node. */
+
+  while (x != 0) 
+    if (!key_compare(key(x), k))
+      y = x, x = left(x);
+    else
+      x = right(x);
+
+  return iterator(y);
+}
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::const_iterator 
+rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::lower_bound(const Key& k) const {
+  link_type y = header; /* Last node which is not less than k. */
+  link_type x = root(); /* Current node. */
+
+  while (x != 0) 
+    if (!key_compare(key(x), k))
+      y = x, x = left(x);
+    else
+      x = right(x);
+
+  return const_iterator(y);
+}
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iterator 
+rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::upper_bound(const Key& k) {
+  link_type y = header; /* Last node which is greater than k. */
+  link_type x = root(); /* Current node. */
+
+   while (x != 0) 
+     if (key_compare(k, key(x)))
+       y = x, x = left(x);
+     else
+       x = right(x);
+
+   return iterator(y);
+}
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::const_iterator 
+rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::upper_bound(const Key& k) const {
+  link_type y = header; /* Last node which is greater than k. */
+  link_type x = root(); /* Current node. */
+
+   while (x != 0) 
+     if (key_compare(k, key(x)))
+       y = x, x = left(x);
+     else
+       x = right(x);
+
+   return const_iterator(y);
+}
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+inline pair<typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iterator,
+            typename rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::iterator>
+rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::equal_range(const Key& k) {
+  return pair<iterator, iterator>(lower_bound(k), upper_bound(k));
+}
+
+template <class Key, class Value, class KoV, class Compare, class Alloc>
+inline pair<typename rb_tree<Key, Value, KoV, Compare, Alloc>::const_iterator,
+            typename rb_tree<Key, Value, KoV, Compare, Alloc>::const_iterator>
+rb_tree<Key, Value, KoV, Compare, Alloc>::equal_range(const Key& k) const {
+  return pair<const_iterator,const_iterator>(lower_bound(k), upper_bound(k));
+}
+
+inline int __black_count(__rb_tree_node_base* node, __rb_tree_node_base* root)
+{
+  if (node == 0)
+    return 0;
+  else {
+    int bc = node->color == __rb_tree_black ? 1 : 0;
+    if (node == root)
+      return bc;
+    else
+      return bc + __black_count(node->parent, root);
+  }
+}
+
+template <class Key, class Value, class KeyOfValue, class Compare, class Alloc>
+bool 
+rb_tree<Key, Value, KeyOfValue, Compare, Alloc>::__rb_verify() const
+{
+  if (node_count == 0 || begin() == end())
+    return node_count == 0 && begin() == end() &&
+      header->left == header && header->right == header;
+  
+  int len = __black_count(leftmost(), root());
+  for (const_iterator it = begin(); it != end(); ++it) {
+    link_type x = (link_type) it.node;
+    link_type L = left(x);
+    link_type R = right(x);
+
+    if (x->color == __rb_tree_red)
+      if ((L && L->color == __rb_tree_red) ||
+          (R && R->color == __rb_tree_red))
+        return false;
+
+    if (L && key_compare(key(x), key(L)))
+      return false;
+    if (R && key_compare(key(R), key(x)))
+      return false;
+
+    if (!L && !R && __black_count(x, root()) != len)
+      return false;
+  }
+
+  if (leftmost() != __rb_tree_node_base::minimum(root()))
+    return false;
+  if (rightmost() != __rb_tree_node_base::maximum(root()))
+    return false;
+
+  return true;
+}
+
+__STL_END_NAMESPACE 
+
+#endif /* __SGI_STL_INTERNAL_TREE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_uninitialized.h b/libstdc++/stl/stl_uninitialized.h
new file mode 100644 (file)
index 0000000..661bbe9
--- /dev/null
@@ -0,0 +1,242 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_UNINITIALIZED_H
+#define __SGI_STL_INTERNAL_UNINITIALIZED_H
+
+__STL_BEGIN_NAMESPACE
+
+// Valid if copy construction is equivalent to assignment, and if the
+//  destructor is trivial.
+template <class InputIterator, class ForwardIterator>
+inline ForwardIterator 
+__uninitialized_copy_aux(InputIterator first, InputIterator last,
+                         ForwardIterator result,
+                         __true_type) {
+  return copy(first, last, result);
+}
+
+template <class InputIterator, class ForwardIterator>
+ForwardIterator 
+__uninitialized_copy_aux(InputIterator first, InputIterator last,
+                         ForwardIterator result,
+                         __false_type) {
+  ForwardIterator cur = result;
+  __STL_TRY {
+    for ( ; first != last; ++first, ++cur)
+      construct(&*cur, *first);
+    return cur;
+  }
+  __STL_UNWIND(destroy(result, cur));
+}
+
+
+template <class InputIterator, class ForwardIterator, class T>
+inline ForwardIterator
+__uninitialized_copy(InputIterator first, InputIterator last,
+                     ForwardIterator result, T*) {
+  typedef typename __type_traits<T>::is_POD_type is_POD;
+  return __uninitialized_copy_aux(first, last, result, is_POD());
+}
+
+template <class InputIterator, class ForwardIterator>
+inline ForwardIterator
+  uninitialized_copy(InputIterator first, InputIterator last,
+                     ForwardIterator result) {
+  return __uninitialized_copy(first, last, result, value_type(result));
+}
+
+inline char* uninitialized_copy(const char* first, const char* last,
+                                char* result) {
+  memmove(result, first, last - first);
+  return result + (last - first);
+}
+
+inline wchar_t* uninitialized_copy(const wchar_t* first, const wchar_t* last,
+                                   wchar_t* result) {
+  memmove(result, first, sizeof(wchar_t) * (last - first));
+  return result + (last - first);
+}
+
+template <class InputIterator, class Size, class ForwardIterator>
+pair<InputIterator, ForwardIterator>
+__uninitialized_copy_n(InputIterator first, Size count,
+                       ForwardIterator result,
+                       input_iterator_tag) {
+  ForwardIterator cur = result;
+  __STL_TRY {
+    for ( ; count > 0 ; --count, ++first, ++cur) 
+      construct(&*cur, *first);
+    return pair<InputIterator, ForwardIterator>(first, cur);
+  }
+  __STL_UNWIND(destroy(result, cur));
+}
+
+template <class RandomAccessIterator, class Size, class ForwardIterator>
+inline pair<RandomAccessIterator, ForwardIterator>
+__uninitialized_copy_n(RandomAccessIterator first, Size count,
+                       ForwardIterator result,
+                       random_access_iterator_tag) {
+  RandomAccessIterator last = first + count;
+  return make_pair(last, uninitialized_copy(first, last, result));
+}
+
+template <class InputIterator, class Size, class ForwardIterator>
+inline pair<InputIterator, ForwardIterator>
+uninitialized_copy_n(InputIterator first, Size count,
+                     ForwardIterator result) {
+  return __uninitialized_copy_n(first, count, result,
+                                iterator_category(first));
+}
+
+// Valid if copy construction is equivalent to assignment, and if the
+//  destructor is trivial.
+template <class ForwardIterator, class T>
+inline void
+__uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, 
+                         const T& x, __true_type)
+{
+  fill(first, last, x);
+}
+
+template <class ForwardIterator, class T>
+void
+__uninitialized_fill_aux(ForwardIterator first, ForwardIterator last, 
+                         const T& x, __false_type)
+{
+  ForwardIterator cur = first;
+  __STL_TRY {
+    for ( ; cur != last; ++cur)
+      construct(&*cur, x);
+  }
+  __STL_UNWIND(destroy(first, cur));
+}
+
+template <class ForwardIterator, class T, class T1>
+inline void __uninitialized_fill(ForwardIterator first, ForwardIterator last, 
+                                 const T& x, T1*) {
+  typedef typename __type_traits<T1>::is_POD_type is_POD;
+  __uninitialized_fill_aux(first, last, x, is_POD());
+                   
+}
+
+template <class ForwardIterator, class T>
+inline void uninitialized_fill(ForwardIterator first, ForwardIterator last, 
+                               const T& x) {
+  __uninitialized_fill(first, last, x, value_type(first));
+}
+
+// Valid if copy construction is equivalent to assignment, and if the
+//  destructor is trivial.
+template <class ForwardIterator, class Size, class T>
+inline ForwardIterator
+__uninitialized_fill_n_aux(ForwardIterator first, Size n,
+                           const T& x, __true_type) {
+  return fill_n(first, n, x);
+}
+
+template <class ForwardIterator, class Size, class T>
+ForwardIterator
+__uninitialized_fill_n_aux(ForwardIterator first, Size n,
+                           const T& x, __false_type) {
+  ForwardIterator cur = first;
+  __STL_TRY {
+    for ( ; n > 0; --n, ++cur)
+      construct(&*cur, x);
+    return cur;
+  }
+  __STL_UNWIND(destroy(first, cur));
+}
+
+template <class ForwardIterator, class Size, class T, class T1>
+inline ForwardIterator __uninitialized_fill_n(ForwardIterator first, Size n,
+                                              const T& x, T1*) {
+  typedef typename __type_traits<T1>::is_POD_type is_POD;
+  return __uninitialized_fill_n_aux(first, n, x, is_POD());
+                                    
+}
+
+template <class ForwardIterator, class Size, class T>
+inline ForwardIterator uninitialized_fill_n(ForwardIterator first, Size n,
+                                            const T& x) {
+  return __uninitialized_fill_n(first, n, x, value_type(first));
+}
+
+// Copies [first1, last1) into [result, result + (last1 - first1)), and
+//  copies [first2, last2) into
+//  [result, result + (last1 - first1) + (last2 - first2)).
+
+template <class InputIterator1, class InputIterator2, class ForwardIterator>
+inline ForwardIterator
+__uninitialized_copy_copy(InputIterator1 first1, InputIterator1 last1,
+                          InputIterator2 first2, InputIterator2 last2,
+                          ForwardIterator result) {
+  ForwardIterator mid = uninitialized_copy(first1, last1, result);
+  __STL_TRY {
+    return uninitialized_copy(first2, last2, mid);
+  }
+  __STL_UNWIND(destroy(result, mid));
+}
+
+// Fills [result, mid) with x, and copies [first, last) into
+//  [mid, mid + (last - first)).
+template <class ForwardIterator, class T, class InputIterator>
+inline ForwardIterator 
+__uninitialized_fill_copy(ForwardIterator result, ForwardIterator mid,
+                          const T& x,
+                          InputIterator first, InputIterator last) {
+  uninitialized_fill(result, mid, x);
+  __STL_TRY {
+    return uninitialized_copy(first, last, mid);
+  }
+  __STL_UNWIND(destroy(result, mid));
+}
+
+// Copies [first1, last1) into [first2, first2 + (last1 - first1)), and
+//  fills [first2 + (last1 - first1), last2) with x.
+template <class InputIterator, class ForwardIterator, class T>
+inline void
+__uninitialized_copy_fill(InputIterator first1, InputIterator last1,
+                          ForwardIterator first2, ForwardIterator last2,
+                          const T& x) {
+  ForwardIterator mid2 = uninitialized_copy(first1, last1, first2);
+  __STL_TRY {
+    uninitialized_fill(mid2, last2, x);
+  }
+  __STL_UNWIND(destroy(first2, mid2));
+}
+
+__STL_END_NAMESPACE
+
+#endif /* __SGI_STL_INTERNAL_UNINITIALIZED_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/stl_vector.h b/libstdc++/stl/stl_vector.h
new file mode 100644 (file)
index 0000000..cfa7fdb
--- /dev/null
@@ -0,0 +1,534 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef __SGI_STL_INTERNAL_VECTOR_H
+#define __SGI_STL_INTERNAL_VECTOR_H
+
+__STL_BEGIN_NAMESPACE 
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma set woff 1174
+#endif
+
+template <class T, class Alloc = alloc>
+class vector {
+public:
+  typedef T value_type;
+  typedef value_type* pointer;
+  typedef const value_type* const_pointer;
+  typedef value_type* iterator;
+  typedef const value_type* const_iterator;
+  typedef value_type& reference;
+  typedef const value_type& const_reference;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type;
+
+#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
+  typedef reverse_iterator<const_iterator> const_reverse_iterator;
+  typedef reverse_iterator<iterator> reverse_iterator;
+#else /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+  typedef reverse_iterator<const_iterator, value_type, const_reference, 
+                           difference_type>  const_reverse_iterator;
+  typedef reverse_iterator<iterator, value_type, reference, difference_type>
+          reverse_iterator;
+#endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
+protected:
+  typedef simple_alloc<value_type, Alloc> data_allocator;
+  iterator start;
+  iterator finish;
+  iterator end_of_storage;
+  void insert_aux(iterator position, const T& x);
+  void deallocate() {
+    if (start) data_allocator::deallocate(start, end_of_storage - start);
+  }
+
+  void fill_initialize(size_type n, const T& value) {
+    start = allocate_and_fill(n, value);
+    finish = start + n;
+    end_of_storage = finish;
+  }
+public:
+  iterator begin() { return start; }
+  const_iterator begin() const { return start; }
+  iterator end() { return finish; }
+  const_iterator end() const { return finish; }
+  reverse_iterator rbegin() { return reverse_iterator(end()); }
+  const_reverse_iterator rbegin() const { 
+    return const_reverse_iterator(end()); 
+  }
+  reverse_iterator rend() { return reverse_iterator(begin()); }
+  const_reverse_iterator rend() const { 
+    return const_reverse_iterator(begin()); 
+  }
+  size_type size() const { return size_type(end() - begin()); }
+  size_type max_size() const { return size_type(-1) / sizeof(T); }
+  size_type capacity() const { return size_type(end_of_storage - begin()); }
+  bool empty() const { return begin() == end(); }
+  reference operator[](size_type n) { return *(begin() + n); }
+  const_reference operator[](size_type n) const { return *(begin() + n); }
+
+  vector() : start(0), finish(0), end_of_storage(0) {}
+  vector(size_type n, const T& value) { fill_initialize(n, value); }
+  vector(int n, const T& value) { fill_initialize(n, value); }
+  vector(long n, const T& value) { fill_initialize(n, value); }
+  explicit vector(size_type n) { fill_initialize(n, T()); }
+
+  vector(const vector<T, Alloc>& x) {
+    start = allocate_and_copy(x.end() - x.begin(), x.begin(), x.end());
+    finish = start + (x.end() - x.begin());
+    end_of_storage = finish;
+  }
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  vector(InputIterator first, InputIterator last) :
+    start(0), finish(0), end_of_storage(0)
+  {
+    range_initialize(first, last, iterator_category(first));
+  }
+#else /* __STL_MEMBER_TEMPLATES */
+  vector(const_iterator first, const_iterator last) {
+    size_type n = 0;
+    distance(first, last, n);
+    start = allocate_and_copy(n, first, last);
+    finish = start + n;
+    end_of_storage = finish;
+  }
+#endif /* __STL_MEMBER_TEMPLATES */
+  ~vector() { 
+    destroy(start, finish);
+    deallocate();
+  }
+  vector<T, Alloc>& operator=(const vector<T, Alloc>& x);
+  void reserve(size_type n) {
+    if (capacity() < n) {
+      const size_type old_size = size();
+      iterator tmp = allocate_and_copy(n, start, finish);
+      destroy(start, finish);
+      deallocate();
+      start = tmp;
+      finish = tmp + old_size;
+      end_of_storage = start + n;
+    }
+  }
+  reference front() { return *begin(); }
+  const_reference front() const { return *begin(); }
+  reference back() { return *(end() - 1); }
+  const_reference back() const { return *(end() - 1); }
+  void push_back(const T& x) {
+    if (finish != end_of_storage) {
+      construct(finish, x);
+      ++finish;
+    }
+    else
+      insert_aux(end(), x);
+  }
+  void swap(vector<T, Alloc>& x) {
+    __STD::swap(start, x.start);
+    __STD::swap(finish, x.finish);
+    __STD::swap(end_of_storage, x.end_of_storage);
+  }
+  iterator insert(iterator position, const T& x) {
+    size_type n = position - begin();
+    if (finish != end_of_storage && position == end()) {
+      construct(finish, x);
+      ++finish;
+    }
+    else
+      insert_aux(position, x);
+    return begin() + n;
+  }
+  iterator insert(iterator position) { return insert(position, T()); }
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  void insert(iterator position, InputIterator first, InputIterator last) {
+    range_insert(position, first, last, iterator_category(first));
+  }
+#else /* __STL_MEMBER_TEMPLATES */
+  void insert(iterator position,
+              const_iterator first, const_iterator last);
+#endif /* __STL_MEMBER_TEMPLATES */
+
+  void insert (iterator pos, size_type n, const T& x);
+  void insert (iterator pos, int n, const T& x) {
+    insert(pos, (size_type) n, x);
+  }
+  void insert (iterator pos, long n, const T& x) {
+    insert(pos, (size_type) n, x);
+  }
+
+  void pop_back() {
+    --finish;
+    destroy(finish);
+  }
+  iterator erase(iterator position) {
+    if (position + 1 != end())
+      copy(position + 1, finish, position);
+    --finish;
+    destroy(finish);
+    return position;
+  }
+  iterator erase(iterator first, iterator last) {
+    iterator i = copy(last, finish, first);
+    destroy(i, finish);
+    finish = finish - (last - first);
+    return first;
+  }
+  void resize(size_type new_size, const T& x) {
+    if (new_size < size()) 
+      erase(begin() + new_size, end());
+    else
+      insert(end(), new_size - size(), x);
+  }
+  void resize(size_type new_size) { resize(new_size, T()); }
+  void clear() { erase(begin(), end()); }
+
+protected:
+  iterator allocate_and_fill(size_type n, const T& x) {
+    iterator result = data_allocator::allocate(n);
+    __STL_TRY {
+      uninitialized_fill_n(result, n, x);
+      return result;
+    }
+    __STL_UNWIND(data_allocator::deallocate(result, n));
+  }
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class ForwardIterator>
+  iterator allocate_and_copy(size_type n,
+                             ForwardIterator first, ForwardIterator last) {
+    iterator result = data_allocator::allocate(n);
+    __STL_TRY {
+      uninitialized_copy(first, last, result);
+      return result;
+    }
+    __STL_UNWIND(data_allocator::deallocate(result, n));
+  }
+#else /* __STL_MEMBER_TEMPLATES */
+  iterator allocate_and_copy(size_type n,
+                             const_iterator first, const_iterator last) {
+    iterator result = data_allocator::allocate(n);
+    __STL_TRY {
+      uninitialized_copy(first, last, result);
+      return result;
+    }
+    __STL_UNWIND(data_allocator::deallocate(result, n));
+  }
+#endif /* __STL_MEMBER_TEMPLATES */
+
+
+#ifdef __STL_MEMBER_TEMPLATES
+  template <class InputIterator>
+  void range_initialize(InputIterator first, InputIterator last,
+                        input_iterator_tag) {
+    for ( ; first != last; ++first)
+      push_back(*first);
+  }
+
+  // This function is only called by the constructor.  We have to worry
+  //  about resource leaks, but not about maintaining invariants.
+  template <class ForwardIterator>
+  void range_initialize(ForwardIterator first, ForwardIterator last,
+                        forward_iterator_tag) {
+    size_type n = 0;
+    distance(first, last, n);
+    start = allocate_and_copy(n, first, last);
+    finish = start + n;
+    end_of_storage = finish;
+  }
+
+  template <class InputIterator>
+  void range_insert(iterator pos,
+                    InputIterator first, InputIterator last,
+                    input_iterator_tag);
+
+  template <class ForwardIterator>
+  void range_insert(iterator pos,
+                    ForwardIterator first, ForwardIterator last,
+                    forward_iterator_tag);
+
+#endif /* __STL_MEMBER_TEMPLATES */
+};
+
+template <class T, class Alloc>
+inline bool operator==(const vector<T, Alloc>& x, const vector<T, Alloc>& y) {
+  return x.size() == y.size() && equal(x.begin(), x.end(), y.begin());
+}
+
+template <class T, class Alloc>
+inline bool operator<(const vector<T, Alloc>& x, const vector<T, Alloc>& y) {
+  return lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());
+}
+
+#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class T, class Alloc>
+inline void swap(vector<T, Alloc>& x, vector<T, Alloc>& y) {
+  x.swap(y);
+}
+
+#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
+
+template <class T, class Alloc>
+vector<T, Alloc>& vector<T, Alloc>::operator=(const vector<T, Alloc>& x) {
+  if (&x != this) {
+    if (x.size() > capacity()) {
+      iterator tmp = allocate_and_copy(x.end() - x.begin(),
+                                       x.begin(), x.end());
+      destroy(start, finish);
+      deallocate();
+      start = tmp;
+      end_of_storage = start + (x.end() - x.begin());
+    }
+    else if (size() >= x.size()) {
+      iterator i = copy(x.begin(), x.end(), begin());
+      destroy(i, finish);
+    }
+    else {
+      copy(x.begin(), x.begin() + size(), start);
+      uninitialized_copy(x.begin() + size(), x.end(), finish);
+    }
+    finish = start + x.size();
+  }
+  return *this;
+}
+
+template <class T, class Alloc>
+void vector<T, Alloc>::insert_aux(iterator position, const T& x) {
+  if (finish != end_of_storage) {
+    construct(finish, *(finish - 1));
+    ++finish;
+    T x_copy = x;
+    copy_backward(position, finish - 2, finish - 1);
+    *position = x_copy;
+  }
+  else {
+    const size_type old_size = size();
+    const size_type len = old_size != 0 ? 2 * old_size : 1;
+    iterator new_start = data_allocator::allocate(len);
+    iterator new_finish = new_start;
+    __STL_TRY {
+      new_finish = uninitialized_copy(start, position, new_start);
+      construct(new_finish, x);
+      ++new_finish;
+      new_finish = uninitialized_copy(position, finish, new_finish);
+    }
+
+#       ifdef  __STL_USE_EXCEPTIONS 
+    catch(...) {
+      destroy(new_start, new_finish); 
+      data_allocator::deallocate(new_start, len);
+      throw;
+    }
+#       endif /* __STL_USE_EXCEPTIONS */
+    destroy(begin(), end());
+    deallocate();
+    start = new_start;
+    finish = new_finish;
+    end_of_storage = new_start + len;
+  }
+}
+
+template <class T, class Alloc>
+void vector<T, Alloc>::insert(iterator position, size_type n, const T& x) {
+  if (n != 0) {
+    if (size_type(end_of_storage - finish) >= n) {
+      T x_copy = x;
+      const size_type elems_after = finish - position;
+      iterator old_finish = finish;
+      if (elems_after > n) {
+        uninitialized_copy(finish - n, finish, finish);
+        finish += n;
+        copy_backward(position, old_finish - n, old_finish);
+        fill(position, position + n, x_copy);
+      }
+      else {
+        uninitialized_fill_n(finish, n - elems_after, x_copy);
+        finish += n - elems_after;
+        uninitialized_copy(position, old_finish, finish);
+        finish += elems_after;
+        fill(position, old_finish, x_copy);
+      }
+    }
+    else {
+      const size_type old_size = size();        
+      const size_type len = old_size + max(old_size, n);
+      iterator new_start = data_allocator::allocate(len);
+      iterator new_finish = new_start;
+      __STL_TRY {
+        new_finish = uninitialized_copy(start, position, new_start);
+        new_finish = uninitialized_fill_n(new_finish, n, x);
+        new_finish = uninitialized_copy(position, finish, new_finish);
+      }
+#         ifdef  __STL_USE_EXCEPTIONS 
+      catch(...) {
+        destroy(new_start, new_finish);
+        data_allocator::deallocate(new_start, len);
+        throw;
+      }
+#         endif /* __STL_USE_EXCEPTIONS */
+      destroy(start, finish);
+      deallocate();
+      start = new_start;
+      finish = new_finish;
+      end_of_storage = new_start + len;
+    }
+  }
+}
+
+#ifdef __STL_MEMBER_TEMPLATES
+
+template <class T, class Alloc> template <class InputIterator>
+void vector<T, Alloc>::range_insert(iterator pos,
+                                    InputIterator first, InputIterator last,
+                                    input_iterator_tag) {
+  for ( ; first != last; ++first) {
+    pos = insert(pos, *first);
+    ++pos;
+  }
+}
+
+template <class T, class Alloc> template <class ForwardIterator>
+void vector<T, Alloc>::range_insert(iterator position,
+                                    ForwardIterator first,
+                                    ForwardIterator last,
+                                    forward_iterator_tag) {
+  if (first != last) {
+    size_type n = 0;
+    distance(first, last, n);
+    if (size_type(end_of_storage - finish) >= n) {
+      const size_type elems_after = finish - position;
+      iterator old_finish = finish;
+      if (elems_after > n) {
+        uninitialized_copy(finish - n, finish, finish);
+        finish += n;
+        copy_backward(position, old_finish - n, old_finish);
+        copy(first, last, position);
+      }
+      else {
+        ForwardIterator mid = first;
+        advance(mid, elems_after);
+        uninitialized_copy(mid, last, finish);
+        finish += n - elems_after;
+        uninitialized_copy(position, old_finish, finish);
+        finish += elems_after;
+        copy(first, mid, position);
+      }
+    }
+    else {
+      const size_type old_size = size();
+      const size_type len = old_size + max(old_size, n);
+      iterator new_start = data_allocator::allocate(len);
+      iterator new_finish = new_start;
+      __STL_TRY {
+        new_finish = uninitialized_copy(start, position, new_start);
+        new_finish = uninitialized_copy(first, last, new_finish);
+        new_finish = uninitialized_copy(position, finish, new_finish);
+      }
+#         ifdef __STL_USE_EXCEPTIONS
+      catch(...) {
+        destroy(new_start, new_finish);
+        data_allocator::deallocate(new_start, len);
+        throw;
+      }
+#         endif /* __STL_USE_EXCEPTIONS */
+      destroy(start, finish);
+      deallocate();
+      start = new_start;
+      finish = new_finish;
+      end_of_storage = new_start + len;
+    }
+  }
+}
+
+#else /* __STL_MEMBER_TEMPLATES */
+
+template <class T, class Alloc>
+void vector<T, Alloc>::insert(iterator position, 
+                              const_iterator first, 
+                              const_iterator last) {
+  if (first != last) {
+    size_type n = 0;
+    distance(first, last, n);
+    if (size_type(end_of_storage - finish) >= n) {
+      const size_type elems_after = finish - position;
+      iterator old_finish = finish;
+      if (elems_after > n) {
+        uninitialized_copy(finish - n, finish, finish);
+        finish += n;
+        copy_backward(position, old_finish - n, old_finish);
+        copy(first, last, position);
+      }
+      else {
+        uninitialized_copy(first + elems_after, last, finish);
+        finish += n - elems_after;
+        uninitialized_copy(position, old_finish, finish);
+        finish += elems_after;
+        copy(first, first + elems_after, position);
+      }
+    }
+    else {
+      const size_type old_size = size();
+      const size_type len = old_size + max(old_size, n);
+      iterator new_start = data_allocator::allocate(len);
+      iterator new_finish = new_start;
+      __STL_TRY {
+        new_finish = uninitialized_copy(start, position, new_start);
+        new_finish = uninitialized_copy(first, last, new_finish);
+        new_finish = uninitialized_copy(position, finish, new_finish);
+      }
+#         ifdef __STL_USE_EXCEPTIONS
+      catch(...) {
+        destroy(new_start, new_finish);
+        data_allocator::deallocate(new_start, len);
+        throw;
+      }
+#         endif /* __STL_USE_EXCEPTIONS */
+      destroy(start, finish);
+      deallocate();
+      start = new_start;
+      finish = new_finish;
+      end_of_storage = new_start + len;
+    }
+  }
+}
+
+#endif /* __STL_MEMBER_TEMPLATES */
+
+#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+#pragma reset woff 1174
+#endif
+
+__STL_END_NAMESPACE 
+
+#endif /* __SGI_STL_INTERNAL_VECTOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/utility b/libstdc++/stl/utility
new file mode 100644 (file)
index 0000000..df8c224
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef __SGI_STL_UTILITY
+#define __SGI_STL_UTILITY
+
+#include <stl_config.h>
+#include <stl_relops.h>
+#include <stl_pair.h>
+
+#endif /* __SGI_STL_UTILITY */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/libstdc++/stl/vector b/libstdc++/stl/vector
new file mode 100644 (file)
index 0000000..4bcdebc
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1996
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef __SGI_STL_VECTOR
+#define __SGI_STL_VECTOR
+
+#include <stl_algobase.h>
+#include <stl_alloc.h>
+#include <stl_construct.h>
+#include <stl_uninitialized.h>
+#include <stl_vector.h>
+#include <stl_bvector.h>
+
+#endif /* __SGI_STL_VECTOR */
+
+// Local Variables:
+// mode:C++
+// End: