OSDN Git Service

* cp-tree.h (get_vtable_decl): Prototype new function.
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 24 Jan 2000 10:59:02 +0000 (10:59 +0000)
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 24 Jan 2000 10:59:02 +0000 (10:59 +0000)
* class.c (get_vtable_decl): New function. Broken out from ...
(build_vtable): ... here. Use it.
* decl2.c (finish_vtable_vardecl): Ignore dummy vtables created
by get_vtable_decl.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@31583 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/decl2.c

index 4502929..c50831b 100644 (file)
@@ -1,5 +1,13 @@
 2000-01-24  Nathan Sidwell  <sidwell@codesourcery.com>
 
+       * cp-tree.h (get_vtable_decl): Prototype new function.
+       * class.c (get_vtable_decl): New function. Broken out from ...
+       (build_vtable): ... here. Use it.
+       * decl2.c (finish_vtable_vardecl): Ignore dummy vtables created
+       by get_vtable_decl.
+
+2000-01-24  Nathan Sidwell  <sidwell@codesourcery.com>
+
        * cp-tree.h (CPTI_TP_DESC_TYPE, CPTI_ACCESS_MODE_TYPE,
        CPTI_USER_DESC_TYPE, CPTI_CLASS_DESC_TYPE, CPTI_ATTR_DESC_TYPE,
        CPTI_PTMF_DESC_TYPE): Remove cp_tree_index enumerations.
index c2d815f..c142324 100644 (file)
@@ -853,6 +853,54 @@ set_rtti_entry (virtuals, offset, type)
   TREE_VALUE (virtuals) = fn;
 }
 
+/* Get the VAR_DECL of the vtable for TYPE. TYPE need not be polymorphic,
+   or even complete.  If this does not exist, create it.  If COMPLETE is
+   non-zero, then complete the definition of it -- that will render it
+   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 type;
+     int complete;
+{
+  tree name = get_vtable_name (type);
+  tree decl = IDENTIFIER_GLOBAL_VALUE (name);
+  
+  if (decl)
+    {
+      my_friendly_assert (TREE_CODE (decl) == VAR_DECL
+                          && DECL_VIRTUAL_P (decl), 20000118);
+      return decl;
+    }
+  
+  decl = build_lang_decl (VAR_DECL, name, void_type_node);
+  
+  /* Set TREE_PUBLIC and TREE_EXTERN as appropriate.  */
+  import_export_vtable (decl, type, 0);
+
+  decl = pushdecl_top_level (decl);
+  SET_IDENTIFIER_GLOBAL_VALUE (name, decl);
+  
+  DECL_ARTIFICIAL (decl) = 1;
+  TREE_STATIC (decl) = 1;
+#ifndef WRITABLE_VTABLES
+  /* Make them READONLY by default. (mrs) */
+  TREE_READONLY (decl) = 1;
+#endif
+  /* At one time the vtable info was grabbed 2 words at a time.  This
+     fails on sparc unless you have 8-byte alignment.  (tiemann) */
+  DECL_ALIGN (decl) = MAX (TYPE_ALIGN (double_type_node),
+                          DECL_ALIGN (decl));
+
+  DECL_VIRTUAL_P (decl) = 1;
+  
+  if (complete)
+    cp_finish_decl (decl, NULL_TREE, NULL_TREE, 0);
+
+  DECL_CONTEXT (decl) = type;
+  return decl;
+}
+
 /* Build a virtual function for type TYPE.
    If BINFO is non-NULL, build the vtable starting with the initial
    approximation that it is the same as the one which is the head of
@@ -862,9 +910,10 @@ static void
 build_vtable (binfo, type)
      tree binfo, type;
 {
-  tree name = get_vtable_name (type);
   tree virtuals, decl;
 
+  decl = get_vtable_decl (type, /*complete=*/0);
+  
   if (binfo)
     {
       tree offset;
@@ -875,8 +924,8 @@ build_vtable (binfo, type)
        return;
 
       virtuals = copy_list (BINFO_VIRTUALS (binfo));
-      decl = build_lang_decl (VAR_DECL, name, 
-                             TREE_TYPE (BINFO_VTABLE (binfo)));
+      TREE_TYPE (decl) = TREE_TYPE (BINFO_VTABLE (binfo));
+      DECL_SIZE (decl) = TYPE_SIZE (TREE_TYPE (BINFO_VTABLE (binfo)));
 
       /* Now do rtti stuff.  */
       offset = get_derived_offset (TYPE_BINFO (type), NULL_TREE);
@@ -885,8 +934,9 @@ build_vtable (binfo, type)
     }
   else
     {
+      my_friendly_assert (TREE_CODE (TREE_TYPE (decl)) == VOID_TYPE,
+                          20000118);
       virtuals = NULL_TREE;
-      decl = build_lang_decl (VAR_DECL, name, void_type_node);
     }
 
 #ifdef GATHER_STATISTICS
@@ -894,30 +944,11 @@ build_vtable (binfo, type)
   n_vtable_elems += list_length (virtuals);
 #endif
 
-  /* Set TREE_PUBLIC and TREE_EXTERN as appropriate.  */
-  import_export_vtable (decl, type, 0);
-
-  decl = pushdecl_top_level (decl);
-  SET_IDENTIFIER_GLOBAL_VALUE (name, decl);
   /* Initialize the association list for this type, based
      on our first approximation.  */
   TYPE_BINFO_VTABLE (type) = decl;
   TYPE_BINFO_VIRTUALS (type) = virtuals;
 
-  DECL_ARTIFICIAL (decl) = 1;
-  TREE_STATIC (decl) = 1;
-#ifndef WRITABLE_VTABLES
-  /* Make them READONLY by default. (mrs) */
-  TREE_READONLY (decl) = 1;
-#endif
-  /* At one time the vtable info was grabbed 2 words at a time.  This
-     fails on sparc unless you have 8-byte alignment.  (tiemann) */
-  DECL_ALIGN (decl) = MAX (TYPE_ALIGN (double_type_node),
-                          DECL_ALIGN (decl));
-
-  DECL_VIRTUAL_P (decl) = 1;
-  DECL_CONTEXT (decl) = type;
-
   binfo = TYPE_BINFO (type);
   SET_BINFO_NEW_VTABLE_MARKED (binfo);
 }
index dea3c55..8b2a3df 100644 (file)
@@ -3492,6 +3492,7 @@ extern tree perform_implicit_conversion         PROTO((tree, tree));
 extern tree build_vbase_path                   PROTO((enum tree_code, tree, tree, tree, int));
 extern tree build_vtbl_ref                     PROTO((tree, tree));
 extern tree build_vfn_ref                      PROTO((tree *, tree, tree));
+extern tree get_vtable_decl                     PROTO((tree, int));
 extern void add_method                         PROTO((tree, tree *, tree));
 extern int currently_open_class                        PROTO((tree));
 extern tree get_vfield_offset                  PROTO((tree));
index bf0f07e..51f02ec 100644 (file)
@@ -2551,6 +2551,10 @@ finish_vtable_vardecl (t, data)
          || (hack_decl_function_context (vars) && TREE_USED (vars)))
       && ! TREE_ASM_WRITTEN (vars))
     {
+      if (TREE_TYPE (vars) == void_type_node)
+        /* It is a dummy vtable made by get_vtable_decl. Ignore it.  */
+        return 0;
+      
       /* Write it out.  */
       mark_vtable_entries (vars);
       if (TREE_TYPE (DECL_INITIAL (vars)) == 0)