diff options
author | James E Wilson <wilson@specifixinc.com> | 2004-03-10 06:02:55 +0000 |
---|---|---|
committer | Jim Wilson <wilson@gcc.gnu.org> | 2004-03-09 22:02:55 -0800 |
commit | 5399d643680b153db318cd9ef38787774eac34c4 (patch) | |
tree | 893bd1037263eb2e8912cc841d795b6695e442e7 /gcc | |
parent | a4e9467d735cfdbcbe64902f9a3dd30c440c71fb (diff) | |
download | gcc-5399d643680b153db318cd9ef38787774eac34c4.zip gcc-5399d643680b153db318cd9ef38787774eac34c4.tar.gz gcc-5399d643680b153db318cd9ef38787774eac34c4.tar.bz2 |
New option -Wstrict-aliasing=2.
* alias.c (alias_sets_might_conflict_p): New.
* c-typeck.c (build_c_cast): Call it if warn_strict_aliasing > 1.
* common.opt (Wstrict-aliasing=): New.
* flags.h (warn_strict_aliasing): Change type to int.
* opts.c (warn_strict_aliasing): Change type to int.
(common_handle_option): Handle OPT_Wstrict_aliasing_.
* tree.h (alias_sets_might_conflict_p): Declare it.
* doc/invoke.tex (-Wstrict-aliasing=2): Document it.
From-SVN: r79222
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/alias.c | 13 | ||||
-rw-r--r-- | gcc/c-typeck.c | 15 | ||||
-rw-r--r-- | gcc/common.opt | 4 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 9 | ||||
-rw-r--r-- | gcc/flags.h | 2 | ||||
-rw-r--r-- | gcc/opts.c | 3 | ||||
-rw-r--r-- | gcc/tree.h | 1 |
8 files changed, 51 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e6a791c..6016aaa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2004-03-09 James E Wilson <wilson@specifixinc.com> + + * alias.c (alias_sets_might_conflict_p): New. + * c-typeck.c (build_c_cast): Call it if warn_strict_aliasing > 1. + * common.opt (Wstrict-aliasing=): New. + * flags.h (warn_strict_aliasing): Change type to int. + * opts.c (warn_strict_aliasing): Change type to int. + (common_handle_option): Handle OPT_Wstrict_aliasing_. + * tree.h (alias_sets_might_conflict_p): Declare it. + * doc/invoke.tex (-Wstrict-aliasing=2): Document it. + 2004-03-10 Roman Zippel <zippel@linux-m68k.org> PR bootstrap/12371 diff --git a/gcc/alias.c b/gcc/alias.c index d670a7d..30013ec 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -290,6 +290,19 @@ alias_sets_conflict_p (HOST_WIDE_INT set1, HOST_WIDE_INT set2) child of the other. Therefore, they cannot alias. */ return 0; } + +/* Return 1 if the two specified alias sets might conflict, or if any subtype + of these alias sets might conflict. */ + +int +alias_sets_might_conflict_p (HOST_WIDE_INT set1, HOST_WIDE_INT set2) +{ + if (set1 == 0 || set2 == 0 || set1 == set2) + return 1; + + return 0; +} + /* Return 1 if TYPE is a RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE and has has any readonly fields. If any of the fields have types that diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index a49b5ea..f23fac7 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -3027,10 +3027,17 @@ build_c_cast (tree type, tree expr) if the cast breaks type based aliasing. */ if (!COMPLETE_TYPE_P (TREE_TYPE (type))) warning ("type-punning to incomplete type might break strict-aliasing rules"); - else if (!alias_sets_conflict_p - (get_alias_set (TREE_TYPE (TREE_OPERAND (expr, 0))), - get_alias_set (TREE_TYPE (type)))) - warning ("dereferencing type-punned pointer will break strict-aliasing rules"); + else + { + HOST_WIDE_INT set1 = get_alias_set (TREE_TYPE (TREE_OPERAND (expr, 0))); + HOST_WIDE_INT set2 = get_alias_set (TREE_TYPE (type)); + + if (!alias_sets_conflict_p (set1, set2)) + warning ("dereferencing type-punned pointer will break strict-aliasing rules"); + else if (warn_strict_aliasing > 1 + && !alias_sets_might_conflict_p (set1, set2)) + warning ("dereferencing type-punned pointer might break strict-aliasing rules"); + } } /* If pedantic, warn for conversions between function and object diff --git a/gcc/common.opt b/gcc/common.opt index d9faa60..f1a0453 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -104,6 +104,10 @@ Wstrict-aliasing Common Warn about code which might break strict aliasing rules +Wstrict-aliasing= +Common Joined UInteger +Warn about code which might break strict aliasing rules + Wswitch Common Warn about enumerated switches, with no default, missing a case diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 8caed2b..0c9f183 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -226,7 +226,7 @@ in the following sections. -Wno-multichar -Wnonnull -Wpacked -Wpadded @gol -Wparentheses -Wpointer-arith -Wredundant-decls @gol -Wreturn-type -Wsequence-point -Wshadow @gol --Wsign-compare -Wstrict-aliasing @gol +-Wsign-compare -Wstrict-aliasing -Wstrict-aliasing=2 @gol -Wswitch -Wswitch-default -Wswitch-enum @gol -Wsystem-headers -Wtrigraphs -Wundef -Wuninitialized @gol -Wunknown-pragmas -Wunreachable-code @gol @@ -2449,6 +2449,13 @@ compiler is using for optimization. The warning does not catch all cases, but does attempt to catch the more common pitfalls. It is included in @option{-Wall}. +@item -Wstrict-aliasing=2 +@opindex Wstrict-aliasing=2 +This option is only active when @option{-fstrict-aliasing} is active. +It warns about all code which might break the strict aliasing rules that the +compiler is using for optimization. This warning catches all cases, but +it will also give a warning for some ambiguous cases that are safe. + @item -Wall @opindex Wall All of the above @samp{-W} options combined. This enables all the diff --git a/gcc/flags.h b/gcc/flags.h index b088f6c..8a70fc3 100644 --- a/gcc/flags.h +++ b/gcc/flags.h @@ -184,7 +184,7 @@ extern bool warn_deprecated_decl; /* Nonzero means warn about constructs which might not be strict aliasing safe. */ -extern bool warn_strict_aliasing; +extern int warn_strict_aliasing; /* Nonzero if generating code to do profiling. */ @@ -100,7 +100,7 @@ bool warn_shadow; /* Nonzero means warn about constructs which might not be strict-aliasing safe. */ -bool warn_strict_aliasing; +int warn_strict_aliasing; /* True to warn if a switch on an enum, that does not have a default case, fails to have a case for every enum value. */ @@ -747,6 +747,7 @@ common_handle_option (size_t scode, const char *arg, break; case OPT_Wstrict_aliasing: + case OPT_Wstrict_aliasing_: warn_strict_aliasing = value; break; @@ -2887,6 +2887,7 @@ extern tree strip_float_extensions (tree); extern void record_component_aliases (tree); extern HOST_WIDE_INT get_alias_set (tree); extern int alias_sets_conflict_p (HOST_WIDE_INT, HOST_WIDE_INT); +extern int alias_sets_might_conflict_p (HOST_WIDE_INT, HOST_WIDE_INT); extern int readonly_fields_p (tree); extern int objects_must_conflict_p (tree, tree); |