OSDN Git Service

Get ready for garbage collection.
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 6 Sep 1999 02:43:09 +0000 (02:43 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 6 Sep 1999 02:43:09 +0000 (02:43 +0000)
* Makefile.in (CXX_TREE_H): Add varray.h
(lex.o): Depend on ggc.h.
(decl.o): Likewise.
(decl2.o): Likewise.
(method.o): Likewise.
(search.o): Likewise.
(pt.o): Likewise.
(repo.o): Likewise.
* class.c: Include ggc.h.
(current_class_name): Remove.
(current_class_type): Likewise.
(current_access_specifier): Likewise.
(previous_class_type): Likewise.
(previous_class_values): Likewise.
(class_cache_firstobj): Likewise.
(current_lang_base): Likewise.
(current_lang_stack): Likewise.
(current_lang_stacksize): Likewise.
(lang_name_c): Likewise.
(lang_name_cplusplus): Likewise.
(lang_name_java): Likewise.
(current_lang_name): Likewise.
(base_layout_decl): Likewise.
(access_default_node): Likewise.
(access_public_node): Likewise.
(access_protected_node): Likewise.
(access_private_node): Likewise.
(access_default_virtual_node): Likewise.
(access_public_virtual_node): Likewise.
(access_protected_virtual_node): Likewise.
(access_private_virtual_node): Likewise.
(signed_zero_node): Likewise.
(init_class_processing): Don't build base_layout_decl.
(push_lang_context): Adjust now that current_lang_base is a varray.
(pop_lang_context): Likewise.
* cp-tree.h: Include varray.h.
(cp_global_trees): Add access_default, access_public,
access_protected, access_private, access_default_virtual,
access_public_virtual, access_protected_virtual,
access_private_virtual, ctor_identifier, delta2_identifier,
delta_identifier, dtor_identifier, in_charge_identifier,
index_identifier, nelts_identifier, this_identifier,
pfn_identifier, pfn_or_delta2_identifier, vptr_identifier,
lang_name_c, lang_name_cplusplus, lang_name_java,
empty_except_spec, null, jclass, minus_one, terminate.
(saved_scope): Move here from decl.c.  Define globals in terms of
saved_scope: current_namespace, current_class_name,
current_class_type, current_access_specifier, current_lang_stack,
current_lang_base, current_lang_name, current_function_parms,
current_template_parms, processing_template_decl,
processing_specialization, processing_explicit_instantiation,
previous_class_type, previous_class_values, class_cache_firstobj.
(scope_chain): New variable.
(init_pt): New function.
* decl.c (current_namespace): Remove.
(this_identifier, in_charge_identifier, ctor_identifier): Likewise.
(dtor_identifier, pfn_identifier, index_identifier): Likewise.
(delta_identifier, delta2_identifier): Likewise.
(pfn_or_delta2_identifier, tag_identifier): Likewise
(vt_off_identifier, empty_except_spec, null_node): Likewise.
(current_function_parms, current_lang_base): Remove.
(current_lang_stack, previous_class_values): Remove.
(class_binding_level): Macroize.
(saved_scope): Remove.
(current_saved_scope): Rename to scope_chain.
(mark_saved_scope): Adjust for new scope structure.
(maybe_push_to_top_level): Likewise.
(pop_from_top_level): Likewise.
(duplicate_decls): Adjust now that current_lang_base is a varray.
(build_typename_type): Call ggc_add_tree_hash_table_root.
(init_decl_processing): Call init_pt.  Call push_to_top_level to
set up globals.  Add GC roots.
(xref_basetypes): Adjust now that current_lang_base is a varray.
* decl.h (this_identifier): Remove.
(in_charge_identifier): Likewise.
* decl2.c: Don't include varray.h.
(current_namespace): Remove.
(init_decl2): Add GC roots.
* except.c (Terminate): Remove.
(init_exception_processing): Use terminate_node instead.
(build_terminate_handler): Likewise.
* init.c (nc_nelts_field_id): Remove.
(minus_one): Likewise.
(init_init_processing): Use minus_one_node and nelts_identifier
instead.  Add GC roots.
(jclass_node): Remove.
(build_new_1): Use nelts_identifier.
(build_vec_init): Likewise.
(build_vec_delete): Likewise.
* lex.c: Include ggc.h.
(defarg_fn): Move declaration early.
(defarg_parms): Likewise.
(init_parse): Add GC roots.
(handle_cp_pragma): Remove redundant declaration of
pending_vtables.
* method.c: Include ggc.h.
(btypelist): Make it a varray.  All uses changed.
(ktypelist): Likewise.
(init_method): Add GC roots.
* pt.c: Don't include varray.h.  Include ggc.h.
(current_template_parms): Remove.
(processing_template_decl): Likewise.
(processing_specialization): Likewise.
(processing_explicit_instantiation): Likewise.
(init_pt): New function.
* repo.c: Include ggc.h.
(init_repo): Add GC roots.
* search.c: Don't include varray.h.
(_vptr_name): Remove.
(lookup_field_1): Use vtpr_identifier instead.
(expand_indirect_vtbls_init): Remove redundant declaration of
in_charge_identifier.
(init_search_processing): Use vptr_identifier.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@29135 138bc75d-0d04-0410-961f-82ee72b054a4

14 files changed:
gcc/cp/ChangeLog
gcc/cp/Makefile.in
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/decl.c
gcc/cp/decl.h
gcc/cp/decl2.c
gcc/cp/except.c
gcc/cp/init.c
gcc/cp/lex.c
gcc/cp/method.c
gcc/cp/pt.c
gcc/cp/repo.c
gcc/cp/search.c

index 3bb762b..9318c0b 100644 (file)
@@ -1,3 +1,120 @@
+1999-09-05  Mark Mitchell  <mark@codesourcery.com>
+
+       Get ready for garbage collection.
+       * Makefile.in (CXX_TREE_H): Add varray.h
+       (lex.o): Depend on ggc.h.
+       (decl.o): Likewise.
+       (decl2.o): Likewise.
+       (method.o): Likewise.
+       (search.o): Likewise.
+       (pt.o): Likewise.
+       (repo.o): Likewise.
+       * clas.c: Include ggc.h.
+       (current_class_name): Remove.
+       (current_class_type): Likewise.
+       (current_access_specifier): Likewise.
+       (previous_class_type): Likewise.
+       (previous_class_values): Likewise.
+       (class_cache_firstobj): Likewise.
+       (current_lang_base): Likewise.
+       (current_lang_stack): Likewise.
+       (current_lang_stacksize): Likewise.
+       (lang_name_c): Likewise.
+       (lang_name_cplusplus): Likewise.
+       (lang_name_java): Likewise.
+       (current_lang_name): Likewise.
+       (base_layout_decl): Likewise.
+       (access_default_node): Likewise.
+       (access_public_node): Likewise.
+       (access_protected_node): Likewise.
+       (access_private_node): Likewise.
+       (access_default_virtual_node): Likewise.
+       (access_public_virtual_node): Likewise.
+       (access_protected_virtual_node): Likewise.
+       (access_private_virtual_node): Likewise.
+       (signed_zero_node): Likewise.
+       (init_class_processing): Don't build base_layout_decl.
+       (push_lang_context): Adjust now that current_lang_base is a varray.
+       (pop_lang_context): Likewise.
+       * cp-tree.h: Include varray.h.
+       (cp_global_trees): Add access_default, access_public,
+       access_protected, access_private, access_default_virtual,
+       access_public_virtual, access_protected_virtual,
+       access_private_virtual, ctor_identifier, delta2_identifier, 
+       delta_identifier, dtor_identifier, in_charge_identifier,
+       index_identifier, nelts_identifier, this_identifier,
+       pfn_identifier, pfn_or_delta2_identifier, vptr_identifier,
+       lang_name_c, lang_name_cplusplus, lang_name_java,
+       empty_except_spec, null, jclass, minus_one, terminate.
+       (saved_scope): Move here from decl.c.  Define globals in terms of
+       saved_scope: current_namespace, current_class_name,
+       current_class_type, current_access_specifier, current_lang_stack,
+       current_lang_base, current_lang_name, current_function_parms,
+       current_template_parms, processing_template_decl,
+       processing_specialization, processing_explicit_instantiation,
+       previous_class_type, previous_class_values, class_cache_firstobj.
+       (scope_chain): New variable.
+       (init_pt): New function.
+       * decl.c (current_namespace): Remove.
+       (this_identifier, in_charge_identifier, ctor_identifier): Likewise.
+       (dtor_identifier, pfn_identifier, index_identifier): Likewise.
+       (delta_identifier, delta2_identifier): Likewise.
+       (pfn_or_delta2_identifier, tag_identifier): Likewise
+       (vt_off_identifier, empty_except_spec, null_node): Likewise.
+       (current_function_parms, current_lang_base): Remove.
+       (current_lang_stack, previous_class_values): Remove.
+       (class_binding_level): Macroize.
+       (saved_scope): Remove.
+       (current_saved_scope): Rename to scope_chain.
+       (mark_saved_scope): Adjust for new scope structure.
+       (maybe_push_to_top_level): Likewise.
+       (pop_from_top_level): Likewise.
+       (duplicate_decls): Adjust now that current_lang_base is a varray.
+       (build_typename_type): Call ggc_add_tree_hash_table_root.
+       (init_decl_processing): Call init_pt.  Call push_to_top_level to
+       set up globals.  Add GC roots.
+       (xref_basetypes): Adjust now that current_lang_base is a varray.
+       * decl.h (this_identifier): Remove.
+       (in_charge_identifier): Likewise.
+       * decl2.c: Don't include varray.h.
+       (current_namespace): Remove.
+       (init_decl2): Add GC roots.
+       * except.c (Terminate): Remove. 
+       (init_exception_processing): Use terminate_node instead.
+       (build_terminate_handler): Likewise.
+       * init.c (nc_nelts_field_id): Remove.
+       (minus_one): Likewise.
+       (init_init_processing): Use minus_one_node and nelts_identifier
+       instead.  Add GC roots.
+       (jclass_node): Remove.
+       (build_new_1): Use nelts_identifier.
+       (build_vec_init): Likewise.
+       (build_vec_delete): Likewise.
+       * lex.c: Include ggc.h.
+       (defarg_fn): Move declaration early.
+       (defarg_parms): Likewise.
+       (init_parse): Add GC roots.
+       (handle_cp_pragma): Remove redundant declaration of
+       pending_vtables.
+       * method.c: Include ggc.h.
+       (btypelist): Make it a varray.  All uses changed.
+       (ktypelist): Likewise.
+       (init_method): Add GC roots.
+       * pt.c: Don't include varray.h.  Include ggc.h.
+       (current_template_parms): Remove.
+       (processing_template_decl): Likewise.
+       (processing_specialization): Likewise.
+       (processing_explicit_instantiation): Likewise.
+       (init_pt): New function.
+       * repo.c: Include ggc.h.
+       (init_repo): Add GC roots.
+       * search.c: Don't include varray.h.
+       (_vptr_name): Remove.
+       (lookup_field_1): Use vtpr_identifier instead.
+       (expand_indirect_vtbls_init): Remove redundant declaration of
+       in_charge_identifier.
+       (init_search_processing): Use vptr_identifier.
+       
 1999-09-05  Richard Henderson  <rth@cygnus.com>
             Bernd Schmidt <bernds@cygnus.co.uk>
             Mark Mitchell  <mark@codesourcery.com>
index c01bd5e..07e0f83 100644 (file)
@@ -202,7 +202,7 @@ RTL_H = $(srcdir)/../rtl.h $(srcdir)/../rtl.def \
 TREE_H = $(srcdir)/../tree.h $(srcdir)/../real.h $(srcdir)/../tree.def \
        $(srcdir)/../machmode.h $(srcdir)/../machmode.def
 CXX_TREE_H = $(TREE_H) cp-tree.h $(srcdir)/../c-common.h cp-tree.def \
-       $(srcdir)/../function.h
+       $(srcdir)/../function.h $(srcdir)/../varray.h
 PARSE_H = $(srcdir)/parse.h
 PARSE_C = $(srcdir)/parse.c
 EXPR_H = $(srcdir)/../expr.h ../insn-codes.h
@@ -241,17 +241,16 @@ spew.o : spew.c $(CONFIG_H) $(CXX_TREE_H) $(PARSE_H) $(srcdir)/../flags.h \
 lex.o : lex.c $(CONFIG_H) $(CXX_TREE_H) \
   $(PARSE_H) input.c $(srcdir)/../flags.h hash.h lex.h \
   $(srcdir)/../c-pragma.h $(srcdir)/../system.h $(srcdir)/../toplev.h \
-  $(srcdir)/../output.h $(srcdir)/../mbchar.h
+  $(srcdir)/../output.h $(srcdir)/../mbchar.h $(srcdir)/../ggc.h
 decl.o : decl.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \
   lex.h decl.h $(srcdir)/../stack.h $(srcdir)/../output.h  \
   $(srcdir)/../except.h $(srcdir)/../system.h $(srcdir)/../toplev.h \
-  $(srcdir)/../hash.h
+  $(srcdir)/../hash.h $(srcdir)/../ggc.h
 decl2.o : decl2.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \
   lex.h decl.h $(EXPR_H) $(srcdir)/../except.h \
   $(srcdir)/../output.h $(srcdir)/../except.h $(srcdir)/../system.h \
   $(srcdir)/../toplev.h $(srcdir)/../dwarf2out.h $(srcdir)/../dwarfout.h \
-  $(srcdir)/../../include/splay-tree.h $(srcdir)/../varray.h \
-  $(srcdir)/../ggc.h
+  $(srcdir)/../../include/splay-tree.h $(srcdir)/../ggc.h
 typeck2.o : typeck2.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \
   $(srcdir)/../system.h $(srcdir)/../toplev.h
 typeck.o : typeck.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h $(RTL_H) \
@@ -266,12 +265,11 @@ friend.o : friend.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h $(RTL_H) \
 init.o : init.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h $(RTL_H) \
   $(EXPR_H) $(srcdir)/../system.h $(srcdir)/../toplev.h $(srcdir)/../ggc.h
 method.o : method.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h \
-  $(srcdir)/../toplev.h
+  $(srcdir)/../toplev.h $(srcdir)/../ggc.h
 cvt.o : cvt.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h decl.h \
   $(srcdir)/../flags.h $(srcdir)/../toplev.h $(srcdir)/../convert.h
 search.o : search.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../stack.h \
-  $(srcdir)/../flags.h $(srcdir)/../system.h $(srcdir)/../toplev.h \
-  $(srcdir)/../varray.h
+  $(srcdir)/../flags.h $(srcdir)/../system.h $(srcdir)/../toplev.h
 tree.o : tree.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../flags.h \
   $(srcdir)/../system.h $(srcdir)/../toplev.h
 ptree.o : ptree.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h
@@ -284,13 +282,13 @@ expr.o : expr.c $(CONFIG_H) $(CXX_TREE_H) $(RTL_H) $(srcdir)/../flags.h \
 xref.o : xref.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../input.h \
   $(srcdir)/../system.h $(srcdir)/../toplev.h
 pt.o : pt.c $(CONFIG_H) $(CXX_TREE_H) decl.h $(PARSE_H) lex.h \
-  $(srcdir)/../system.h $(srcdir)/../toplev.h
+  $(srcdir)/../system.h $(srcdir)/../toplev.h $(srcdir)/../ggc.h
 error.o : error.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h \
   $(srcdir)/../toplev.h
 errfn.o : errfn.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h \
   $(srcdir)/../toplev.h
 repo.o : repo.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h \
-  $(srcdir)/../toplev.h
+  $(srcdir)/../toplev.h $(srcdir)/../ggc.h
 semantics.o: semantics.c $(CONFIG_H) $(CXX_TREE_H) lex.h \
   $(srcdir)/../except.h $(srcdir)/../system.h $(srcdir)/../toplev.h
 dump.o: dump.c $(CONFIG_H) $(CXX_TREE_H) $(srcdir)/../system.h
index 2a0babb..7b50870 100644 (file)
@@ -31,6 +31,7 @@ Boston, MA 02111-1307, USA.  */
 #include "output.h"
 #include "toplev.h"
 #include "splay-tree.h"
+#include "ggc.h"
 
 #include "obstack.h"
 #define obstack_chunk_alloc xmalloc
@@ -71,19 +72,8 @@ typedef struct class_stack_node {
 static int current_class_stack_size;
 static class_stack_node_t current_class_stack;
 
-/* The following two can be derived from the previous one */
-tree current_class_name;       /* IDENTIFIER_NODE: name of current class */
-tree current_class_type;       /* _TYPE: the type of the current class */
-tree current_access_specifier;
-tree previous_class_type;      /* _TYPE: the previous type that was a class */
-tree previous_class_values;    /* TREE_LIST: copy of the class_shadowed list
-                                  when leaving an outermost class scope.  */
-
 /* The obstack on which the cached class declarations are kept.  */
 static struct obstack class_cache_obstack;
-/* The first object allocated on that obstack.  We can use
-   obstack_free with tis value to free the entire obstack.  */
-char *class_cache_firstobj;
 
 struct base_info;
 
@@ -137,29 +127,6 @@ static tree build_vtbl_initializer PROTO((tree));
 static int count_fields PROTO((tree));
 static int add_fields_to_vec PROTO((tree, tree, int));
 
-/* Way of stacking language names.  */
-tree *current_lang_base, *current_lang_stack;
-int current_lang_stacksize;
-
-/* Names of languages we recognize.  */
-tree lang_name_c, lang_name_cplusplus, lang_name_java;
-tree current_lang_name;
-
-/* When layout out an aggregate type, the size of the
-   basetypes (virtual and non-virtual) is passed to layout_record
-   via this node.  */
-static tree base_layout_decl;
-
-/* Constants used for access control.  */
-tree access_default_node; /* 0 */
-tree access_public_node; /* 1 */
-tree access_protected_node; /* 2 */
-tree access_private_node; /* 3 */
-tree access_default_virtual_node; /* 4 */
-tree access_public_virtual_node; /* 5 */
-tree access_protected_virtual_node; /* 6 */
-tree access_private_virtual_node; /* 7 */
-
 /* Variables shared between class.c and call.c.  */
 
 #ifdef GATHER_STATISTICS
@@ -780,8 +747,6 @@ build_vtable (binfo, type)
   return decl;
 }
 
-extern tree signed_size_zero_node;
-
 /* Give TYPE a new virtual function table which is initialized
    with a skeleton-copy of its original initialization.  The only
    entry that changes is the `delta' entry, so we can really
@@ -4488,10 +4453,6 @@ init_class_processing ()
     = (class_stack_node_t) xmalloc (current_class_stack_size 
                                    * sizeof (struct class_stack_node));
 
-  current_lang_stacksize = 10;
-  current_lang_base = (tree *)xmalloc(current_lang_stacksize * sizeof (tree));
-  current_lang_stack = current_lang_base;
-
   access_default_node = build_int_2 (0, 0);
   access_public_node = build_int_2 (1, 0);
   access_protected_node = build_int_2 (2, 0);
@@ -4501,10 +4462,6 @@ init_class_processing ()
   access_protected_virtual_node = build_int_2 (6, 0);
   access_private_virtual_node = build_int_2 (7, 0);
 
-  /* Keep these values lying around.  */
-  base_layout_decl = build_lang_decl (FIELD_DECL, NULL_TREE, error_mark_node);
-  TREE_TYPE (base_layout_decl) = make_node (RECORD_TYPE);
-
   gcc_obstack_init (&class_obstack);
 }
 
