OSDN Git Service

move a few important patches (this offset calculations for vtables).
authormrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 15 Oct 1994 17:19:19 +0000 (17:19 +0000)
committermrs <mrs@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 15 Oct 1994 17:19:19 +0000 (17:19 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@8280 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/class.c

index a2391d2..2b0dc18 100644 (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
index c16b6f2..a3bcb26 100644 (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);