From b9f89fd30af99d65346f3f97ed439965d3eb5f99 Mon Sep 17 00:00:00 2001 From: nathan Date: Tue, 31 Jul 2001 16:12:04 +0000 Subject: [PATCH] cp: The 3.0 ABI no longer has vbase pointer fields. * cp-tree.h (VBASE_NAME, VBASE_NAME_FORMAT, VBASE_NAME_P, FORMAT_VBASE_NAME): Remove. * method.c (do_build_copy_constructor): Adjust. (do_build_assign_ref): Adjust. * search.c (lookup_field_r): Adjust. * typeck.c (build_component_ref): Adjust. The 3.0 ABI always has a vtable pointer at the start of every polymorphic class. * rtti.c (build_headof_sub): Remove. (build_headof): Adjust. (get_tinfo_decl_dynamic): No need to check flag_rtti here. Adjust. (create_real_tinfo_var): Explain why we need a hidden name. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@44515 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 18 ++++++++++++++++++ gcc/cp/cp-tree.h | 21 --------------------- gcc/cp/method.c | 4 ---- gcc/cp/rtti.c | 38 ++++---------------------------------- gcc/cp/search.c | 9 --------- gcc/cp/typeck.c | 11 +---------- 6 files changed, 23 insertions(+), 78 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ed40395..39689e8 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,23 @@ 2001-07-31 Nathan Sidwell + The 3.0 ABI no longer has vbase pointer fields. + * cp-tree.h (VBASE_NAME, VBASE_NAME_FORMAT, VBASE_NAME_P, + FORMAT_VBASE_NAME): Remove. + * method.c (do_build_copy_constructor): Adjust. + (do_build_assign_ref): Adjust. + * search.c (lookup_field_r): Adjust. + * typeck.c (build_component_ref): Adjust. + + The 3.0 ABI always has a vtable pointer at the start of every + polymorphic class. + * rtti.c (build_headof_sub): Remove. + (build_headof): Adjust. + (get_tinfo_decl_dynamic): No need to check flag_rtti + here. Adjust. + (create_real_tinfo_var): Explain why we need a hidden name. + +2001-07-31 Nathan Sidwell + PR c++/3631 * class.c (update_vtable_entry_for_fn): The fixed adjustment of a virtual thunk should be from declaring base. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index d5f10e4..c485c43 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -3140,8 +3140,6 @@ extern varray_type local_classes; #define VFIELD_BASE "$vf" #define VFIELD_NAME "_vptr$" #define VFIELD_NAME_FORMAT "_vptr$%s" -#define VBASE_NAME "_vb$" -#define VBASE_NAME_FORMAT "_vb$%s" #define STATIC_NAME_FORMAT "_%s$%s" #define ANON_AGGRNAME_FORMAT "$_%d" @@ -3162,8 +3160,6 @@ extern varray_type local_classes; #define VFIELD_BASE ".vf" #define VFIELD_NAME "_vptr." #define VFIELD_NAME_FORMAT "_vptr.%s" -#define VBASE_NAME "_vb." -#define VBASE_NAME_FORMAT "_vb.%s" #define STATIC_NAME_FORMAT "_%s.%s" #define ANON_AGGRNAME_FORMAT "._%d" @@ -3197,11 +3193,6 @@ extern varray_type local_classes; (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, \ sizeof (VFIELD_NAME) - 1)) #define VFIELD_NAME_FORMAT "_vptr_%s" -#define VBASE_NAME "__vb_" -#define VBASE_NAME_P(ID_NODE) \ - (!strncmp (IDENTIFIER_POINTER (ID_NODE), VBASE_NAME, \ - sizeof (VBASE_NAME) - 1)) -#define VBASE_NAME_FORMAT "__vb_%s" #define STATIC_NAME_FORMAT "__static_%s_%s" #define ANON_AGGRNAME_PREFIX "__anon_" @@ -3244,10 +3235,6 @@ extern varray_type local_classes; && IDENTIFIER_POINTER (ID_NODE)[2] == 't' \ && IDENTIFIER_POINTER (ID_NODE)[3] == JOINER) -#define VBASE_NAME_P(ID_NODE) (IDENTIFIER_POINTER (ID_NODE)[1] == 'v' \ - && IDENTIFIER_POINTER (ID_NODE)[2] == 'b' \ - && IDENTIFIER_POINTER (ID_NODE)[3] == JOINER) - #define TEMP_NAME_P(ID_NODE) (!strncmp (IDENTIFIER_POINTER (ID_NODE), AUTO_TEMP_NAME, sizeof (AUTO_TEMP_NAME)-1)) #define VFIELD_NAME_P(ID_NODE) (!strncmp (IDENTIFIER_POINTER (ID_NODE), VFIELD_NAME, sizeof(VFIELD_NAME)-1)) @@ -3261,14 +3248,6 @@ extern varray_type local_classes; && IDENTIFIER_POINTER (ID_NODE)[1] <= '9') #endif /* !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) */ -/* Store the vbase pointer field name for type TYPE into pointer BUF. */ -#define FORMAT_VBASE_NAME(BUF,TYPE) do { \ - char *wbuf = (char *) alloca (TYPE_ASSEMBLER_NAME_LENGTH (TYPE) \ - + sizeof (VBASE_NAME) + 1); \ - sprintf (wbuf, VBASE_NAME_FORMAT, TYPE_ASSEMBLER_NAME_STRING (TYPE)); \ - (BUF) = wbuf; \ -} while (0) - /* Returns non-zero iff NODE is a declaration for the global function `main'. */ #define DECL_MAIN_P(NODE) \ diff --git a/gcc/cp/method.c b/gcc/cp/method.c index 5b07ae2..03bf455 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -588,8 +588,6 @@ do_build_copy_constructor (fndecl) { if (VFIELD_NAME_P (DECL_NAME (field))) continue; - if (VBASE_NAME_P (DECL_NAME (field))) - continue; /* True for duplicate members. */ if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field)) != field) @@ -678,8 +676,6 @@ do_build_assign_ref (fndecl) { if (VFIELD_NAME_P (DECL_NAME (field))) continue; - if (VBASE_NAME_P (DECL_NAME (field))) - continue; /* True for duplicate members. */ if (IDENTIFIER_CLASS_VALUE (DECL_NAME (field)) != field) diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c index 20e238f..da1484c 100644 --- a/gcc/cp/rtti.c +++ b/gcc/cp/rtti.c @@ -41,7 +41,6 @@ Boston, MA 02111-1307, USA. */ extern struct obstack permanent_obstack; -static tree build_headof_sub PARAMS((tree)); static tree build_headof PARAMS((tree)); static tree ifnonnull PARAMS((tree, tree)); static tree tinfo_name PARAMS((tree)); @@ -82,23 +81,6 @@ init_rtti_processing () build_qualified_type (type_info_type_node, TYPE_QUAL_CONST); } -/* Given a pointer to an object with at least one virtual table - pointer somewhere, return a pointer to a possible sub-object that - has a virtual table pointer in it that is the vtable parent for - that sub-object. */ - -static tree -build_headof_sub (exp) - tree exp; -{ - tree type = TREE_TYPE (TREE_TYPE (exp)); - tree basetype = CLASSTYPE_RTTI (type); - tree binfo = get_binfo (basetype, type, 0); - - exp = convert_pointer_to_real (binfo, exp); - return exp; -} - /* Given the expression EXP of type `class *', return the head of the object pointed to by EXP with type cv void*, if the class has any virtual functions (TYPE_POLYMORPHIC_P), else just return the @@ -118,10 +100,6 @@ build_headof (exp) if (!TYPE_POLYMORPHIC_P (type)) return exp; - /* If we don't have rtti stuff, get to a sub-object that does. */ - if (!CLASSTYPE_VFIELDS (TREE_TYPE (TREE_TYPE (exp)))) - exp = build_headof_sub (exp); - /* We use this a couple of times below, protect it. */ exp = save_expr (exp); @@ -204,17 +182,6 @@ get_tinfo_decl_dynamic (exp) tree t; tree index; - if (! flag_rtti) - error ("taking dynamic typeid of object with -fno-rtti"); - - /* If we don't have rtti stuff, get to a sub-object that does. */ - if (! CLASSTYPE_VFIELDS (type)) - { - exp = build_unary_op (ADDR_EXPR, exp, 0); - exp = build_headof_sub (exp); - exp = build_indirect_ref (exp, NULL); - } - /* The RTTI information is at index -1. */ index = integer_minus_one_node; t = build_vfn_ref (exp, index); @@ -1146,7 +1113,10 @@ create_real_tinfo_var (target_type, name, type, init, non_public) tree decl; tree hidden_name; char hidden[30]; - + + /* We cannot give this the name NAME, as that already is globally + bound to the tinfo_decl we originally created for this type in + get_tinfo_decl. */ sprintf (hidden, "__ti_%d", count++); hidden_name = get_identifier (hidden); diff --git a/gcc/cp/search.c b/gcc/cp/search.c index 4fac30f..f543f0d 100644 --- a/gcc/cp/search.c +++ b/gcc/cp/search.c @@ -1451,15 +1451,6 @@ lookup_field_r (binfo, data) } else { - /* If the thing we're looking for is a virtual base class, then - we know we've got what we want at this point; there's no way - to get an ambiguity. */ - if (VBASE_NAME_P (lfi->name)) - { - lfi->rval = nval; - return nval; - } - if (from_dep_base_p && TREE_CODE (nval) != TYPE_DECL /* We need to return a member template class so we can define partial specializations. Is there a better diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 9043111..e38966f 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -2237,16 +2237,7 @@ build_component_ref (datum, component, basetype_path, protect) error ("invalid reference to NULL ptr, use ptr-to-member instead"); return error_mark_node; } - if (VBASE_NAME_P (DECL_NAME (field))) - { - /* It doesn't matter which vbase pointer we grab, just - find one of them. */ - tree binfo = get_binfo (base, - TREE_TYPE (TREE_TYPE (addr)), 0); - addr = convert_pointer_to_real (binfo, addr); - } - else - addr = convert_pointer_to (base, addr); + addr = convert_pointer_to (base, addr); datum = build_indirect_ref (addr, NULL); if (datum == error_mark_node) return error_mark_node; -- 2.7.4