Commit a6786148 by Mark Mitchell Committed by Mark Mitchell

init.c (construct_virtual_bases): Don't look up the addresses of virtual bases at run-time.

	* init.c (construct_virtual_bases): Don't look up the addresses of
	virtual bases at run-time.

From-SVN: r31447
parent 31fcb1b9
2000-01-16 Mark Mitchell <mark@codesourcery.com> 2000-01-16 Mark Mitchell <mark@codesourcery.com>
* init.c (construct_virtual_bases): Don't look up the addresses of
virtual bases at run-time.
* class.c (build_vbase_pointer): Relocate. * class.c (build_vbase_pointer): Relocate.
(build_vbase_pointer_fields): Likewise. (build_vbase_pointer_fields): Likewise.
(dfs_build_vbase_offset_vtbl_entries): Likewise. (dfs_build_vbase_offset_vtbl_entries): Likewise.
......
...@@ -751,9 +751,9 @@ construct_virtual_bases (type, this_ref, this_ptr, init_list, flag) ...@@ -751,9 +751,9 @@ construct_virtual_bases (type, this_ref, this_ptr, init_list, flag)
for (vbases = CLASSTYPE_VBASECLASSES (type); vbases; for (vbases = CLASSTYPE_VBASECLASSES (type); vbases;
vbases = TREE_CHAIN (vbases)) vbases = TREE_CHAIN (vbases))
{ {
tree tmp = purpose_member (vbases, result);
tree inner_if_stmt; tree inner_if_stmt;
tree compound_stmt; tree compound_stmt;
tree exp;
/* If there are virtual base classes with destructors, we need to /* If there are virtual base classes with destructors, we need to
emit cleanups to destroy them if an exception is thrown during emit cleanups to destroy them if an exception is thrown during
...@@ -772,9 +772,20 @@ construct_virtual_bases (type, this_ref, this_ptr, init_list, flag) ...@@ -772,9 +772,20 @@ construct_virtual_bases (type, this_ref, this_ptr, init_list, flag)
inner_if_stmt = begin_if_stmt (); inner_if_stmt = begin_if_stmt ();
finish_if_stmt_cond (flag, inner_if_stmt); finish_if_stmt_cond (flag, inner_if_stmt);
compound_stmt = begin_compound_stmt (/*has_no_scope=*/1); compound_stmt = begin_compound_stmt (/*has_no_scope=*/1);
expand_aggr_vbase_init_1 (vbases, this_ref,
TREE_OPERAND (TREE_VALUE (tmp), 0), /* Compute the location of the virtual base. If we're
init_list); constructing virtual bases, then we must be the most derived
class. Therefore, we don't have to look up the virtual base;
we already know where it is. */
exp = build (PLUS_EXPR,
TREE_TYPE (this_ptr),
this_ptr,
BINFO_OFFSET (vbases));
exp = build1 (NOP_EXPR,
build_pointer_type (BINFO_TYPE (vbases)),
exp);
expand_aggr_vbase_init_1 (vbases, this_ref, exp, init_list);
finish_compound_stmt (/*has_no_scope=*/1, compound_stmt); finish_compound_stmt (/*has_no_scope=*/1, compound_stmt);
finish_then_clause (inner_if_stmt); finish_then_clause (inner_if_stmt);
finish_if_stmt (); finish_if_stmt ();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment