cp-tree.h (BINFO_OVERRIDE_ALONG_VIRTUAL_PATH): New macro.
* cp-tree.h (BINFO_OVERRIDE_ALONG_VIRTUAL_PATH): New macro. * class.c (dfs_find_final_overrider): Set it appropriately. (dfs_built_vtt_inits): Check BINFO_OVERRIDE_ALONG_VIRTUAL_PATH to avoid unneeded secondary vptrs. From-SVN: r34549
This commit is contained in:
parent
33261b0a22
commit
db3d8cded1
@ -1,3 +1,10 @@
|
||||
2000-06-14 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
* cp-tree.h (BINFO_OVERRIDE_ALONG_VIRTUAL_PATH): New macro.
|
||||
* class.c (dfs_find_final_overrider): Set it appropriately.
|
||||
(dfs_built_vtt_inits): Check BINFO_OVERRIDE_ALONG_VIRTUAL_PATH to
|
||||
avoid unneeded secondary vptrs.
|
||||
|
||||
2000-06-13 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* class.c (build_secondary_vtable): Set DECL_USER_ALIGN.
|
||||
|
@ -2453,9 +2453,11 @@ dfs_find_final_overrider (binfo, data)
|
||||
tree path;
|
||||
tree method;
|
||||
|
||||
/* We haven't found an overrider yet. */
|
||||
method = NULL_TREE;
|
||||
/* We've found a path to the declaring base. Walk down the path
|
||||
looking for an overrider for FN. */
|
||||
for (path = reverse_path (binfo);
|
||||
for (path = reverse_path (binfo);
|
||||
path;
|
||||
path = TREE_CHAIN (path))
|
||||
{
|
||||
@ -2474,6 +2476,24 @@ dfs_find_final_overrider (binfo, data)
|
||||
the base from which it came. */
|
||||
if (path)
|
||||
{
|
||||
tree base;
|
||||
|
||||
/* Assume the path is non-virtual. See if there are any base from
|
||||
(but not including) the overrider up to and including the
|
||||
base where the function is defined. */
|
||||
for (base = TREE_CHAIN (path); base; base = TREE_CHAIN (base))
|
||||
if (TREE_VIA_VIRTUAL (TREE_VALUE (base)))
|
||||
{
|
||||
base = ffod->declaring_base;
|
||||
while (BINFO_PRIMARY_MARKED_P (base))
|
||||
{
|
||||
BINFO_OVERRIDE_ALONG_VIRTUAL_PATH_P (base) = 1;
|
||||
base = BINFO_INHERITANCE_CHAIN (base);
|
||||
}
|
||||
BINFO_OVERRIDE_ALONG_VIRTUAL_PATH_P (base) = 1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (ffod->overriding_fn && ffod->overriding_fn != method)
|
||||
{
|
||||
/* We've found a different overrider along a different
|
||||
@ -6729,10 +6749,19 @@ dfs_build_vtt_inits (binfo, data)
|
||||
|
||||
/* If BINFO doesn't have virtual bases, then we have to look to see
|
||||
whether or not any virtual functions were overidden along a
|
||||
virtual path between the declaration and T. */
|
||||
if (!TYPE_USES_VIRTUAL_BASECLASSES (BINFO_TYPE (binfo)))
|
||||
/* FIXME: Implement this. */
|
||||
;
|
||||
virtual path. The point is that given:
|
||||
|
||||
struct V { virtual void f(); int i; };
|
||||
struct C : public V { void f (); };
|
||||
|
||||
when we constrct C we need a secondary vptr for V-in-C because we
|
||||
don't know what the vcall offset for `f' should be. If `V' ends
|
||||
up in a different place in the complete object, then we'll need a
|
||||
different vcall offset than that present in the normal V-in-C
|
||||
vtable. */
|
||||
if (!TYPE_USES_VIRTUAL_BASECLASSES (BINFO_TYPE (binfo))
|
||||
&& !BINFO_OVERRIDE_ALONG_VIRTUAL_PATH_P (binfo))
|
||||
return NULL_TREE;
|
||||
|
||||
/* Record the index where this secondary vptr can be found. */
|
||||
index = TREE_TYPE (l);
|
||||
|
@ -55,11 +55,13 @@ Boston, MA 02111-1307, USA. */
|
||||
BASELINK_P (in TREE_LIST)
|
||||
ICS_ELLIPSIS_FLAG (in _CONV)
|
||||
STMT_IS_FULL_EXPR_P (in _STMT)
|
||||
BINFO_ACCESS (in BINFO)
|
||||
2: IDENTIFIER_OPNAME_P.
|
||||
TYPE_POLYMORHPIC_P (in _TYPE)
|
||||
ICS_THIS_FLAG (in _CONV)
|
||||
STMT_LINENO_FOR_FN_P (in _STMT)
|
||||
BINDING_HAS_LEVEL_P (in CPLUS_BINDING)
|
||||
BINFO_OVERRIDE_ALONG_VIRTUAL_PATH_P (in BINFO)
|
||||
3: TYPE_USES_VIRTUAL_BASECLASSES (in a class TYPE).
|
||||
BINFO_VTABLE_PATH_MARKED.
|
||||
BINFO_PUSHDECLS_MARKED.
|
||||
@ -76,6 +78,7 @@ Boston, MA 02111-1307, USA. */
|
||||
IDENTIFIER_TYPENAME_P (in IDENTIFIER_NODE)
|
||||
5: BINFO_PRIMARY_MARKED_P (in BINFO)
|
||||
6: BINFO_VBASE_PRIMARY_P (in BINFO)
|
||||
BINFO_ACCESS (in BINFO)
|
||||
|
||||
Usage of TYPE_LANG_FLAG_?:
|
||||
0: C_TYPE_FIELDS_READONLY (in RECORD_TYPE or UNION_TYPE).
|
||||
@ -1784,6 +1787,10 @@ struct lang_type
|
||||
found. NULL_TREE if there is no secondary vptr in the VTT. */
|
||||
#define BINFO_VPTR_INDEX(NODE) TREE_VEC_ELT ((NODE), 9)
|
||||
|
||||
/* Nonzero if this binfo declares a virtual function which is
|
||||
overridden along a virtual path. */
|
||||
#define BINFO_OVERRIDE_ALONG_VIRTUAL_PATH_P(NODE) TREE_LANG_FLAG_2 (NODE)
|
||||
|
||||
/* Used by various search routines. */
|
||||
#define IDENTIFIER_MARKED(NODE) TREE_LANG_FLAG_0 (NODE)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user