cp-tree.h (expand_direct_vtbls_init): Remove declaration.

* cp-tree.h (expand_direct_vtbls_init): Remove declaration.
	(initialize_vtbl_ptrs): New function.
	(expand_indirect_vtbls_init): Change prototype.
	(convert_pointer_to_vbase): Declare.
	* init.c (expand_direct_vtbls_init): Remove.
	(dfs_initialize_vtbl_ptrs): New function.
	(initialize_vtbl_ptrs): Likewise.
	(emit_base_init): Use initialize_vtbl_ptrs.
	* search.c (convert_pointer_to_vbase): Make it global.
	(expand_indirect_vtbls_init): Remove vtable initialization code.
	* semantics.c (setup_vtbl_ptr): Use initialize_vtbl_ptrs.

From-SVN: r31314
This commit is contained in:
Mark Mitchell 2000-01-11 02:43:00 +00:00 committed by Mark Mitchell
parent 4a314e0c77
commit d569399b27
5 changed files with 68 additions and 87 deletions

View File

@ -1,5 +1,17 @@
2000-01-10 Mark Mitchell <mitchell@dumbledore.codesourcery.com>
* cp-tree.h (expand_direct_vtbls_init): Remove declaration.
(initialize_vtbl_ptrs): New function.
(expand_indirect_vtbls_init): Change prototype.
(convert_pointer_to_vbase): Declare.
* init.c (expand_direct_vtbls_init): Remove.
(dfs_initialize_vtbl_ptrs): New function.
(initialize_vtbl_ptrs): Likewise.
(emit_base_init): Use initialize_vtbl_ptrs.
* search.c (convert_pointer_to_vbase): Make it global.
(expand_indirect_vtbls_init): Remove vtable initialization code.
* semantics.c (setup_vtbl_ptr): Use initialize_vtbl_ptrs.
* class.c (dfs_finish_vtbls): New function.
(finish_vtbls): Use it.
(dump_class_hierarchy): New function.

View File