@@ -4736,13 +4693,13 @@ push_lang_context (name)
      tree name;
 {
   *current_lang_stack++ = current_lang_name;
-  if (current_lang_stack >= current_lang_base + current_lang_stacksize)
+  if (current_lang_stack - &VARRAY_TREE (current_lang_base, 0)
+      >= (ptrdiff_t) VARRAY_SIZE (current_lang_base))
     {
-      current_lang_base
-       = (tree *)xrealloc (current_lang_base,
-                           sizeof (tree) * (current_lang_stacksize + 10));
-      current_lang_stack = current_lang_base + current_lang_stacksize;
-      current_lang_stacksize += 10;
+      size_t old_size = VARRAY_SIZE (current_lang_base);
+
+      VARRAY_GROW (current_lang_base, old_size + 10);
+      current_lang_stack = &VARRAY_TREE (current_lang_base, old_size);
     }
 
   if (name == lang_name_cplusplus)
@@ -4781,6 +4738,9 @@ push_lang_context (name)
 void
 pop_lang_context ()
 {
+  /* Clear the current entry so that garbage collector won't hold on
+     to it.  */
+  *current_lang_stack = NULL_TREE;
   current_lang_name = *--current_lang_stack;
   if (current_lang_name == lang_name_cplusplus
       || current_lang_name == lang_name_java)
index cdb93e3..14231e8 100644 (file)
@@ -21,6 +21,7 @@ Boston, MA 02111-1307, USA.  */
 
 #include "c-common.h"
 #include "function.h"
+#include "varray.h"
 
 #ifndef _CP_TREE_H
 #define _CP_TREE_H
@@ -390,6 +391,37 @@ enum cp_tree_index
     CPTI_ABORT_FNDECL,
     CPTI_GLOBAL_DELETE_FNDECL,
 
+    CPTI_ACCESS_DEFAULT,
+    CPTI_ACCESS_PUBLIC,
+    CPTI_ACCESS_PROTECTED,
+    CPTI_ACCESS_PRIVATE,
+    CPTI_ACCESS_DEFAULT_VIRTUAL,
+    CPTI_ACCESS_PUBLIC_VIRTUAL,
+    CPTI_ACCESS_PROTECTED_VIRTUAL,
+    CPTI_ACCESS_PRIVATE_VIRTUAL,
+
+    CPTI_CTOR_IDENTIFIER,
+    CPTI_DELTA2_IDENTIFIER,
+    CPTI_DELTA_IDENTIFIER,
+    CPTI_DTOR_IDENTIFIER,
+    CPTI_IN_CHARGE_IDENTIFIER,
+    CPTI_INDEX_IDENTIFIER,
+    CPTI_NELTS_IDENTIFIER,
+    CPTI_THIS_IDENTIFIER,
+    CPTI_PFN_IDENTIFIER,
+    CPTI_PFN_OR_DELTA2_IDENTIFIER,
+    CPTI_VPTR_IDENTIFIER,
+
+    CPTI_LANG_NAME_C,
+    CPTI_LANG_NAME_CPLUSPLUS,
+    CPTI_LANG_NAME_JAVA,
+
+    CPTI_EMPTY_EXCEPT_SPEC,
+    CPTI_NULL,
+    CPTI_JCLASS,
+    CPTI_MINUS_ONE,
+    CPTI_TERMINATE,
+
     CPTI_MAX
 };
 
@@ -433,6 +465,129 @@ extern tree cp_global_trees[CPTI_MAX];
 #define abort_fndecl                   cp_global_trees[CPTI_ABORT_FNDECL]
 #define global_delete_fndecl           cp_global_trees[CPTI_GLOBAL_DELETE_FNDECL]
 
+/* Define the sets of attributes that member functions and baseclasses
+   can have.  These are sensible combinations of {public,private,protected}
+   cross {virtual,non-virtual}.  */
+
+#define access_default_node             cp_global_trees[CPTI_ACCESS_DEFAULT]
+#define access_public_node              cp_global_trees[CPTI_ACCESS_PUBLIC]
+#define access_protected_node           cp_global_trees[CPTI_ACCESS_PROTECTED]
+#define access_private_node             cp_global_trees[CPTI_ACCESS_PRIVATE]
+#define access_default_virtual_node     cp_global_trees[CPTI_ACCESS_DEFAULT_VIRTUAL]
+#define access_public_virtual_node      cp_global_trees[CPTI_ACCESS_PUBLIC_VIRTUAL]
+#define access_protected_virtual_node   cp_global_trees[CPTI_ACCESS_PROTECTED_VIRTUAL]
+#define access_private_virtual_node     cp_global_trees[CPTI_ACCESS_PRIVATE_VIRTUAL]
+
+/* We cache these tree nodes so as to call get_identifier less
+   frequently.  */
+
+#define ctor_identifier                 cp_global_trees[CPTI_CTOR_IDENTIFIER]
+#define delta2_identifier               cp_global_trees[CPTI_DELTA2_IDENTIFIER]
+#define delta_identifier                cp_global_trees[CPTI_DELTA_IDENTIFIER]
+#define dtor_identifier                 cp_global_trees[CPTI_DTOR_IDENTIFIER]
+#define in_charge_identifier            cp_global_trees[CPTI_IN_CHARGE_IDENTIFIER]
+#define index_identifier                cp_global_trees[CPTI_INDEX_IDENTIFIER]
+#define nelts_identifier                cp_global_trees[CPTI_NELTS_IDENTIFIER]
+#define this_identifier                 cp_global_trees[CPTI_THIS_IDENTIFIER]
+#define pfn_identifier                  cp_global_trees[CPTI_PFN_IDENTIFIER]
+#define pfn_or_delta2_identifier        cp_global_trees[CPTI_PFN_OR_DELTA2_IDENTIFIER]
+#define vptr_identifier                 cp_global_trees[CPTI_VPTR_IDENTIFIER]
+
+#define lang_name_c                     cp_global_trees[CPTI_LANG_NAME_C]
+#define lang_name_cplusplus             cp_global_trees[CPTI_LANG_NAME_CPLUSPLUS]
+#define lang_name_java                  cp_global_trees[CPTI_LANG_NAME_JAVA]
+
+/* Exception specifier used for throw().  */
+#define empty_except_spec               cp_global_trees[CPTI_EMPTY_EXCEPT_SPEC]
+
+/* The node for `__null'.  */
+#define null_node                       cp_global_trees[CPTI_NULL]
+
+/* If non-NULL, a POINTER_TYPE equivalent to (java::lang::Class*). */
+#define jclass_node                     cp_global_trees[CPTI_JCLASS]
+
+/* A node for `(int) -1'.  */
+#define minus_one_node                  cp_global_trees[CPTI_MINUS_ONE]
+
+/* The declaration for `std::terminate'.  */
+#define terminate_node                  cp_global_trees[CPTI_TERMINATE]
+
+/* Global state.  */
+
+struct saved_scope {
+  struct binding_level *old_binding_level;
+  tree old_bindings;
+  tree old_namespace;
+  struct saved_scope *prev;
+  tree class_name, class_type;
+  tree access_specifier;
+  tree function_decl;
+  struct binding_level *class_bindings;
+  varray_type lang_base;
+  tree *lang_stack;
+  tree lang_name;
+  tree x_function_parms;
+  tree template_parms;
+  HOST_WIDE_INT x_processing_template_decl;
+  tree x_previous_class_type;
+  tree x_previous_class_values;
+  int x_processing_specialization;
+  int x_processing_explicit_instantiation;
+  char *firstobj;
+};
+
+/* The current open namespace.  */
+
+#define current_namespace scope_chain->old_namespace
+
+/* IDENTIFIER_NODE: name of current class */
+
+#define current_class_name scope_chain->class_name
+
+/* _TYPE: the type of the current class */
+
+#define current_class_type scope_chain->class_type
+
+/* When parsing a class definition, the access specifier most recently
+   given by the user, or, if no access specifier was given, the
+   default value appropriate for the kind of class (i.e., struct,
+   class, or union).  */
+
+#define current_access_specifier scope_chain->access_specifier
+
+/* Pointer to the top of the language name stack.  */
+
+#define current_lang_stack scope_chain->lang_stack
+#define current_lang_base scope_chain->lang_base
+#define current_lang_name scope_chain->lang_name
+
+/* Parsing a function declarator leaves a list of parameter names
+   or a chain or parameter decls here.  */
+
+#define current_function_parms scope_chain->x_function_parms
+#define current_template_parms scope_chain->template_parms
+
+#define processing_template_decl scope_chain->x_processing_template_decl
+#define processing_specialization scope_chain->x_processing_specialization
+#define processing_explicit_instantiation scope_chain->x_processing_explicit_instantiation
+
+/* _TYPE: the previous type that was a class */
+
+#define previous_class_type scope_chain->x_previous_class_type
+
+/* This is a copy of the class_shadowed list of the previous class
+   binding contour when at global scope.  It's used to reset
+   IDENTIFIER_CLASS_VALUEs when entering another class scope (i.e. a
+   cache miss).  */
+
+#define previous_class_values scope_chain->x_previous_class_values
+
+/* The low-water mark on the class-cache obstack.  */
+
+#define class_cache_firstobj scope_chain->firstobj
+
+extern struct saved_scope *scope_chain;
+
 /* Global state pertinent to the current function.  */
 
 struct language_function
@@ -562,12 +717,12 @@ struct language_function
 #define in_function_try_handler cp_function_chain->in_function_try_handler
 
 extern tree current_function_return_value;
-extern tree current_namespace;
 extern tree global_namespace;
 
 extern tree ridpointers[];
 extern tree ansi_opname[];
 extern tree ansi_assopname[];
+extern tree null_pointer_node;
 
 /* Nonzero means `$' can be in an identifier.  */
 
@@ -2377,20 +2532,12 @@ extern tree type_for_size                       PROTO((unsigned, int));
 extern int c_get_alias_set                      PROTO((tree));
 
 /* in decl{2}.c */
-extern tree this_identifier;
-extern tree ctor_identifier, dtor_identifier;
-extern tree pfn_identifier;
-extern tree index_identifier;
-extern tree delta_identifier;
-extern tree delta2_identifier;
-extern tree pfn_or_delta2_identifier;
-extern tree tag_identifier;
-extern tree vt_off_identifier;
-extern tree empty_except_spec;
-
 /* A node that is a list (length 1) of error_mark_nodes.  */
 extern tree error_mark_list;
 
+/* A list of virtual function tables we must make sure to write out.  */
+extern tree pending_vtables;
+
 /* Node for "pointer to (virtual) function".
    This may be distinct from ptr_type_node so gdb can distinguish them.  */
 #define vfunc_ptr_type_node \
@@ -2400,8 +2547,6 @@ extern tree error_mark_list;
 /* For building calls to `delete'.  */
 extern tree integer_two_node, integer_three_node;
 
-extern tree null_node;
-
 extern tree anonymous_namespace_name;
 
 /* in pt.c  */
@@ -2416,9 +2561,6 @@ typedef enum unification_kind_t {
   DEDUCE_EXACT
 } unification_kind_t;
 
-extern tree current_template_parms;
-extern HOST_WIDE_INT processing_template_decl;
-
 /* The template currently being instantiated, and where the instantiation
    was triggered.  */
 struct tinst_level
@@ -2433,23 +2575,8 @@ extern void maybe_print_template_context PROTO ((void));
 
 /* in class.c */
 
-/* When parsing a class definition, the access specifier most recently
-   given by the user, or, if no access specifier was given, the
-   default value appropriate for the kind of class (i.e., struct,
-   class, or union).  */
-extern tree current_access_specifier;
-
-extern tree current_class_name;
-extern tree current_class_type;
-extern tree previous_class_type;
 extern int current_class_depth;
 
-extern tree current_lang_name;
-extern tree lang_name_cplusplus, lang_name_c, lang_name_java;
-
-/* The low-water mark on the class-cache obstack.  */
-extern char *class_cache_firstobj;
-
 /* Points to the name of that function. May not be the DECL_NAME
    of CURRENT_FUNCTION_DECL due to overloading */
 extern tree original_function_name;
@@ -2634,20 +2761,6 @@ extern tree global_base_init_list;
     && MAIN_NAME_P (DECL_NAME (NODE)))
 
 \f
