aboutsummaryrefslogtreecommitdiff
path: root/gcc/alias.c
diff options
context:
space:
mode:
authorDan Nicolaescu <dann@ics.uci.edu>2002-03-11 18:01:54 +0000
committerDavid Edelsohn <dje@gcc.gnu.org>2002-03-11 13:01:54 -0500
commit61eece67a6b6c97edec67b6ecb8c1144149ff228 (patch)
tree0f32dcc7135957b2a24b097ca12ea0850be9f8be /gcc/alias.c
parentff080abaf5df0d726139dcc5ac2d4233e14b4b76 (diff)
downloadgcc-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.c11
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)));