diff options
author | Richard Guenther <rguenther@suse.de> | 2008-06-11 18:19:28 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2008-06-11 18:19:28 +0000 |
commit | 4653cae5b8dc090912f262572d0105f27ec2c83b (patch) | |
tree | 7589856308b10e4f1fc7740be354b769d8e54ff6 /gcc | |
parent | 8981c15b8cbb3a7e129c7bcf85823eff3db9c6a7 (diff) | |
download | gcc-4653cae5b8dc090912f262572d0105f27ec2c83b.zip gcc-4653cae5b8dc090912f262572d0105f27ec2c83b.tar.gz gcc-4653cae5b8dc090912f262572d0105f27ec2c83b.tar.bz2 |
alias.c (get_alias_set): Use the element alias-set for arrays.
2008-06-11 Richard Guenther <rguenther@suse.de>
* alias.c (get_alias_set): Use the element alias-set for arrays.
(record_component_aliases): For arrays and vectors do nothing.
* c-common.c (strict_aliasing_warning): Handle the cases
of alias set zero explicitly.
* Makefile.in (dfp.o-warn): Add -Wno-error.
From-SVN: r136679
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/Makefile.in | 2 | ||||
-rw-r--r-- | gcc/alias.c | 20 | ||||
-rw-r--r-- | gcc/c-common.c | 3 |
4 files changed, 27 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b5c210c..95a86b0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2008-06-11 Richard Guenther <rguenther@suse.de> + + * alias.c (get_alias_set): Use the element alias-set for arrays. + (record_component_aliases): For arrays and vectors do nothing. + * c-common.c (strict_aliasing_warning): Handle the cases + of alias set zero explicitly. + * Makefile.in (dfp.o-warn): Add -Wno-error. + 2008-06-11 Joseph Myers <joseph@codesourcery.com> * config.gcc (all_defaults): Add arch_32 arch_64 cpu_32 cpu_64 diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 7069728..47a45a1 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -187,6 +187,8 @@ GCC_WARN_CFLAGS = $(LOOSE_WARN) $($(@D)-warn) $(NOCOMMON_FLAG) $($@-warn) build/gengtype-lex.o-warn = -Wno-error # SYSCALLS.c misses prototypes SYSCALLS.c.X-warn = -Wno-strict-prototypes -Wno-error +# dfp.c contains alias violations +dfp.o-warn = -Wno-error # All warnings have to be shut off in stage1 if the compiler used then # isn't gcc; configure determines that. WARN_CFLAGS will be either diff --git a/gcc/alias.c b/gcc/alias.c index 06ad867..ec2d053 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -640,6 +640,18 @@ get_alias_set (tree t) else if (TREE_CODE (t) == VECTOR_TYPE) set = get_alias_set (TREE_TYPE (t)); + /* Unless the language specifies otherwise, treat array types the + same as their components. This avoids the asymmetry we get + through recording the components. Consider accessing a + character(kind=1) through a reference to a character(kind=1)[1:1]. + Or consider if we want to assign integer(kind=4)[0:D.1387] and + integer(kind=4)[4] the same alias set or not. + Just be pragmatic here and make sure the array and its element + type get the same alias set assigned. */ + else if (TREE_CODE (t) == ARRAY_TYPE + && !TYPE_NONALIASED_COMPONENT (t)) + set = get_alias_set (TREE_TYPE (t)); + else /* Otherwise make a new alias set for this type. */ set = new_alias_set (); @@ -747,11 +759,6 @@ record_component_aliases (tree type) switch (TREE_CODE (type)) { - case ARRAY_TYPE: - if (!TYPE_NONALIASED_COMPONENT (type)) - record_alias_subset (superset, get_alias_set (TREE_TYPE (type))); - break; - case RECORD_TYPE: case UNION_TYPE: case QUAL_UNION_TYPE: @@ -775,6 +782,9 @@ record_component_aliases (tree type) record_alias_subset (superset, get_alias_set (TREE_TYPE (type))); break; + /* VECTOR_TYPE and ARRAY_TYPE share the alias set with their + element type. */ + default: break; } diff --git a/gcc/c-common.c b/gcc/c-common.c index 377db57..b783c53 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -1093,7 +1093,8 @@ strict_aliasing_warning (tree otype, tree type, tree expr) get_alias_set (TREE_TYPE (TREE_OPERAND (expr, 0))); alias_set_type set2 = get_alias_set (TREE_TYPE (type)); - if (!alias_sets_conflict_p (set1, set2)) + if (set1 != set2 && set2 != 0 + && (set1 == 0 || !alias_sets_conflict_p (set1, set2))) { warning (OPT_Wstrict_aliasing, "dereferencing type-punned " "pointer will break strict-aliasing rules"); |