@ -3734,7 +3734,6 @@ extern tree do_friend PROTO((tree, tree, tree, tree, tree, enum overload_flag
/* in init.c */
extern void init_init_processing PROTO((void));
extern void expand_direct_vtbls_init PROTO((tree, tree, int, int, tree));
extern tree emit_base_init PROTO((tree));
extern void check_base_init PROTO((tree));
extern void expand_member_init PROTO((tree, tree, tree));
@ -3757,6 +3756,7 @@ extern tree build_vec_delete PROTO((tree, tree, tree, int));
extern tree create_temporary_var PROTO((tree));
extern void begin_init_stmts PROTO((tree *, tree *));
extern tree finish_init_stmts PROTO((tree, tree));
extern void initialize_vtbl_ptrs PROTO((tree, tree));
/* in input.c */
@ -3926,7 +3926,7 @@ extern tree lookup_nested_tag PROTO((tree, tree));
extern tree get_matching_virtual PROTO((tree, tree, int));
extern void get_pure_virtuals PROTO((tree));
extern tree init_vbase_pointers PROTO((tree, tree));
extern void expand_indirect_vtbls_init PROTO((tree, tree, tree));
extern void expand_indirect_vtbls_init PROTO((tree, tree));
extern void clear_search_slots PROTO((tree));
extern void get_vbase_types PROTO((tree));
extern void maybe_suppress_debug_info PROTO((tree));
@ -3955,6 +3955,7 @@ extern tree dfs_skip_nonprimary_vbases_markedp PROTO((tree, void *));
extern tree dfs_unmarked_real_bases_queue_p PROTO((tree, void *));
extern tree dfs_marked_real_bases_queue_p PROTO((tree, void *));
extern void mark_primary_bases PROTO((tree));
extern tree convert_pointer_to_vbase PROTO((tree, tree));
/* in semantics.c */
extern void finish_expr_stmt PROTO((tree));

View File

@ -1,5 +1,5 @@
/* Handle initialization things in C++.
Copyright (C) 1987, 89, 92-98, 1999 Free Software Foundation, Inc.
Copyright (C) 1987, 89, 92-98, 1999, 2000 Free Software Foundation, Inc.
Contributed by Michael Tiemann (tiemann@cygnus.com)
This file is part of GNU CC.
@ -48,6 +48,7 @@ static tree initializing_context PROTO((tree));
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));
static tree dfs_initialize_vtbl_ptrs PROTO((tree, void *));
/* Set up local variable for this file. MUST BE CALLED AFTER
INIT_DECL_PROCESSING. */
@ -77,59 +78,55 @@ void init_init_processing ()
ggc_add_tree_root (&BI_header_size, 1);
}
/* Subroutine of emit_base_init. For BINFO, initialize all the
virtual function table pointers, except those that come from
virtual base classes. Initialize binfo's vtable pointer, if
INIT_SELF is true. CAN_ELIDE is true when we know that all virtual
function table pointers in all bases have been initialized already,
probably because their constructors have just be run. ADDR is the
pointer to the object whos vtables we are going to initialize.
/* Called from initialize_vtbl_ptrs via dfs_walk. */
REAL_BINFO is usually the same as BINFO, except when addr is not of
pointer to the type of the real derived type that we want to
initialize for. This is the case when addr is a pointer to a sub
object of a complete object, and we only want to do part of the
complete object's initialization of vtable pointers. This is done
for all virtual table pointers in virtual base classes. REAL_BINFO
is used to find the BINFO_VTABLE that we initialize with. BINFO is
used for conversions of addr to subobjects.
static tree
dfs_initialize_vtbl_ptrs (binfo, data)
tree binfo;
void *data;
{
if (!BINFO_PRIMARY_MARKED_P (binfo)
&& CLASSTYPE_VFIELDS (BINFO_TYPE (binfo)))
{
tree base_ptr = TREE_VALUE ((tree) data);
BINFO_TYPE (real_binfo) must be BINFO_TYPE (binfo).
if (TREE_VIA_VIRTUAL (binfo))
base_ptr = convert_pointer_to_vbase (BINFO_TYPE (binfo),
base_ptr);
else
base_ptr
= build_vbase_path (PLUS_EXPR,
build_pointer_type (BINFO_TYPE (binfo)),
base_ptr,
binfo,
/*nonnull=*/1);
Relies upon binfo being inside TYPE_BINFO (TREE_TYPE (TREE_TYPE
(addr))). */
expand_virtual_init (binfo, base_ptr);
}
SET_BINFO_MARKED (binfo);
return NULL_TREE;
}
/* Initialize all the vtable pointers for the hierarchy dominated by
TYPE. */
void
expand_direct_vtbls_init (real_binfo, binfo, init_self, can_elide, addr)
tree real_binfo, binfo, addr;
int init_self, can_elide;
initialize_vtbl_ptrs (type, addr)
tree type;
tree addr;
{
tree real_binfos = BINFO_BASETYPES (real_binfo);
tree binfos = BINFO_BASETYPES (binfo);
int i, n_baselinks = real_binfos ? TREE_VEC_LENGTH (real_binfos) : 0;
tree list = build_tree_list (type, addr);
for (i = 0; i < n_baselinks; i++)
{
tree real_base_binfo = TREE_VEC_ELT (real_binfos, i);
tree base_binfo = TREE_VEC_ELT (binfos, i);
int is_not_base_vtable
= i != CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (real_binfo));
if (! TREE_VIA_VIRTUAL (real_base_binfo))
expand_direct_vtbls_init (real_base_binfo, base_binfo,
is_not_base_vtable, can_elide, addr);
}
#if 0
/* Before turning this on, make sure it is correct. */
if (can_elide && ! BINFO_MODIFIED (binfo))
return;
#endif
/* Should we use something besides CLASSTYPE_VFIELDS? */
if (init_self && CLASSTYPE_VFIELDS (BINFO_TYPE (real_binfo)))
{
tree base_ptr = convert_pointer_to_real (binfo, addr);
expand_virtual_init (real_binfo, base_ptr);
}
dfs_walk (TYPE_BINFO (type), dfs_initialize_vtbl_ptrs,
dfs_unmarked_real_bases_queue_p, list);
dfs_walk (TYPE_BINFO (type), dfs_unmark,
dfs_marked_real_bases_queue_p, type);
if (TYPE_USES_VIRTUAL_BASECLASSES (type))
expand_indirect_vtbls_init (TYPE_BINFO (type), addr);
}
/* 348 - 351 */
/* Subroutine of emit_base_init. */
@ -547,14 +544,8 @@ emit_base_init (t)
rbase_init_list = TREE_CHAIN (rbase_init_list);
}
/* Initialize all the virtual function table fields that
do come from virtual base classes. */
if (TYPE_USES_VIRTUAL_BASECLASSES (t))
expand_indirect_vtbls_init (t_binfo, current_class_ref, current_class_ptr);
/* Initialize all the virtual function table fields that
do not come from virtual base classes. */
expand_direct_vtbls_init (t_binfo, t_binfo, 1, 1, current_class_ptr);
/* Initialize the vtable pointers for the class. */
initialize_vtbl_ptrs (t, current_class_ptr);
for (member = TYPE_FIELDS (t); member; member = TREE_CHAIN (member))
{

View File

@ -77,7 +77,6 @@ static struct search_level *search_stack;
static tree next_baselink PROTO((tree));
static tree get_vbase_1 PROTO((tree, tree, unsigned int *));
static tree convert_pointer_to_vbase PROTO((tree, tree));
static tree lookup_field_1 PROTO((tree, tree));
static tree convert_pointer_to_single_level PROTO((tree, tree));
static int lookup_fnfields_here PROTO((tree, tree));
@ -249,7 +248,7 @@ get_vbase (parent, binfo)
EXPR is a non-null POINTER_TYPE to RECORD_TYPE. We also know that
the type of what expr points to has a virtual base of type TYPE. */
static tree
tree
convert_pointer_to_vbase (type, expr)
tree type;
tree expr;
@ -3004,9 +3003,9 @@ fixup_all_virtual_upcast_offsets (type, decl_ptr)
sub-object we are initializing. */
void
expand_indirect_vtbls_init (binfo, true_exp, decl_ptr)
expand_indirect_vtbls_init (binfo, decl_ptr)
tree binfo;
tree true_exp, decl_ptr;
tree decl_ptr;
{
tree type = BINFO_TYPE (binfo);
@ -3025,29 +3024,11 @@ expand_indirect_vtbls_init (binfo, true_exp, decl_ptr)
{
tree vbases = CLASSTYPE_VBASECLASSES (type);
struct vbase_info vi;
vi.decl_ptr = (true_exp ? build_unary_op (ADDR_EXPR, true_exp, 0)
: decl_ptr);
vi.decl_ptr = decl_ptr;
vi.vbase_types = vbases;
dfs_walk (binfo, dfs_find_vbases, unmarked_new_vtablep, &vi);
/* Initialized with vtables of type TYPE. */
for (; vbases; vbases = TREE_CHAIN (vbases))
{
tree addr;
addr = convert_pointer_to_vbase (TREE_TYPE (vbases), vi.decl_ptr);
/* Do all vtables from this virtual base. */
/* This assumes that virtual bases can never serve as parent
binfos. (in the CLASSTYPE_VFIELD_PARENT sense) */
expand_direct_vtbls_init (vbases, TYPE_BINFO (BINFO_TYPE (vbases)),
1, 0, addr);
}
fixup_all_virtual_upcast_offsets (type,
vi.decl_ptr);
fixup_all_virtual_upcast_offsets (type, vi.decl_ptr);
dfs_walk (binfo, dfs_clear_vbase_slots, marked_new_vtablep, 0);
}
}

View File

@ -3,7 +3,7 @@
building RTL. These routines are used both during actual parsing
and during the instantiation of template functions.
Copyright (C) 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
Written by Mark Mitchell (mmitchell@usa.net) based on code found
formerly in parse.y and pt.c.
@ -1245,7 +1245,6 @@ setup_vtbl_ptr ()
else if (DECL_DESTRUCTOR_P (current_function_decl)
&& !processing_template_decl)
{
tree binfo = TYPE_BINFO (current_class_type);
tree if_stmt;
tree compound_stmt;
int saved_cfnd;
@ -1279,11 +1278,8 @@ setup_vtbl_ptr ()
/* Make all virtual function table pointers in non-virtual base
classes point to CURRENT_CLASS_TYPE's virtual function
tables. */
expand_direct_vtbls_init (binfo, binfo, 1, 0, current_class_ptr);
if (TYPE_USES_VIRTUAL_BASECLASSES (current_class_type))
expand_indirect_vtbls_init (binfo, current_class_ref,
current_class_ptr);
initialize_vtbl_ptrs (current_class_type,
current_class_ptr);
finish_compound_stmt (/*has_no_scope=*/0, compound_stmt);
finish_then_clause (if_stmt);