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
.
Go to the first, previous, next, last section, table of contents.