From: Richard Henderson Date: Thu, 20 Jun 2002 07:35:46 +0000 (-0700) Subject: c-common.c (c_common_get_alias_set): Correctly handle characters. X-Git-Tag: releases/gcc-3.1.1~125 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=71c0a5fe74ff1014b4f1d2526957ca0777f65ed7;p=thirdparty%2Fgcc.git c-common.c (c_common_get_alias_set): Correctly handle characters. * c-common.c (c_common_get_alias_set): Correctly handle characters. Rearrange order of expressions; don't handle vectors here. * alias.c (get_alias_set): Let vectors match their components. From-SVN: r54823 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3c59ce489777..4a2f57fb6cd5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-06-20 Richard Henderson + + * c-common.c (c_common_get_alias_set): Correctly handle characters. + Rearrange order of expressions; don't handle vectors here. + * alias.c (get_alias_set): Let vectors match their components. + 2002-06-17 Hans-Peter Nilsson PR target/7042 diff --git a/gcc/alias.c b/gcc/alias.c index c5a626516032..6d4104e640b5 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -564,6 +564,14 @@ get_alias_set (t) and references to functions, but that's different.) */ else if (TREE_CODE (t) == FUNCTION_TYPE) set = 0; + + /* Unless the language specifies otherwise, let vector types alias + their components. This avoids some nasty type punning issues in + normal usage. And indeed lets vectors be treated more like an + array slice. */ + else if (TREE_CODE (t) == VECTOR_TYPE) + set = get_alias_set (TREE_TYPE (t)); + else /* Otherwise make a new alias set for this type. */ set = new_alias_set (); diff --git a/gcc/c-common.c b/gcc/c-common.c index 5b8b56546268..f9e593057a9b 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -2326,10 +2326,6 @@ c_common_get_alias_set (t) { tree u; - /* We know nothing about vector types */ - if (TREE_CODE (t) == VECTOR_TYPE) - return 0; - /* Permit type-punning when accessing a union, provided the access is directly through the union. For example, this code does not permit taking the address of a union member and then storing @@ -2343,17 +2339,17 @@ c_common_get_alias_set (t) && TREE_CODE (TREE_TYPE (TREE_OPERAND (u, 0))) == UNION_TYPE) return 0; - /* If this is a char *, the ANSI C standard says it can alias - anything. Note that all references need do this. */ - if (TREE_CODE_CLASS (TREE_CODE (t)) == 'r' - && TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE - && TYPE_PRECISION (TREE_TYPE (t)) == TYPE_PRECISION (char_type_node)) - return 0; - /* That's all the expressions we handle specially. */ if (! TYPE_P (t)) return -1; + /* The C standard guarantess that any object may be accessed via an + lvalue that has character type. */ + if (t == char_type_node + || t == signed_char_type_node + || t == unsigned_char_type_node) + return 0; + /* The C standard specifically allows aliasing between signed and unsigned variants of the same type. We treat the signed variant as canonical. */