-/* Define the sets of attributes that member functions and baseclasses
-   can have.  These are sensible combinations of {public,private,protected}
-   cross {virtual,non-virtual}.  */
-
-/* in class.c.  */
-extern tree access_default_node; /* 0 */
-extern tree access_public_node; /* 1 */
-extern tree access_protected_node; /* 2 */
-extern tree access_private_node; /* 3 */
-extern tree access_default_virtual_node; /* 4 */
-extern tree access_public_virtual_node; /* 5 */
-extern tree access_protected_virtual_node; /* 6 */
-extern tree access_private_virtual_node; /* 7 */
-
 /* Things for handling inline functions.  */
 
 struct pending_inline
@@ -2715,9 +2828,6 @@ extern int at_eof;
 
 enum overload_flags { NO_SPECIAL = 0, DTOR_FLAG, OP_FLAG, TYPENAME_FLAG };
 
-/* The following two can be derived from the previous one */
-extern tree current_class_name;        /* IDENTIFIER_NODE: name of current class */
-
 /* Some macros for char-based bitfields.  */
 #define B_SET(a,x) (a[x>>3] |= (1 << (x&7)))
 #define B_CLR(a,x) (a[x>>3] &= ~(1 << (x&7)))
@@ -3321,6 +3431,7 @@ extern void synthesize_method                     PROTO((tree));
 extern tree get_id_2                           PROTO((const char *, tree));
 
 /* in pt.c */
