aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>2000-06-05 10:49:11 +0000
committerRichard Kenner <kenner@gcc.gnu.org>2000-06-05 06:49:11 -0400
commit806617595fdda9139fa496a55254c8c4baa7dc8d (patch)
tree9f67eb4e1929678165cca0bdac87bd07b4cc8236 /gcc
parent137e9760b7f573bd915366a4ba3ef61c6c075b87 (diff)
downloadgcc-806617595fdda9139fa496a55254c8c4baa7dc8d.zip
gcc-806617595fdda9139fa496a55254c8c4baa7dc8d.tar.gz
gcc-806617595fdda9139fa496a55254c8c4baa7dc8d.tar.bz2
alias.c (get_alias_set): If compnent is addressable, use alias set of component.
* alias.c (get_alias_set): If compnent is addressable, use alias set of component. * c-decl.c (init_decl_processing): Don't call record_component_aliases. (grokdeclarator): Likewise. * c-typeck.c (common_type): Likewise. * cp/decl.c (init_decl_processing): Don't call record_component_aliases. * cp/tree.c (build_cplus_array_type_1): Likewise. From-SVN: r34400
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/alias.c43
-rw-r--r--gcc/c-decl.c8
-rw-r--r--gcc/c-typeck.c1
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/decl.c4
-rw-r--r--gcc/cp/tree.c5
7 files changed, 46 insertions, 28 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1604435..ed4b5fc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+Mon Jun 5 06:46:28 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * alias.c (get_alias_set): If compnent is addressable, use alias
+ set of component.
+ * c-decl.c (init_decl_processing): Don't call record_component_aliases.
+ (grokdeclarator): Likewise.
+ * c-typeck.c (common_type): Likewise.
+
2000-06-04 Alex Samuel <samuel@codesourcery.com>
* Makefile.in (OBJS): Remove dyn_string.o
diff --git a/gcc/alias.c b/gcc/alias.c
index dee0cfc..07f8701 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -344,11 +344,6 @@ get_alias_set (t)
{
tree orig_t;
HOST_WIDE_INT set;
- HOST_WIDE_INT bitsize, bitpos;
- tree offset;
- enum machine_mode mode;
- int volatilep, unsignedp;
- unsigned int alignment;
/* If we're not doing any alias analysis, just assume everything
aliases everything else. Also return 0 if this or its type is
@@ -376,12 +371,38 @@ get_alias_set (t)
if ((set = lang_get_alias_set (t)) != -1)
return set;
- /* If this is a reference, go inside it and use the underlying
- object. */
- if (TREE_CODE_CLASS (TREE_CODE (t)) == 'r')
- t = get_inner_reference (t, &bitsize, &bitpos, &offset, &mode,
- &unsignedp, &volatilep, &alignment);
-
+ /* Now loop the same way as get_inner_reference and get the alias
+ set to use. Pick up the outermost object that we could have
+ a pointer to. */
+ while (1)
+ {
+ /* Unnamed bitfields are not an addressable object. */
+ if (TREE_CODE (t) == BIT_FIELD_REF)
+ ;
+ else if (TREE_CODE (t) == COMPONENT_REF)
+ {
+ if (! DECL_NONADDRESSABLE_P (TREE_OPERAND (t, 1)))
+ /* Stop at an adressable decl. */
+ break;
+ }
+ else if (TREE_CODE (t) == ARRAY_REF)
+ {
+ if (! TYPE_NONALIASED_COMPONENT
+ (TREE_TYPE (TREE_OPERAND (t, 0))))
+ /* Stop at an addresssable array element. */
+ break;
+ }
+ else if (TREE_CODE (t) != NON_LVALUE_EXPR
+ && ! ((TREE_CODE (t) == NOP_EXPR
+ || TREE_CODE (t) == CONVERT_EXPR)
+ && (TYPE_MODE (TREE_TYPE (t))
+ == TYPE_MODE (TREE_TYPE (TREE_OPERAND (t, 0))))))
+ /* Stop if not one of above and not mode-preserving conversion. */
+ break;
+
+ t = TREE_OPERAND (t, 0);
+ }
+
if (TREE_CODE (t) == INDIRECT_REF)
{
/* Check for accesses through restrict-qualified pointers. */
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 0efffab..75e50b5 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -3023,10 +3023,6 @@ init_decl_processing ()
wchar_array_type_node
= build_array_type (wchar_type_node, array_domain_type);
- record_component_aliases (char_array_type_node);
- record_component_aliases (int_array_type_node);
- record_component_aliases (wchar_array_type_node);
-
void_list_node = tree_cons (NULL_TREE, void_type_node, NULL_TREE);
default_function_type
@@ -4405,7 +4401,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
type = build_array_type (type, itype);
if (type_quals)
type = c_build_qualified_type (type, type_quals);
- record_component_aliases (type);
#if 0 /* don't clear these; leave them set so that the array type
or the variable is itself const or volatile. */
@@ -4578,7 +4573,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
&& TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type) == 0)
{
type = build_array_type (TREE_TYPE (type), 0);
- record_component_aliases (type);
if (size_varies)
C_TYPE_VARIABLE_SIZE (type) = 1;
}
@@ -4691,7 +4685,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
type = build_array_type (c_build_qualified_type (TREE_TYPE (type),
type_quals),
TYPE_DOMAIN (type));
- record_component_aliases (type);
#if 0 /* Leave the field const or volatile as well. */
type_quals = TYPE_UNQUALIFIED;
#endif
@@ -4774,7 +4767,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
type = build_array_type (c_build_qualified_type (TREE_TYPE (type),
type_quals),
TYPE_DOMAIN (type));
- record_component_aliases (type);
#if 0 /* Leave the variable const or volatile as well. */
type_quals = TYPE_UNQUALIFIED;
#endif
diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c
index 1d86242..0f01c57 100644
--- a/gcc/c-typeck.c
+++ b/gcc/c-typeck.c
@@ -313,7 +313,6 @@ common_type (t1, t2)
return build_type_attribute_variant (t2, attributes);
/* Merge the element types, and have a size if either arg has one. */
t1 = build_array_type (elt, TYPE_DOMAIN (TYPE_DOMAIN (t1) ? t1 : t2));
- record_component_aliases (t1);
return build_type_attribute_variant (t1, attributes);
}
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 87cea70..528f9bc 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+Mon Jun 5 06:48:55 2000 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * decl.c (init_decl_processing): Don't call record_component_aliases.
+ * tree.c (build_cplus_array_type_1): Likewise.
+
2000-06-04 Mark Mitchell <mark@codesourcery.com>
* ir.texi: Correct typo.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 5aff843..60e8f9f 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -6478,9 +6478,6 @@ init_decl_processing ()
int_array_type_node
= build_array_type (integer_type_node, array_domain_type);
- record_component_aliases (char_array_type_node);
- record_component_aliases (int_array_type_node);
-
if (flag_new_abi)
delta_type_node = ptrdiff_type_node;
else if (flag_huge_objects)
@@ -6544,7 +6541,6 @@ init_decl_processing ()
/* This is for wide string constants. */
wchar_array_type_node
= build_array_type (wchar_type_node, array_domain_type);
- record_component_aliases (wchar_array_type_node);
if (flag_vtable_thunks)
{
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 95fafad..382e254 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -500,10 +500,7 @@ build_cplus_array_type_1 (elt_type, index_type)
TYPE_DOMAIN (t) = index_type;
}
else
- {
- t = build_array_type (elt_type, index_type);
- record_component_aliases (t);
- }
+ t = build_array_type (elt_type, index_type);
/* Push these needs up so that initialization takes place
more easily. */