move a few important patches (this offset calculations for vtables).

From-SVN: r8280
This commit is contained in:
Mike Stump 1994-10-15 17:19:19 +00:00 committed by Mike Stump
parent 13fbb03818
commit 13306d4f8f
2 changed files with 25 additions and 6 deletions

View File

@ -1,3 +1,8 @@
Fri Oct 14 18:54:48 1994 Mike Stump <mrs@cygnus.com>
* class.c (modify_one_vtable): Since the DECL_CONTEXT of fndecl can
be set just below, use current_fndecl instead.
Thu Oct 13 17:44:55 1994 Jason Merrill (jason@phydeaux.cygnus.com)
* method.c (build_decl_overload): Set numeric_outputed_need_bar to 0.
@ -40,6 +45,14 @@ Tue Oct 11 23:48:31 1994 Jason Merrill (jason@phydeaux.cygnus.com)
* various: Cast pointer arguments to bzero and bcopy to char *.
Tue Oct 11 19:34:32 1994 Mike Stump <mrs@cygnus.com>
* class.c (get_derived_offset): Added a type parameter to limit how
far up the CLASSTYPE_VFIELD_PARENT chain we search.
* class.c (modify_one_vtable, fixup_vtable_deltas): When forming the
offset to put into the vtable for the this parameter, make sure we
don't offset from a parent of the DECL_CONTEXT of the function.
Mon Oct 10 00:56:53 1994 Jason Merrill (jason@phydeaux.cygnus.com)
* lex.c (cons_up_default_function): Mark methods in a template class

View File

@ -1119,10 +1119,14 @@ get_vfield_offset (binfo)
BINFO_OFFSET (binfo));
}
/* Get the offset to the start of the original binfo that we derived this
binfo from. */
tree get_derived_offset (binfo)
tree binfo;
/* Get the offset to the start of the original binfo that we derived
this binfo from. If we find TYPE first, return the offset only
that far. The shortened search is useful because the this pointer
on method calling is expected to point to a DECL_CONTEXT (fndecl)
object, and not a baseclass of it. */
static tree
get_derived_offset (binfo, type)
tree binfo, type;
{
tree offset1 = get_vfield_offset (TYPE_BINFO (BINFO_TYPE (binfo)));
tree offset2;
@ -1131,6 +1135,8 @@ tree get_derived_offset (binfo)
&& (i=CLASSTYPE_VFIELD_PARENT (BINFO_TYPE (binfo))) != -1)
{
tree binfos = BINFO_BASETYPES (binfo);
if (BINFO_TYPE (binfo) == type)
break;
binfo = TREE_VEC_ELT (binfos, i);
}
offset2 = get_vfield_offset (TYPE_BINFO (BINFO_TYPE (binfo)));
@ -2261,7 +2267,7 @@ modify_one_vtable (binfo, t, fndecl, pfn)
Also, we want just the delta bewteen the most base class
that we derived this vfield from and us. */
base_offset = size_binop (PLUS_EXPR,
get_derived_offset (binfo),
get_derived_offset (binfo, DECL_CONTEXT (current_fndecl)),
BINFO_OFFSET (binfo));
this_offset = size_binop (MINUS_EXPR, offset, base_offset);
@ -2366,7 +2372,7 @@ fixup_vtable_deltas (binfo, t)
Also, we want just the delta bewteen the most base class
that we derived this vfield from and us. */
base_offset = size_binop (PLUS_EXPR,
get_derived_offset (binfo),
get_derived_offset (binfo, DECL_CONTEXT (fndecl)),
BINFO_OFFSET (binfo));
this_offset = size_binop (MINUS_EXPR, offset, base_offset);