+extern void init_pt                             PROTO ((void));
 extern void check_template_shadow              PROTO ((tree));
 extern tree innermost_args                     PROTO ((tree));
 extern tree tsubst                             PROTO ((tree, tree, int, tree));
@@ -3377,8 +3488,6 @@ extern void print_candidates                    PROTO((tree));
 extern int instantiate_pending_templates        PROTO((void));
 extern tree tsubst_default_argument             PROTO((tree, tree, tree));
 
-extern int processing_specialization;
-extern int processing_explicit_instantiation;
 extern int processing_template_parmlist;
 
 /* in repo.c */
index 5f5e72f..93558bb 100644 (file)
@@ -55,7 +55,6 @@ extern int current_class_depth;
 
 extern tree static_ctors, static_dtors;
 
-extern tree current_namespace;
 extern tree global_namespace;
 
 extern int (*valid_lang_attribute) PROTO ((tree, tree, tree, tree));
@@ -294,6 +293,7 @@ tree unsigned_type_node;
 
 tree ptr_type_node;
 tree va_list_type_node;
+tree null_pointer_node;
 
 /* Indicates that there is a type value in some namespace, although
    that is not necessarily in scope at the moment.  */
@@ -325,19 +325,6 @@ static int only_namespace_names;
 
 #define original_result_rtx cp_function_chain->x_result_rtx
 
