* cp-tree.h (skip_rtti_stuff): Adjust prototype.
* class.c (skip_rtti_stuff): Reorganize parameters and return value.
(modify_one_vtable): Adjust.
(fixup_vtable_deltas1): Likewise.
(override_one_vtable): Likewise.
* search.c (get_abstract_virtuals_1): Likewise.
(get_pure_virtuals): Likewise.
(expand_upcast_fixups): Likewise.
* tree.c (debug_binfo): Likewise.
From-SVN: r31163
2000-01-01 Mark Mitchell <mark@codesourcery.com>
+ * cp-tree.h (skip_rtti_stuff): Adjust prototype.
+ * class.c (skip_rtti_stuff): Reorganize parameters and return value.
+ (modify_one_vtable): Adjust.
+ (fixup_vtable_deltas1): Likewise.
+ (override_one_vtable): Likewise.
+ * search.c (get_abstract_virtuals_1): Likewise.
+ (get_pure_virtuals): Likewise.
+ (expand_upcast_fixups): Likewise.
+ * tree.c (debug_binfo): Likewise.
+
* class.c (build_vtable): Don't return a value. Don't rebuild
vtables for bases that have already been handled.
(prepare_fresh_vtable): Don't rebuild vtables for bases that have
return offset;
}
-/* Skip RTTI information at the front of the virtual list. */
+/* Return the BINFO_VIRTUALS list for BINFO, without the RTTI stuff at
+ the front. If non-NULL, N is set to the number of entries
+ skipped. */
-unsigned HOST_WIDE_INT
-skip_rtti_stuff (virtuals, t)
- tree *virtuals, t;
+tree
+skip_rtti_stuff (binfo, t, n)
+ tree binfo;
+ tree t;
+ unsigned HOST_WIDE_INT *n;
{
- int n;
+ tree virtuals;
if (CLASSTYPE_COM_INTERFACE (t))
return 0;
- n = 0;
- if (*virtuals)
+ if (n)
+ *n = 0;
+ virtuals = BINFO_VIRTUALS (binfo);
+ if (virtuals)
{
/* We always reserve a slot for the offset/tdesc entry. */
- ++n;
- *virtuals = TREE_CHAIN (*virtuals);
+ if (n)
+ ++*n;
+ virtuals = TREE_CHAIN (virtuals);
}
- if (flag_vtable_thunks && *virtuals)
+ if (flag_vtable_thunks && virtuals)
{
/* The second slot is reserved for the tdesc pointer when thunks
are used. */
- ++n;
- *virtuals = TREE_CHAIN (*virtuals);
+ if (n)
+ ++*n;
+ virtuals = TREE_CHAIN (virtuals);
}
- return n;
+
+ return virtuals;
}
static void
modify_one_vtable (binfo, t, fndecl)
tree binfo, t, fndecl;
{
- tree virtuals = BINFO_VIRTUALS (binfo);
+ tree virtuals;
unsigned HOST_WIDE_INT n;
/* update rtti entry */
if (fndecl == NULL_TREE)
return;
- n = skip_rtti_stuff (&virtuals, BINFO_TYPE (binfo));
+ virtuals = skip_rtti_stuff (binfo, BINFO_TYPE (binfo), &n);
while (virtuals)
{
fixup_vtable_deltas1 (binfo, t)
tree binfo, t;
{
- tree virtuals = BINFO_VIRTUALS (binfo);
+ tree virtuals;
unsigned HOST_WIDE_INT n;
- n = skip_rtti_stuff (&virtuals, BINFO_TYPE (binfo));
+ virtuals = skip_rtti_stuff (binfo, BINFO_TYPE (binfo), &n);
while (virtuals)
{
override_one_vtable (binfo, old, t)
tree binfo, old, t;
{
- tree virtuals = BINFO_VIRTUALS (binfo);
- tree old_virtuals = BINFO_VIRTUALS (old);
+ tree virtuals;
+ tree old_virtuals;
enum { REUSE_NEW, REUSE_OLD, UNDECIDED, NEITHER } choose = UNDECIDED;
/* If we have already committed to modifying it, then don't try and
if (BINFO_NEW_VTABLE_MARKED (binfo))
choose = NEITHER;
- skip_rtti_stuff (&virtuals, BINFO_TYPE (binfo));
- skip_rtti_stuff (&old_virtuals, BINFO_TYPE (binfo));
+ virtuals = skip_rtti_stuff (binfo, BINFO_TYPE (binfo), NULL);
+ old_virtuals = skip_rtti_stuff (old, BINFO_TYPE (binfo), NULL);
while (virtuals)
{
extern void pop_lang_context PROTO((void));
extern tree instantiate_type PROTO((tree, tree, int));
extern void print_class_statistics PROTO((void));
-extern unsigned HOST_WIDE_INT skip_rtti_stuff PROTO((tree *, tree));
+extern tree skip_rtti_stuff PROTO((tree, tree, unsigned HOST_WIDE_INT *));
extern void build_self_reference PROTO((void));
extern void warn_hidden PROTO((tree));
extern tree get_enclosing_class PROTO((tree));
/* Should we use something besides CLASSTYPE_VFIELDS? */
if (do_self && CLASSTYPE_VFIELDS (BINFO_TYPE (binfo)))
{
- tree virtuals = BINFO_VIRTUALS (binfo);
+ tree virtuals;
- skip_rtti_stuff (&virtuals, BINFO_TYPE (binfo));
+ virtuals = skip_rtti_stuff (binfo, BINFO_TYPE (binfo), NULL);
while (virtuals)
{
for (vbases = CLASSTYPE_VBASECLASSES (type); vbases; vbases = TREE_CHAIN (vbases))
{
- tree virtuals = BINFO_VIRTUALS (vbases);
+ tree virtuals;
- skip_rtti_stuff (&virtuals, BINFO_TYPE (vbases));
+ virtuals = skip_rtti_stuff (vbases, BINFO_TYPE (vbases), NULL);
while (virtuals)
{
vbase_offsets)
tree binfo, addr, orig_addr, vbase, vbase_addr, t, *vbase_offsets;
{
- tree virtuals = BINFO_VIRTUALS (binfo);
+ tree virtuals;
tree vc;
tree delta;
unsigned HOST_WIDE_INT n;
*vbase_offsets = delta;
}
- n = skip_rtti_stuff (&virtuals, BINFO_TYPE (binfo));
+ virtuals = skip_rtti_stuff (binfo, BINFO_TYPE (binfo), &n);
while (virtuals)
{
else
fprintf (stderr, "no vtable decl yet\n");
fprintf (stderr, "virtuals:\n");
- virtuals = BINFO_VIRTUALS (elem);
-
- n = skip_rtti_stuff (&virtuals, BINFO_TYPE (elem));
+ virtuals = skip_rtti_stuff (elem, BINFO_TYPE (elem), &n);
while (virtuals)
{