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. * 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. From-SVN: r29135
This commit is contained in:
parent
565e3f3ec2
commit
9cd64686e8
117
gcc/cp/ChangeLog
117
gcc/cp/ChangeLog
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
211
gcc/cp/cp-tree.h
211
gcc/cp/cp-tree.h
|
@ -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)))
|
||||
|
||||
|
||||
/* 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 */
|
||||
|
|
206
gcc/cp/decl.c
206
gcc/cp/decl.c
|
@ -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;
|
||||
|
||||
/* 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 (¤t_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 (¤t_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 (¤t_function_return_value, 1);
|
||||
ggc_add_tree_root (¤t_function_parms, 1);
|
||||
ggc_add_tree_root (¤t_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 (¤t_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 (¤t_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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 (¤t_base_init_list, 1);
|
||||
ggc_add_tree_root (¤t_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);
|
||||
|
|
32
gcc/cp/lex.c
32
gcc/cp/lex.c
|
@ -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;
|
||||
|
||||
|
||||
/* 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)
|
||||
|
|
116
gcc/cp/method.c
116
gcc/cp/method.c
|
@ -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)
|
|||
|
||||
/* 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)
|
||||
|
|
17
gcc/cp/pt.c
17
gcc/cp/pt.c
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue