]> gcc.gnu.org Git - gcc.git/commitdiff
class.c (dfs_build_vcall_offset_vtbl_entries): Fix typo in comment.
authorMark Mitchell <mark@codesourcery.com>
Sun, 20 Feb 2000 02:46:56 +0000 (02:46 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Sun, 20 Feb 2000 02:46:56 +0000 (02:46 +0000)
* class.c (dfs_build_vcall_offset_vtbl_entries): Fix typo in
comment.
(build_vtable_entry): Don't assume all vtable entries are
functions.
(build_vtbl_initializer): Adjust accordingly.
(get_vtable_decl): Fix formatting.

From-SVN: r32069

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

index 00f0f3a069439163dbe3297b215ee429846a9a35..031a77fdefcf45481aa489b255bd7e360acef911 100644 (file)
@@ -1,3 +1,12 @@
+2000-02-19  Mark Mitchell  <mark@codesourcery.com>
+
+       * class.c (dfs_build_vcall_offset_vtbl_entries): Fix typo in
+       comment.
+       (build_vtable_entry): Don't assume all vtable entries are
+       functions.
+       (build_vtbl_initializer): Adjust accordingly.
+       (get_vtable_decl): Fix formatting.
+       
 2000-02-18  Jason Merrill  <jason@casey.cygnus.com>
 
        * semantics.c (deferred_type_access_control): Walk the entire
index a8ba1bda8aa5e4a35e465df43ea9a8d087599f26..f3f39ebe7f51d9ec8e5fdfeb25cdcf49fd2b80fd 100644 (file)
@@ -412,9 +412,8 @@ dfs_build_vcall_offset_vtbl_entries (binfo, data)
       fn = TREE_VALUE (virtuals);
       base = DECL_CONTEXT (fn);
 
-      /* The FN is comes from BASE.  So, we must caculate the
-        adjustment from the virtual base that derived from BINFO to
-        BASE.  */
+      /* The FN comes from BASE.  So, we must caculate the adjustment
+        from the virtual base that derived from BINFO to BASE.  */
       base_binfo = get_binfo (base, vod->derived, /*protect=*/0);
       offset = ssize_binop (MINUS_EXPR,
                            BINFO_OFFSET (base_binfo),
@@ -684,23 +683,18 @@ build_vbase_path (code, type, expr, path, nonnull)
 
 /* Build an entry in the virtual function table.  DELTA is the offset
    for the `this' pointer.  VCALL_INDEX is the vtable index containing
-   the vcall offset; zero if none.  FNDECL is the virtual function
-   itself.  */
+   the vcall offset; zero if none.  ENTRY is the virtual function
+   table entry itself.  It's TREE_TYPE must be VFUNC_PTR_TYPE_NODE,
+   but it may not actually be a virtual function table pointer.  (For
+   example, it might be the address of the RTTI object, under the new
+   ABI.)  */
 
 static tree
-build_vtable_entry (delta, vcall_index, fndecl)
+build_vtable_entry (delta, vcall_index, entry)
      tree delta;
      tree vcall_index;
-     tree fndecl;
+     tree entry;
 {
-  tree pfn;
-
-  /* Take the address of the function, considering it to be of an
-     appropriate generic type.  */
-  pfn = build1 (ADDR_EXPR, vfunc_ptr_type_node, fndecl);
-  /* The address of a function can't change.  */
-  TREE_CONSTANT (pfn) = 1;
-
   if (flag_vtable_thunks)
     {
       HOST_WIDE_INT idelta;
@@ -709,24 +703,24 @@ build_vtable_entry (delta, vcall_index, fndecl)
       idelta = TREE_INT_CST_LOW (delta);
       ivindex = TREE_INT_CST_LOW (vcall_index);
       if ((idelta || ivindex) 
-         && ! DECL_PURE_VIRTUAL_P (TREE_OPERAND (pfn, 0)))
+         && ! DECL_PURE_VIRTUAL_P (TREE_OPERAND (entry, 0)))
        {
-         pfn = make_thunk (pfn, idelta, ivindex);
-         pfn = build1 (ADDR_EXPR, vtable_entry_type, pfn);
-         TREE_READONLY (pfn) = 1;
-         TREE_CONSTANT (pfn) = 1;
+         entry = make_thunk (entry, idelta, ivindex);
+         entry = build1 (ADDR_EXPR, vtable_entry_type, entry);
+         TREE_READONLY (entry) = 1;
+         TREE_CONSTANT (entry) = 1;
        }
 #ifdef GATHER_STATISTICS
       n_vtable_entries += 1;
 #endif
-      return pfn;
+      return entry;
     }
   else
     {
       extern int flag_huge_objects;
       tree elems = tree_cons (NULL_TREE, delta,
                              tree_cons (NULL_TREE, integer_zero_node,
-                                        build_tree_list (NULL_TREE, pfn)));
+                                        build_tree_list (NULL_TREE, entry)));
       tree entry = build (CONSTRUCTOR, vtable_entry_type, NULL_TREE, elems);
 
       /* We don't use vcall offsets when not using vtable thunks.  */
@@ -1001,7 +995,8 @@ set_rtti_entry (virtuals, offset, type)
    impossible to actually build the vtable, but is useful to get at those
    which are known to exist in the runtime.  */
 
-tree get_vtable_decl (type, complete)
+tree 
+get_vtable_decl (type, complete)
      tree type;
      int complete;
 {
@@ -2694,6 +2689,7 @@ build_vtbl_initializer (binfo, t)
       tree delta;
       tree vcall_index;
       tree fn;
+      tree pfn;
       tree init;
 
       /* Pull the offset for `this', and the function to call, out of
@@ -2709,8 +2705,13 @@ build_vtbl_initializer (binfo, t)
       if (DECL_PURE_VIRTUAL_P (fn))
        fn = abort_fndecl;
 
-      /* Package up that information for the vtable.  */
-      init = build_vtable_entry (delta, vcall_index, fn);
+      /* Take the address of the function, considering it to be of an
+        appropriate generic type.  */
+      pfn = build1 (ADDR_EXPR, vfunc_ptr_type_node, fn);
+      /* The address of a function can't change.  */
+      TREE_CONSTANT (pfn) = 1;
+      /* Enter it in the vtable.  */
+      init = build_vtable_entry (delta, vcall_index, pfn);
       /* And add it to the chain of initializers.  */
       inits = tree_cons (NULL_TREE, init, inits);
 
@@ -3128,6 +3129,7 @@ modify_all_vtables (t, has_virtual_p, overridden_virtuals)
              /* We don't need to convert to a base class when calling
                 this function.  */
              DECL_VIRTUAL_CONTEXT (fn) = t;
+
              /* We don't need to adjust the `this' pointer when
                 calling this function.  */
              BV_DELTA (*fnsp) = integer_zero_node;
This page took 0.093558 seconds and 5 git commands to generate.