-/* C++: Keep these around to reduce calls to `get_identifier'.
-   Identifiers for `this' in member functions and the auto-delete
-   parameter for destructors.  */
-tree this_identifier, in_charge_identifier;
-tree ctor_identifier, dtor_identifier;
-/* Used in pointer to member functions, in vtables, and in sigtables.  */
-tree pfn_identifier, index_identifier, delta_identifier, delta2_identifier;
-tree pfn_or_delta2_identifier, tag_identifier;
-tree vt_off_identifier;
-
-/* Exception specifier used for throw().  */
-tree empty_except_spec;
-
 struct named_label_list
 {
   struct binding_level *binding_level;
@@ -375,15 +362,9 @@ tree static_aggregates;
 
 /* -- end of C++ */
 
-/* Two expressions that are constants with value zero.
-   The first is of type `int', the second of type `void *'.  */
+/* An expression of type `int' for the constant zero.  */
 
 tree integer_zero_node;
-tree null_pointer_node;
-
-/* The value for __null (NULL), namely, a zero of an integer type with
-   the same number of bits as a pointer.  */
-tree null_node;
 
 /* A node for the integer constants 1, 2, and 3.  */
 
@@ -398,23 +379,13 @@ static tree enum_next_value;
 
 static int enum_overflow;
 
-/* Parsing a function declarator leaves a list of parameter names
-   or a chain or parameter decls here.  */
-
-tree last_function_parms;
-
 /* Parsing a function declarator leaves here a chain of structure
    and enum types declared in the parmlist.  */
 
 static tree last_function_parm_tags;
 
-/* After parsing the declarator that starts a function definition,
-   `start_function' puts here the list of parameter names or chain of decls.
-   `store_parm_decls' finds it here.  */
-
-static tree current_function_parms;
-
 /* Similar, for last_function_parm_tags.  */
+tree last_function_parms;
 static tree current_function_parm_tags;
 
 /* A list (chain of TREE_LIST nodes) of all LABEL_DECLs in the function
@@ -462,10 +433,6 @@ extern int flag_huge_objects;
    .common instead of .data at the expense of not flagging multiple
    definitions.  */
 extern int flag_conserve_space;
-
-/* Pointers to the base and current top of the language name stack.  */
-
-extern tree *current_lang_base, *current_lang_stack;
 \f
 /* C and C++ flags are in decl2.c.  */
 
@@ -480,11 +447,6 @@ extern tree *current_lang_base, *current_lang_stack;
 
 extern int spew_debug;
 
-/* This is a copy of the class_shadowed list of the previous class binding
-   contour when at global scope.  It's used to reset IDENTIFIER_CLASS_VALUEs
-   when entering another class scope (i.e. a cache miss).  */
-extern tree previous_class_values;
-
 /* A expression of value 0 with the same precision as a sizetype
    node, but signed.  */
 tree signed_size_zero_node;
@@ -645,7 +607,7 @@ struct binding_level
 
 /* The binding level of the current class, if any.  */
 
-static struct binding_level *class_binding_level;
+#define class_binding_level scope_chain->class_bindings
 
 /* A chain of binding_level structures awaiting reuse.  */
 
@@ -2432,28 +2394,9 @@ pop_nested_namespace (ns)
    local-value slots of all identifiers, so that only the global values
    are at all visible.  Simply setting current_binding_level to the global
    scope isn't enough, because more binding levels may be pushed.  */
-struct saved_scope {
-  struct binding_level *old_binding_level;
-  tree old_bindings;
-  tree old_namespace;
-  struct saved_scope *prev;
-  tree class_name, class_type;
-  tree access_specifier;
-  tree function_decl;
-  struct binding_level *class_bindings;
-  tree *lang_base, *lang_stack, lang_name;
-  int lang_stacksize;
-  tree last_function_parms;
-  tree template_parms;
-  HOST_WIDE_INT processing_template_decl;
-  tree previous_class_type, previous_class_values;
-  int processing_specialization;
-  int processing_explicit_instantiation;
-  char *class_cache_firstobj;
-};
-static struct saved_scope *current_saved_scope;
+struct saved_scope *scope_chain;
 
-/* Mark ARG (which is really a struct saved_scoipe **) for GC.  */
+/* Mark ARG (which is really a struct saved_scope **) for GC.  */
 
 static void
 mark_saved_scope (arg)
@@ -2471,14 +2414,12 @@ mark_saved_scope (arg)
       ggc_mark_tree (t->access_specifier);
       ggc_mark_tree (t->function_decl);
       if (t->lang_base)
-       ggc_mark_tree (*t->lang_base);
-      if (t->lang_stack)
-       ggc_mark_tree (*t->lang_stack);
+       ggc_mark_tree_varray (t->lang_base);
       ggc_mark_tree (t->lang_name);
-      ggc_mark_tree (t->last_function_parms);
+      ggc_mark_tree (t->x_function_parms);
       ggc_mark_tree (t->template_parms);
-      ggc_mark_tree (t->previous_class_type);
-      ggc_mark_tree (t->previous_class_values);
+      ggc_mark_tree (t->x_previous_class_type);
+      ggc_mark_tree (t->x_previous_class_values);
       t = t->prev;
     }
 }
@@ -2543,15 +2484,16 @@ void
 maybe_push_to_top_level (pseudo)
      int pseudo;
 {
-  extern int current_lang_stacksize;
   struct saved_scope *s
     = (struct saved_scope *) xmalloc (sizeof (struct saved_scope));
-  struct binding_level *b = current_binding_level;
+  struct binding_level *b;
   tree old_bindings = NULL_TREE;
 
+  b = scope_chain ? current_binding_level : 0;
+
   push_function_context_to (NULL_TREE);
 
-  if (previous_class_type)
+  if (scope_chain && previous_class_type)
     old_bindings = store_bindings (previous_class_values, old_bindings);
 
   /* Have to include global_binding_level, because class-level decls
@@ -2577,35 +2519,19 @@ maybe_push_to_top_level (pseudo)
       for (t = b->type_shadowed; t; t = TREE_CHAIN (t))
        SET_IDENTIFIER_TYPE_VALUE (TREE_PURPOSE (t), TREE_VALUE (t));
     }
-
-  s->old_binding_level = current_binding_level;
+  if (scope_chain)
+    *s = *scope_chain;
+  s->old_binding_level = scope_chain ? current_binding_level : 0;
+  s->old_bindings = old_bindings;
+  s->prev = scope_chain;
+  scope_chain = s;
   current_binding_level = b;
 
-  s->old_namespace = current_namespace;
-  s->class_name = current_class_name;
-  s->class_type = current_class_type;
-  s->access_specifier = current_access_specifier;
-  s->function_decl = current_function_decl;
-  s->class_bindings = class_binding_level;
-  s->lang_stack = current_lang_stack;
-  s->lang_base = current_lang_base;
-  s->lang_stacksize = current_lang_stacksize;
-  s->lang_name = current_lang_name;
-  s->last_function_parms = last_function_parms;
-  s->template_parms = current_template_parms;
-  s->processing_template_decl = processing_template_decl;
-  s->previous_class_type = previous_class_type;
-  s->previous_class_values = previous_class_values;
-  s->class_cache_firstobj = class_cache_firstobj;
-  s->processing_specialization = processing_specialization;
-  s->processing_explicit_instantiation = processing_explicit_instantiation;
-
   current_class_name = current_class_type = NULL_TREE;
   current_function_decl = NULL_TREE;
   class_binding_level = (struct binding_level *)0;
-  current_lang_stacksize = 10;
-  current_lang_stack = current_lang_base
-    = (tree *) xmalloc (current_lang_stacksize * sizeof (tree));
+  VARRAY_TREE_INIT (current_lang_base, 10, "current_lang_base");
+  current_lang_stack = &VARRAY_TREE (current_lang_base, 0);
   current_lang_name = lang_name_cplusplus;
   strict_prototype = strict_prototypes_lang_cplusplus;
   named_labels = NULL_TREE;
@@ -2617,10 +2543,6 @@ maybe_push_to_top_level (pseudo)
   processing_template_decl = 0;
   current_namespace = global_namespace;
 
-  s->prev = current_saved_scope;
-  s->old_bindings = old_bindings;
-  current_saved_scope = s;
-
   push_obstacks (&permanent_obstack, &permanent_obstack);
 }
 
@@ -2633,8 +2555,7 @@ push_to_top_level ()
 void
 pop_from_top_level ()
 {
-  extern int current_lang_stacksize;
-  struct saved_scope *s = current_saved_scope;
+  struct saved_scope *s = scope_chain;
   tree t;
 
   /* Clear out class-level bindings cache.  */
@@ -2643,8 +2564,9 @@ pop_from_top_level ()
 
   pop_obstacks ();
 
-  current_binding_level = s->old_binding_level;
-  current_saved_scope = s->prev;
+  VARRAY_FREE (current_lang_base);
+
+  scope_chain = s->prev;
   for (t = s->old_bindings; t; )
     {
       tree save = t;
@@ -2654,34 +2576,16 @@ pop_from_top_level ()
          SET_IDENTIFIER_TYPE_VALUE (id, TREE_VEC_ELT (t, 1));
          IDENTIFIER_BINDING (id) = TREE_VEC_ELT (t, 2);
          IDENTIFIER_CLASS_VALUE (id) = TREE_VEC_ELT (t, 3);
-       }
+       }
       t = TREE_CHAIN (t);
       TREE_CHAIN (save) = free_binding_vecs;
       free_binding_vecs = save;
     }
-  current_namespace = s->old_namespace;
-  current_class_name = s->class_name;
-  current_class_type = s->class_type;
-  current_access_specifier = s->access_specifier;
-  current_function_decl = s->function_decl;
-  class_binding_level = s->class_bindings;
-  free (current_lang_base);
-  current_lang_base = s->lang_base;
-  current_lang_stack = s->lang_stack;
-  current_lang_name = s->lang_name;
-  current_lang_stacksize = s->lang_stacksize;
+
   if (current_lang_name == lang_name_cplusplus)
     strict_prototype = strict_prototypes_lang_cplusplus;
   else if (current_lang_name == lang_name_c)
     strict_prototype = strict_prototypes_lang_c;
-  last_function_parms = s->last_function_parms;
-  current_template_parms = s->template_parms;
-  processing_template_decl = s->processing_template_decl;
-  previous_class_type = s->previous_class_type;
-  previous_class_values = s->previous_class_values;
-  processing_specialization = s->processing_specialization;
-  processing_explicit_instantiation = s->processing_explicit_instantiation;
-  class_cache_firstobj = s->class_cache_firstobj;
 
   free (s);
 
@@ -3410,7 +3314,8 @@ duplicate_decls (newdecl, olddecl)
          /* extern "C" int foo ();
             int foo () { bar (); }
             is OK.  */
