This section describes some of the routines used in the C++ front-end.
build_vtable
and prepare_fresh_vtable
is used only within the `cp-class.c' file, and only in finish_struct
and modify_vtable_entries
.
build_vtable
, prepare_fresh_vtable
, and finish_struct
are the only routines that set DECL_VPARENT
.
finish_struct
can steal the virtual function table from parents, this prohibits related_vslot from working. When finish_struct steals, we know that
get_binfo (DECL_FIELD_CONTEXT (CLASSTYPE_VFIELD (t)), t, 0)
will get the related binfo.
layout_basetypes
does something with the VIRTUALS.
Supposedly (according to Tiemann) most of the breadth first searching done, like in get_base_distance
and in get_binfo
was not because of any design decision. I have since found out the at least one part of the compiler needs the notion of depth first binfo searching, I am going to try and convert the whole thing, it should just work. The term left-most refers to the depth first left-most node. It uses MAIN_VARIANT == type
as the condition to get left-most, because the things that have BINFO_OFFSET
s of zero are shared and will have themselves as their own MAIN_VARIANT
s. The non-shared right ones, are copies of the left-most one, hence if it is its own MAIN_VARIANT
, we know it IS a left-most one, if it is not, it is a non-left-most one.
get_base_distance
's path and distance matters in its use in:
prepare_fresh_vtable
(the code is probably wrong)
init_vfields
Depends upon distance probably in a safe way, build_offset_ref might use partial paths to do further lookups, hack_identifier is probably not properly checking access.
get_first_matching_virtual
probably should check for get_base_distance
returning -2.
resolve_offset_ref
should be called in a more deterministic manner. Right now, it is called in some random contexts, like for arguments at build_method_call
time, default_conversion
time, convert_arguments
time, build_unary_op
time, build_c_cast
time, build_modify_expr
time, convert_for_assignment
time, and convert_for_initialization
time.
But, there are still more contexts it needs to be called in, one was the ever simple:
if (obj.*pmi != 7) ...
Seems that the problems were due to the fact that TREE_TYPE
of the OFFSET_REF
was not a OFFSET_TYPE
, but rather the type of the referent (like INTEGER_TYPE
). This problem was fixed by changing default_conversion
to check TREE_CODE (x)
, instead of only checking TREE_CODE (TREE_TYPE (x))
to see if it was OFFSET_TYPE
.