aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <sidwell@codesourcery.com>2000-01-24 10:59:02 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2000-01-24 10:59:02 +0000
commit1aa4ccd4289970165bdfe3b39de3db0f4ed75af3 (patch)
tree2439ae1d2be86a3c044f0296508ee341d9dba2e9 /gcc
parentdb1147b2e23d260580bb08ce65259b28abe1d0fd (diff)
downloadgcc-1aa4ccd4289970165bdfe3b39de3db0f4ed75af3.zip
gcc-1aa4ccd4289970165bdfe3b39de3db0f4ed75af3.tar.gz
gcc-1aa4ccd4289970165bdfe3b39de3db0f4ed75af3.tar.bz2
cp-tree.h (get_vtable_decl): Prototype new function.
* 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. From-SVN: r31583
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog8
-rw-r--r--gcc/cp/class.c77
-rw-r--r--gcc/cp/cp-tree.h1
-rw-r--r--gcc/cp/decl2.c4
4 files changed, 67 insertions, 23 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 4502929..c50831b 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index c2d815f..c142324 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -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);
}
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index dea3c55..8b2a3df 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -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));
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index bf0f07e..51f02ec 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -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)