-         if (current_lang_stack == current_lang_base)
+         if (current_lang_stack
+             == &VARRAY_TREE (current_lang_base, 0))
            DECL_LANGUAGE (newdecl) = DECL_LANGUAGE (olddecl);
          else
            {
@@ -5490,10 +5395,14 @@ build_typename_type (context, name, fullname, base_type)
 
   push_obstacks (&permanent_obstack, &permanent_obstack);
 
-  if (!ht.table
-      && !hash_table_init (&ht, &hash_newfunc, &typename_hash, 
-                          &typename_compare))
-    fatal ("virtual memory exhausted");
+  if (!ht.table)
+    {
+      static struct hash_table *h = &ht;
+      if (!hash_table_init (&ht, &hash_newfunc, &typename_hash, 
+                           &typename_compare))
+       fatal ("virtual memory exhausted");
+      ggc_add_tree_hash_table_root (&h, 1);
+    }
 
   /* The FULLNAME needs to exist for the life of the hash table, i.e.,
      for the entire compilation.  */
@@ -6092,14 +6001,6 @@ signal_catch (sig)
   my_friendly_abort (0);
 }
 
-#if 0
-/* Unused -- brendan 970107 */
-/* Array for holding types considered "built-in".  These types
-   are output in the module in which `main' is defined.  */
-static tree *builtin_type_tdescs_arr;
-static int builtin_type_tdescs_len, builtin_type_tdescs_max;
-#endif
-
 /* Push the declarations of builtin types into the namespace.
    RID_INDEX, if < RID_MAX is the index of the builtin type
    in the array RID_POINTERS.  NAME is the name used when looking
@@ -6245,14 +6146,13 @@ init_decl_processing ()
 
   cp_parse_init ();
   init_decl2 ();
+  init_pt ();
 
-  /* Create the global per-function variables.  */
-  push_function_context_to (NULL_TREE);
+  /* Create the global variables.  */
+  push_to_top_level ();
 
   /* Enter the global namespace. */
   my_friendly_assert (global_namespace == NULL_TREE, 375);
-  my_friendly_assert (current_lang_name == NULL_TREE, 375);
-  current_lang_name = lang_name_cplusplus;
   push_namespace (get_identifier ("::"));
   global_namespace = current_namespace;
   current_lang_name = NULL_TREE;
@@ -6704,7 +6604,6 @@ init_decl_processing ()
   ggc_add_tree_root (c_global_trees, sizeof c_global_trees / sizeof(tree));
   ggc_add_tree_root (cp_global_trees, sizeof cp_global_trees / sizeof(tree));
   ggc_add_tree_root (&char_type_node, 1);
-  ggc_add_tree_root (&current_function_decl, 1);
   ggc_add_tree_root (&error_mark_node, 1);
   ggc_add_tree_root (&integer_type_node, 1);
   ggc_add_tree_root (&integer_three_node, 1);
@@ -6712,31 +6611,37 @@ init_decl_processing ()
   ggc_add_tree_root (&integer_one_node, 1);
   ggc_add_tree_root (&integer_zero_node, 1);
   ggc_add_tree_root (&signed_size_zero_node, 1);
-  ggc_add_tree_root (&named_labels, 1);
-  ggc_add_tree_root (&null_pointer_node, 1);
   ggc_add_tree_root (&size_one_node, 1);
   ggc_add_tree_root (&size_zero_node, 1);
   ggc_add_tree_root (&unsigned_type_node, 1);
+  ggc_add_tree_root (&ptr_type_node, 1);
+  ggc_add_tree_root (&null_pointer_node, 1);
+  ggc_add_tree_root (&va_list_type_node, 1);
   ggc_add_tree_root (&void_type_node, 1);
   ggc_add_root (&global_binding_level, 1, sizeof global_binding_level,
                mark_binding_level);
-  ggc_add_root (&current_saved_scope, 1, sizeof current_saved_scope,
-               &mark_saved_scope);
+  ggc_add_root (&scope_chain, 1, sizeof scope_chain, &mark_saved_scope);
   ggc_add_tree_root (&static_ctors, 1);
   ggc_add_tree_root (&static_dtors, 1);
+  ggc_add_tree_root (&lastiddecl, 1);
 
   ggc_add_tree_root (&enum_next_value, 1);
-  ggc_add_tree_root (&last_function_parms, 1);
   ggc_add_tree_root (&last_function_parm_tags, 1);
   ggc_add_tree_root (&current_function_return_value, 1);
   ggc_add_tree_root (&current_function_parms, 1);
   ggc_add_tree_root (&current_function_parm_tags, 1);
+  ggc_add_tree_root (&last_function_parms, 1);
   ggc_add_tree_root (&error_mark_list, 1);
-  ggc_add_tree_root (&void_list_node, 1);
+
   ggc_add_tree_root (&global_namespace, 1);
-  ggc_add_tree_root (&current_namespace, 1);
   ggc_add_tree_root (&global_type_node, 1);
   ggc_add_tree_root (&anonymous_namespace_name, 1);
+
+  ggc_add_tree_root (&got_object, 1);
+  ggc_add_tree_root (&got_scope, 1);
+
+  ggc_add_tree_root (&current_lang_name, 1);
+  ggc_add_tree_root (&static_aggregates, 1);
 }
 
 /* Function to print any language-specific context for an error message.  */
@@ -12644,7 +12549,8 @@ xref_basetypes (code_type_node, name, ref, binfo)
            }
 
          if (TYPE_FOR_JAVA (basetype)
-             && current_lang_stack == current_lang_base)
+             && (current_lang_stack 
+                 == &VARRAY_TREE (current_lang_base, 0)))
            TYPE_FOR_JAVA (ref) = 1;
 
          /* Note that the BINFO records which describe individual
index fcb247e..d6c376c 100644 (file)
@@ -33,11 +33,6 @@ enum decl_context
 /* We need this in here to get the decl_context definition.  */
 extern tree grokdeclarator                     PROTO((tree, tree, enum decl_context, int, tree));
 
-/* C++: Keep these around to reduce calls to `get_identifier'.
-   Identifiers for `this' in member functions and the auto-delete
-   parameter for destructors.  */
-extern tree this_identifier, in_charge_identifier;
-
 /* Parsing a function declarator leaves a list of parameter names
    or a chain or parameter decls here.  */
 extern tree last_function_parms;
index 76cebf8..169eba2 100644 (file)
@@ -43,7 +43,6 @@ Boston, MA 02111-1307, USA.  */
 #include "dwarf2out.h"
 #include "dwarfout.h"
 #include "splay-tree.h"
-#include "varray.h"
 #include "ggc.h"
 
 #if USE_CPPLIB
@@ -128,9 +127,8 @@ int at_eof;
 
 tree static_ctors, static_dtors;
 
-/* The current open namespace, and ::. */
+/* The :: namespace. */
 
-tree current_namespace;
 tree global_namespace;
 
 /* The stack for namespaces of current declarations. */
@@ -5276,4 +5274,10 @@ init_decl2 ()
 {
   ggc_add_tree_root (&decl_namespace_list, 1);
   ggc_add_tree_varray_root (&saved_inlines, 1);
+  ggc_add_tree_varray_root (&pending_statics, 1);
+  ggc_add_tree_varray_root (&ssdf_decls, 1);
+  ggc_add_tree_root (&ssdf_decl, 1);
+  ggc_add_tree_root (&priority_decl, 1);
+  ggc_add_tree_root (&initialize_p_decl, 1);
+  ggc_add_tree_root (&pending_vtables, 1);
 }
index c5a80de..15e2e8f 100644 (file)
@@ -151,11 +151,6 @@ asm (TEXT_SECTION_ASM_OP);
      
      ===================================================================== */
 
-/* local globals for function calls
-   ====================================================================== */
-
-static tree Terminate;
-
 /* ====================================================================== */
 
 /* sets up all the global eh stuff that needs to be initialized at the
@@ -169,9 +164,9 @@ init_exception_processing ()
   
   if (flag_honor_std)
     push_namespace (get_identifier ("std"));
-  Terminate = auto_function (get_identifier ("terminate"),
-                            vtype, NOT_BUILT_IN);
-  TREE_THIS_VOLATILE (Terminate) = 1;
+  terminate_node = auto_function (get_identifier ("terminate"),
+                                 vtype, NOT_BUILT_IN);
+  TREE_THIS_VOLATILE (terminate_node) = 1;
   if (flag_honor_std)
     pop_namespace ();
 
@@ -500,7 +495,7 @@ static tree
 build_terminate_handler ()
 {
   int yes = suspend_momentary ();
-  tree term = build_function_call (Terminate, NULL_TREE);
+  tree term = build_function_call (terminate_node, NULL_TREE);
   resume_momentary (yes);
   return term;
 }
index e2e082b..b49dda3 100644 (file)
@@ -50,11 +50,6 @@ static tree build_java_class_ref PROTO((tree));
 static void expand_cleanup_for_base PROTO((tree, tree));
 static tree get_temp_regvar PROTO((tree, tree));
 
-/* Cache the identifier nodes for the magic field of a new cookie.  */
-static tree nc_nelts_field_id;
-
-static tree minus_one;
-
 /* Set up local variable for this file.  MUST BE CALLED AFTER
    INIT_DECL_PROCESSING.  */
 
@@ -64,20 +59,19 @@ void init_init_processing ()
 {
   tree fields[1];
 
-  minus_one = build_int_2 (-1, -1);
+  minus_one_node = build_int_2 (-1, -1);
 
   /* Define the structure that holds header information for
      arrays allocated via operator new.  */
   BI_header_type = make_lang_type (RECORD_TYPE);
-  nc_nelts_field_id = get_identifier ("nelts");
-  fields[0] = build_lang_decl (FIELD_DECL, nc_nelts_field_id, sizetype);
+  nelts_identifier = get_identifier ("nelts");
+  fields[0] = build_lang_decl (FIELD_DECL, nelts_identifier, sizetype);
   finish_builtin_type (BI_header_type, "__new_cookie", fields,
                       0, double_type_node);
   BI_header_size = size_in_bytes (BI_header_type);
 
-  ggc_add_tree_root (&current_base_init_list, 1);
-  ggc_add_tree_root (&current_member_init_list, 1);
-  ggc_add_tree_root (&minus_one, 1);
+  ggc_add_tree_root (&BI_header_type, 1);
+  ggc_add_tree_root (&BI_header_size, 1);
 }
 
 /* Subroutine of emit_base_init.  For BINFO, initialize all the
@@ -2107,10 +2101,6 @@ build_new (placement, decl, init, use_global_new)
   return rval;
 }
 
-/* If non-NULL, a POINTER_TYPE equivalent to (java::lang::Class*). */
-
-static tree jclass_node = NULL_TREE;
-
 /* Given a Java class, return a decl for the corresponding java.lang.Class. */
 
 static tree
@@ -2328,7 +2318,7 @@ build_new_1 (exp)
                                          build_pointer_type (BI_header_type),
                                          rval, extra), NULL_PTR);
       exp1 = build (MODIFY_EXPR, void_type_node,
-                   build_component_ref (cookie, nc_nelts_field_id,
+                   build_component_ref (cookie, nelts_identifier,
                                         NULL_TREE, 0),
                    nelts);
       TREE_SIDE_EFFECTS (exp1) = 1;
@@ -2909,7 +2899,7 @@ build_vec_init (decl, base, maxindex, init, from_array)
 
       if_stmt = begin_if_stmt ();
       finish_if_stmt_cond (build (NE_EXPR, boolean_type_node,
-                                 iterator, minus_one),
+                                 iterator, minus_one_node),
                           if_stmt);
 
       /* Otherwise, loop through the elements.  */
@@ -3004,7 +2994,7 @@ build_vec_init (decl, base, maxindex, init, from_array)
                                    ptrdiff_type_node, 
                                    iterator,
                                    integer_one_node), 
-                            minus_one),
+                            minus_one_node),
                      do_stmt);
 
       finish_then_clause (if_stmt);
@@ -3372,7 +3362,7 @@ build_vec_delete (base, maxindex, auto_delete_vec, auto_delete,
       tree cookie_addr = build (MINUS_EXPR, build_pointer_type (BI_header_type),
                                base, BI_header_size);
       tree cookie = build_indirect_ref (cookie_addr, NULL_PTR);
-      maxindex = build_component_ref (cookie, nc_nelts_field_id, NULL_TREE, 0);
+      maxindex = build_component_ref (cookie, nelts_identifier, NULL_TREE, 0);
       do
        type = TREE_TYPE (type);
       while (TREE_CODE (type) == ARRAY_TYPE);
index 31999ff..72995f3 100644 (file)
@@ -37,6 +37,7 @@ Boston, MA 02111-1307, USA.  */
 #include "c-pragma.h"
 #include "toplev.h"
 #include "output.h"
+#include "ggc.h"
 
 #ifdef MULTIBYTE_CHARS
 #include "mbchar.h"
@@ -173,6 +174,17 @@ static tree this_filename_time;
 
 /* Array for holding counts of the numbers of tokens seen.  */
 extern int *token_count;
+
+/* When we see a default argument in a method declaration, we snarf it as
+   text using snarf_defarg.  When we get up to namespace scope, we then go
+   through and parse all of them using do_pending_defargs.  Since yacc
+   parsers are not reentrant, we retain defargs state in these two
+   variables so that subsequent calls to do_pending_defargs can resume
+   where the previous call left off.  */
+
+static tree defarg_fns;
+static tree defarg_parm;
+
 \f
 /* Return something to represent absolute declarators containing a *.
    TARGET is the absolute declarator that the * contains.
@@ -875,6 +887,14 @@ init_parse (filename)
   token_count = init_cpp_parse ();
   interface_unknown = 1;
 
+  ggc_add_tree_root (ansi_opname, LAST_CPLUS_TREE_CODE);
+  ggc_add_tree_root (ansi_assopname, LAST_CPLUS_TREE_CODE);
+  ggc_add_tree_root (ridpointers, RID_MAX);
+  ggc_add_tree_root (&defarg_fns, 1);
+  ggc_add_tree_root (&defarg_parm, 1);
+  ggc_add_tree_root (&this_filename_time, 1);
+  ggc_add_tree_root (&filename_times, 1);
+
   return filename;
 }
 
@@ -1821,16 +1841,6 @@ maybe_snarf_defarg ()
     do_snarf_defarg = 1;
 }
 
-/* When we see a default argument in a method declaration, we snarf it as
-   text using snarf_defarg.  When we get up to namespace scope, we then go
-   through and parse all of them using do_pending_defargs.  Since yacc
-   parsers are not reentrant, we retain defargs state in these two
-   variables so that subsequent calls to do_pending_defargs can resume
-   where the previous call left off.  */
-
-tree defarg_fns;
-tree defarg_parm;
-
 tree
 snarf_defarg ()
 {
@@ -2717,8 +2727,6 @@ handle_cp_pragma (pname)
 
   if (! strcmp (pname, "vtable"))
     {
-      extern tree pending_vtables;
-
       /* More follows: it must be a string constant (class name).  */
       token = real_yylex ();
       if (token != STRING || TREE_CODE (yylval.ttype) != STRING_CST)
index e3b2677..cf681e1 100644 (file)
@@ -41,6 +41,7 @@ Boston, MA 02111-1307, USA.  */
 #include "hard-reg-set.h"
 #include "flags.h"
 #include "toplev.h"
+#include "ggc.h"
 
 /* TREE_LIST of the current inline functions that need to be
    processed.  */
@@ -98,11 +99,31 @@ static void build_mangled_name_for_type_with_Gcode PROTO((tree, int));
 # define OB_FINISH() (obstack_1grow (&scratch_obstack, '\0'))
 # define OB_LAST() (obstack_next_free (&scratch_obstack)[-1])
 
+/* type tables for K and B type compression */
+static varray_type btypelist;
+static varray_type ktypelist;
+
+/* number of each type seen */
+static size_t maxbtype;
+static size_t maxktype;
+
+/* Array of types seen so far in top-level call to `build_mangled_name'.
+   Allocated and deallocated by caller.  */
+static varray_type typevec;
+
+/* Number of types interned by `build_mangled_name' so far.  */
+static size_t maxtype;
+
+/* Called once to initialize method.c.  */
+
 void
 init_method ()
 {
   gcc_obstack_init (&scratch_obstack);
   scratch_firstobj = (char *)obstack_alloc (&scratch_obstack, 0);
+  ggc_add_tree_varray_root (&btypelist, 1);
+  ggc_add_tree_varray_root (&ktypelist, 1);
+  ggc_add_tree_varray_root (&typevec, 1);
 }
 
 /* This must be large enough to hold any printed integer or floating-point
@@ -172,24 +193,6 @@ do_inline_function_hair (type, friend_list)
 \f
 /* Here is where overload code starts.  */
 
-/* type tables for K and B type compression */
-static tree *btypelist = NULL;
-static tree *ktypelist = NULL;
-static int maxbsize = 0;
-static int maxksize = 0;
-
-/* number of each type seen */
-static int maxbtype = 0;
-static int maxktype = 0;
-
-/* Array of types seen so far in top-level call to `build_mangled_name'.
-   Allocated and deallocated by caller.  */
-static tree *typevec = NULL;
-static int  typevec_size;
-
-/* Number of types interned by `build_mangled_name' so far.  */
-static int maxtype = 0;
-
 /* Nonzero if we should not try folding parameter types.  */
 static int nofold;
 
@@ -205,10 +208,8 @@ start_squangling ()
       nofold = 0;
       maxbtype = 0;
       maxktype = 0;
-      maxbsize = 50;
-      maxksize = 50;
-      btypelist = (tree *)xmalloc (sizeof (tree) * maxbsize);
-      ktypelist = (tree *)xmalloc (sizeof (tree) * maxksize);
+      VARRAY_TREE_INIT (btypelist, 50, "btypelist");
+      VARRAY_TREE_INIT (ktypelist, 50, "ktypelist");
     }
 }
 
@@ -217,16 +218,10 @@ end_squangling ()
 {
   if (flag_do_squangling)
     {
-      if (ktypelist)
-        free (ktypelist);
-      if (btypelist)
-        free (btypelist);
-      maxbsize = 0;
-      maxksize = 0;
+      VARRAY_FREE (ktypelist);
+      VARRAY_FREE (btypelist);
       maxbtype = 0;
       maxktype = 0;
-      ktypelist = NULL;
-      btypelist = NULL;
     }
 }
 
@@ -303,7 +298,7 @@ static __inline int
 old_backref_index (type)
      tree type;
 {
-  int tindex = 0;
+  size_t tindex;
 
   if (! is_back_referenceable_type (type))
     return -1;
@@ -311,7 +306,7 @@ old_backref_index (type)
   /* The entry for this parm is at maxtype-1, so don't look there for
      something to repeat.  */
   for (tindex = 0; tindex < maxtype - 1; ++tindex)
-    if (same_type_p (typevec[tindex], type))
+    if (same_type_p (VARRAY_TREE (typevec, tindex), type))
       break;
 
   if (tindex == maxtype - 1)
@@ -425,7 +420,7 @@ check_ktype (node, add)
      tree node;
      int add;
 {
-  int x;
+  size_t x;
   tree localnode = node;
 
   if (ktypelist == NULL)
@@ -434,20 +429,19 @@ check_ktype (node, add)
   if (TREE_CODE (node) == TYPE_DECL)
     localnode = TREE_TYPE (node);
 
-  for (x=0; x < maxktype; x++)
+  for (x = 0; x < maxktype; x++)
     {
-      if (same_type_p (localnode, ktypelist[x]))
+      if (same_type_p (localnode, VARRAY_TREE (ktypelist, x)))
         return x;
     }
   /* Didn't find it, so add it here.  */
   if (add)
     {
-      if (maxksize <= maxktype)
-        {
-          maxksize = maxksize* 3 / 2;
-          ktypelist = (tree *)xrealloc (ktypelist, sizeof (tree) * maxksize);
-        }
-      ktypelist[maxktype++] = localnode;
+      if (VARRAY_SIZE (ktypelist) <= maxktype)
+       VARRAY_GROW (ktypelist, 
+                    VARRAY_SIZE (ktypelist) * 3 / 2);
+      VARRAY_TREE (ktypelist, maxktype) = localnode;
+      maxktype++;
     }
   return -1;
 }
@@ -1166,8 +1160,9 @@ build_mangled_name (parmtypes, begin, end)
          if (old_style_repeats)
            {
              /* Every argument gets counted.  */
-             my_friendly_assert (maxtype < typevec_size, 387);
-             typevec[maxtype++] = parmtype;
+             my_friendly_assert (maxtype < VARRAY_SIZE (typevec), 387);
+             VARRAY_TREE (typevec, maxtype) = parmtype;
+             maxtype++;
            }
 
          if (last_type && same_type_p (parmtype, last_type))
@@ -1261,7 +1256,7 @@ static int
 check_btype (type) 
      tree type;
 {
-  int x;
+  size_t x;
 
   if (btypelist == NULL)
     return 0;
@@ -1270,7 +1265,7 @@ check_btype (type)
     return 0;
 
   for (x = 0; x < maxbtype; x++) 
-    if (same_type_p (type, btypelist[x]))
+    if (same_type_p (type, VARRAY_TREE (btypelist, x)))
       {
        OB_PUTC ('B');
        icat (x);
@@ -1279,15 +1274,14 @@ check_btype (type)
        return 1 ;
       }
 
-  if (maxbsize <= maxbtype) 
-    {
-      /* Enlarge the table.  */
-      maxbsize = maxbsize * 3 / 2;
-      btypelist = (tree *)xrealloc (btypelist, sizeof (tree) * maxbsize); 
-    }
-  
+  if (VARRAY_SIZE (btypelist) <= maxbtype) 
+    /* Enlarge the table.  */
+    VARRAY_GROW (btypelist,
+                VARRAY_SIZE (btypelist) * 3 / 2);
+
   /* Register the TYPE.  */
-  btypelist[maxbtype++] = type;
+  VARRAY_TREE (btypelist, maxbtype) = type;
+  maxbtype++;
 
   return 0;
 }
@@ -1638,12 +1632,12 @@ build_decl_overload_real (dname, parms, ret_type, tparms, targs,
       if (!flag_do_squangling)
         {
          /* Allocate typevec array.  */
+         size_t typevec_size = list_length (parms);
           maxtype = 0;
-         typevec_size = list_length (parms);
          if (!for_method && current_namespace != global_namespace)
            /* The namespace of a global function needs one slot.  */
            typevec_size++;
-          typevec = (tree *)alloca (typevec_size * sizeof (tree));
+         VARRAY_TREE_INIT (typevec, typevec_size, "typevec");
         }
       nofold = 0;
 
@@ -1655,8 +1649,9 @@ build_decl_overload_real (dname, parms, ret_type, tparms, targs,
 
           if (!flag_do_squangling) 
            {
-             my_friendly_assert (maxtype < typevec_size, 387);
-             typevec[maxtype++] = this_type;
+             my_friendly_assert (maxtype < VARRAY_SIZE (typevec), 387);
+             VARRAY_TREE (typevec, maxtype) = this_type;
+             maxtype++;
            }
 
          if (TREE_CHAIN (parms))
@@ -1671,15 +1666,16 @@ build_decl_overload_real (dname, parms, ret_type, tparms, targs,
          if (current_namespace != global_namespace
              && !flag_do_squangling)
            {
-             my_friendly_assert (maxtype < typevec_size, 387);
-             typevec[maxtype++] = current_namespace;
+             my_friendly_assert (maxtype < VARRAY_SIZE (typevec), 387);
+             VARRAY_TREE (typevec, maxtype) = current_namespace;
+             maxtype++;
            }
          build_mangled_name (parms, 0, 0);
        }
 
       if (!flag_do_squangling)
        /* Deallocate typevec array.  */
-       typevec = NULL;
+       VARRAY_FREE (typevec);
     }
 
   if (ret_type != NULL_TREE && for_method != 2)
index b04ce70..01d4f1f 100644 (file)
@@ -40,8 +40,8 @@ Boston, MA 02111-1307, USA.  */
 #include "except.h"
 #include "toplev.h"
 #include "rtl.h"
-#include "varray.h"
 #include "defaults.h"
+#include "ggc.h"
 
 /* The type of functions taking a tree, and some additional data, and
    returning an int.  */
@@ -52,9 +52,6 @@ extern struct obstack permanent_obstack;
 extern int lineno;
 extern char *input_filename;
 
-tree current_template_parms;
-HOST_WIDE_INT processing_template_decl;
-
 /* The PENDING_TEMPLATES is a TREE_LIST of templates whose
    instantiations have been deferred, either because their definitions
    were not yet available, or because we were putting off doing the
@@ -68,8 +65,6 @@ static tree *template_tail = &pending_templates;
 static tree maybe_templates;
 static tree *maybe_template_tail = &maybe_templates;
 
-int processing_specialization;
-int processing_explicit_instantiation;
 int processing_template_parmlist;
 static int template_header_count;
 
@@ -224,6 +219,16 @@ static void tsubst_default_arguments PROTO((tree));
 #define TMPL_PARMS_DEPTH(NODE) \
   (TREE_INT_CST_HIGH (TREE_PURPOSE (NODE)))
 
+/* Called once to initialize pt.c.  */
+
+void
+init_pt ()
+{
+  ggc_add_tree_root (&pending_templates, 1);
+  ggc_add_tree_root (&maybe_templates, 1);
+  ggc_add_tree_root (&saved_trees, 1);
+}
+
 /* Do any processing required when DECL (a member template declaration
    using TEMPLATE_PARAMETERS as its innermost parameter list) is
    finished.  Returns the TEMPLATE_DECL corresponding to DECL, unless
index e63c0e1..4adcc35 100644 (file)
@@ -32,6 +32,7 @@ Boston, MA 02111-1307, USA.  */
 #include "input.h"
 #include "obstack.h"
 #include "toplev.h"
+#include "ggc.h"
 
 static tree repo_get_id PROTO((tree));
 static char *extract_string PROTO((char **));
@@ -308,6 +309,9 @@ init_repo (filename)
   if (! flag_use_repository)
     return;
 
+  ggc_add_tree_root (&pending_repo, 1);
+  ggc_add_tree_root (&original_repo, 1);
+
   open_repo_file (filename);
 
   if (repo_file == 0)
index 62fa402..dc81a33 100644 (file)
@@ -31,7 +31,6 @@ Boston, MA 02111-1307, USA.  */
 #include "rtl.h"
 #include "output.h"
 #include "toplev.h"
-#include "varray.h"
 
 #define obstack_chunk_alloc xmalloc
 #define obstack_chunk_free free
@@ -176,8 +175,6 @@ pop_search_level (obstack)
   return stack;
 }
 \f
-static tree _vptr_name;
-
 /* Variables for gathering statistics.  */
 #ifdef GATHER_STATISTICS
 static int n_fields_searched;
@@ -584,7 +581,7 @@ lookup_field_1 (type, name)
       field = TREE_CHAIN (field);
     }
   /* Not found.  */
-  if (name == _vptr_name)
+  if (name == vptr_identifier)
     {
       /* Give the user what s/he thinks s/he wants.  */
       if (TYPE_VIRTUAL_P (type))
@@ -2792,7 +2789,6 @@ expand_indirect_vtbls_init (binfo, true_exp, decl_ptr)
 
       if (fixup_insns)
        {
-         extern tree in_charge_identifier;
          tree in_charge_node = lookup_name (in_charge_identifier, 0);
          if (! in_charge_node)
            {
@@ -3140,7 +3136,7 @@ void
 init_search_processing ()
 {
   gcc_obstack_init (&search_obstack);
-  _vptr_name = get_identifier ("_vptr");
+  vptr_identifier = get_identifier ("_vptr");
 }
 
 void