From 13306d4f8f89e3a9107b4dc0cb830f9e0b2ffe42 Mon Sep 17 00:00:00 2001 From: Mike Stump Date: Sat, 15 Oct 1994 17:19:19 +0000 Subject: [PATCH] move a few important patches (this offset calculations for vtables). From-SVN: r8280 --- gcc/cp/ChangeLog | 13 +++++++++++++ gcc/cp/class.c | 18 ++++++++++++------ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a2391d20cc3..2b0dc18493b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +Fri Oct 14 18:54:48 1994 Mike Stump + + * 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 + + * 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 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index c16b6f20158..a3bcb26d3d2 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -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);