aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Stump <mrs@cygnus.com>1994-10-15 17:19:19 +0000
committerMike Stump <mrs@gcc.gnu.org>1994-10-15 17:19:19 +0000
commit13306d4f8f89e3a9107b4dc0cb830f9e0b2ffe42 (patch)
tree33f665d738bb626689e1712c9c078587a18a55d4
parent13fbb038189e72f6ba1ff8ffe13de137060a7187 (diff)
downloadgcc-13306d4f8f89e3a9107b4dc0cb830f9e0b2ffe42.zip
gcc-13306d4f8f89e3a9107b4dc0cb830f9e0b2ffe42.tar.gz
gcc-13306d4f8f89e3a9107b4dc0cb830f9e0b2ffe42.tar.bz2
move a few important patches (this offset calculations for vtables).
From-SVN: r8280
-rw-r--r--gcc/cp/ChangeLog13
-rw-r--r--gcc/cp/class.c18
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);