This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[C++ PATCH] Fix new ABI ctor vtables


Hi,
I've installed the attached patch which fixes the new ABI constructor
vtables. There was a fault in the specification, where some bases would
not get or expect a constructor vtable. There were some implementation
faults due to (a) the spec changing, (b) the non-obvious impacts of
having a nearly-empty virtual primary base.

We still generate incorrect vcall offsets in the constructor vtables,
but we do now
1) generate the correct offset-to-top information
2) correct vtables for primary virtual bases
3) all the expected vtables
4) mark the primary bases correctly.

Mark, I had to change the primary base marking again, as there _was_
another pathelogical case. We _have_ to walk the bases in inheritance
graph order, and then fix up things when we discover a base starts using
an already walked virtual as its primary. The problem is that
the ABI algorithm naturally considers virtual bases to be shared, but we
unshare the binfos for virtual base classes.

built & tested on i686-pc-linux-gnu, approved by Mark.

Please note that this is an ABI *change*, and not backwards compatible with
previous snapshots. It should be restricted to class hierarchies involving
polymorphic virtual bases.

now to get to the vcall offset generation.

nathan
-- 
Dr Nathan Sidwell   ::   http://www.codesourcery.com   ::   CodeSourcery LLC
         'But that's a lie.' - 'Yes it is. What's your point?'
nathan@codesourcery.com : http://www.cs.bris.ac.uk/~nathan/ : nathan@acm.org
2001-02-05  Nathan Sidwell  <nathan@codesourcery.com>

	* invoke.texi (-fdump-class-layout): Document.
	(-fdump-translation-unit): Use `=' as filename separator.

2001-02-05  Nathan Sidwell  <nathan@codesourcery.com>

	Fix specification and implementation bugs in V3 ABI
	construction vtables.
	* cp-tree.h (flag_dump_class_layout): New flag.
	(BINFO_OVERRIDE_ALONG_VIRTUAL_PATH_P): Remove.
	(BINFO_LOST_PRIMARY_P): New flag.
	(SET_BINFO_NEW_VTABLE_MARKED): Adjust asserts.
	(BINFO_PRIMARY_MARKED_P): Rename to ...
	(BINFO_PRIMARY_P): ... here.
	(binfo_via_virtual): New prototype.
	* decl2.c (flag_dump_class_layout): New flag.
	(cxx_decode_option): Set it. Adjust -fdump-translation-unit to
	use `=' as a file name separator.
	* init.c (dfs_initialize_vtbl_ptrs): Walk into virtual primary
	bases.
	(build_vtbl_address): If this is a virtual primary base, then
	get the vtbl of what it is ultimately primary for.
	* search.c (dfs_skip_nonprimary_vbases_unmarkedp): Adjust
	for BINFO_PRIMARY_P.
	(dfs_skip_nonprimary_vbases_markedp): Likewise.
	(get_shared_vbase_if_not_primary): Likewise.
	(dfs_get_pure_virtuals): Likewise.
	(expand_upcast_fixups): Likewise.
	(fixup_virtual_upcast_offsets): Likewise.
	(dfs_find_vbase_instance): Likewise.
	(find_vbase_instance): Likewise.
	(binfo_from_vbase): Adjust comment to reflect reality.
	(binfo_via_virtual): New function.
	* class.c (VTT_TOP_LEVEL_P, VTT_MARKED_BINFO_P): New macros
	for binfo walking during VTT construction.
	(dfs_mark_primary_bases): Remove.
	(force_canonical_binfo_r): New function.
	(force_canonical_binfo): New function.
	(mark_primary_virtual_base): New function.
	(mark_primary_bases): Walk in inheritance graph order, use
	mark_primary_virtual_base.
	(determine_primary_base): Use some more intermediate variables.
	(dfs_find_final_overrider): Don't check for overriding along a
	virtual path.
	(dfs_modify_vtables): Walk into primary virtual bases too.
	(walk_subobject_offsets): Adjust for BINFO_PRIMARY_P.
	(build_base_fields): Likewise.
	(dfs_set_offset_for_unshared_vbases): Likewise.
	(layout_virtual_bases): Likewise.
	(end_of_class): Likewise.
	(finish_struct_1): Call dump_class_hierarchy, if requested.
	(dfs_get_primary_binfo): Use BINFO_TYPE for binfos.
	(dump_class_hierarchy_r): Add stream parameter. Emit more information.
	(dump_class_hierarchy): Add file parameter. Append to file, if
	required.
	(finish_vtbls): Adjust accumulate_vtbl_inits call.
	Use canonical base for virtual bases.
	(build_vtt): Add more comments. Adjust build_vtt_inits call.
	(build_vtt_inits): Remove VIRTUAL_VTTS_P parm.
	Only set BINFO_VPTR_INDEX on top level. Use VTT_TOP_LEVEL_P,
	VTT_MARKED_BINFO_P for binfo walking. Use canonical vbase for
	virtual VTTs.
	(dfs_build_secondary_vptr_vtt_inits): Extract VTT_TOP_LEVEL_P
	from DATA.  We want virtual primary bases and all bases via virtual.
	Only set BINFO_VPTR_INDEX for top level. Look up from a primary
	virtual base when not a construction vtable.
	(dfs_ctor_vtable_bases_queue_p): New DFS predicate.
	(build_ctor_vtbl_group): Adjust accumulate_vtbl_inits call.
	Use canonical bases when processing virtual bases.
	(accumulate_vtbl_inits): We're interested in any base via a
	virtual path.
	(dfs_accumulate_vtbl_inits): If this is a primary virtual base
	within a construction vtable, determine what is being overridden.
	(build_vtbl_initializer): Add more comments
	(add_vcall_offset_vtbl_entries_1): Adjust comment.
	(build_rtti_vtbl_entries): Check if the base has lost its
	primary.

2001-02-05  Nathan Sidwell  <nathan@codesourcery.com>

	* g++.old-deja/g++.abi/primary2.C: New test.
	* g++.old-deja/g++.abi/primary3.C: New test.
	* g++.old-deja/g++.abi/primary4.C: New test.
	* g++.old-deja/g++.abi/primary5.C: New test.
	* g++.old-deja/g++.abi/vtable3.h: New test.
	* g++.old-deja/g++.abi/vtable3a.C: New test.
	* g++.old-deja/g++.abi/vtable3b.C: New test.
	* g++.old-deja/g++.abi/vtable3c.C: New test.
	* g++.old-deja/g++.abi/vtable3d.C: New test.
	* g++.old-deja/g++.abi/vtable3e.C: New test.
	* g++.old-deja/g++.abi/vtable3f.C: New test.
	* g++.old-deja/g++.abi/vtable3g.C: New test.
	* g++.old-deja/g++.abi/vtable3h.C: New test.
	* g++.old-deja/g++.abi/vtable3i.C: New test.
	* g++.old-deja/g++.abi/vtable3j.C: New test.
	* g++.old-deja/g++.oliva/thunk1.C: Remove XFAIL.

1672-3.patch.gz


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]