diff options
author | Nathan Sidwell <sidwell@codesourcery.com> | 2000-01-24 10:59:02 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2000-01-24 10:59:02 +0000 |
commit | 1aa4ccd4289970165bdfe3b39de3db0f4ed75af3 (patch) | |
tree | 2439ae1d2be86a3c044f0296508ee341d9dba2e9 | |
parent | db1147b2e23d260580bb08ce65259b28abe1d0fd (diff) | |
download | gcc-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
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/class.c | 77 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 1 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 4 |
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) |