diff options
author | Dan Nicolaescu <dann@ics.uci.edu> | 2002-03-11 18:01:54 +0000 |
---|---|---|
committer | David Edelsohn <dje@gcc.gnu.org> | 2002-03-11 13:01:54 -0500 |
commit | 61eece67a6b6c97edec67b6ecb8c1144149ff228 (patch) | |
tree | 0f32dcc7135957b2a24b097ca12ea0850be9f8be /gcc/alias.c | |
parent | ff080abaf5df0d726139dcc5ac2d4233e14b4b76 (diff) | |
download | gcc-61eece67a6b6c97edec67b6ecb8c1144149ff228.zip gcc-61eece67a6b6c97edec67b6ecb8c1144149ff228.tar.gz gcc-61eece67a6b6c97edec67b6ecb8c1144149ff228.tar.bz2 |
C++ alias analysis improvement.
2002-03-06 Dan Nicolaescu <dann@ics.uci.edu>
Daniel Berlin <dan@dberlin.org>
C++ alias analysis improvement.
* alias.c (record_component_aliases): Record aliases for base
classes too.
* cp/cp-lang.c (ok_to_generate_alias_set_for_type): New function.
(cxx_get_alias_set): Use it.
Co-Authored-By: Daniel Berlin <dberlin@dberlin.org>
From-SVN: r50587
Diffstat (limited to 'gcc/alias.c')
-rw-r--r-- | gcc/alias.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/gcc/alias.c b/gcc/alias.c index 5d017eb..9b46fe1 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -679,6 +679,17 @@ record_component_aliases (type) case RECORD_TYPE: case UNION_TYPE: case QUAL_UNION_TYPE: + /* Recursively record aliases for the base classes, if there are any */ + if (TYPE_BINFO (type) != NULL && TYPE_BINFO_BASETYPES (type) != NULL) + { + int i; + for (i = 0; i < TREE_VEC_LENGTH (TYPE_BINFO_BASETYPES (type)); i++) + { + tree binfo = TREE_VEC_ELT (TYPE_BINFO_BASETYPES (type), i); + record_alias_subset (superset, + get_alias_set (BINFO_TYPE (binfo))); + } + } for (field = TYPE_FIELDS (type); field != 0; field = TREE_CHAIN (field)) if (TREE_CODE (field) == FIELD_DECL && ! DECL_NONADDRESSABLE_P (field)) record_alias_subset (superset, get_alias_set (TREE_TYPE (field))); |