diff options
author | Mike Stump <mrs@cygnus.com> | 1994-10-15 17:19:19 +0000 |
---|---|---|
committer | Mike Stump <mrs@gcc.gnu.org> | 1994-10-15 17:19:19 +0000 |
commit | 13306d4f8f89e3a9107b4dc0cb830f9e0b2ffe42 (patch) | |
tree | 33f665d738bb626689e1712c9c078587a18a55d4 /gcc | |
parent | 13fbb038189e72f6ba1ff8ffe13de137060a7187 (diff) | |
download | gcc-13306d4f8f89e3a9107b4dc0cb830f9e0b2ffe42.zip gcc-13306d4f8f89e3a9107b4dc0cb830f9e0b2ffe42.tar.gz gcc-13306d4f8f89e3a9107b4dc0cb830f9e0b2ffe42.tar.bz2 |
move a few important patches (this offset calculations for vtables).
From-SVN: r8280
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/cp/class.c | 18 |
2 files changed, 25 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a2391d2..2b0dc18 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index c16b6f2..a3bcb26d 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); |