The 3.0 ABI no longer has vbase pointer fields.
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. From-SVN: r44515
This commit is contained in:
parent
dc56ceb766
commit
befe7c6146
6 changed files with 23 additions and 78 deletions
|
@ -1,3 +1,21 @@
|
|||
2001-07-31 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
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 <nathan@codesourcery.com>
|
||||
|
||||
PR c++/3631
|
||||
|
|
|
@ -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) \
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue