aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJames E Wilson <wilson@specifixinc.com>2004-03-10 06:02:55 +0000
committerJim Wilson <wilson@gcc.gnu.org>2004-03-09 22:02:55 -0800
commit5399d643680b153db318cd9ef38787774eac34c4 (patch)
tree893bd1037263eb2e8912cc841d795b6695e442e7 /gcc
parenta4e9467d735cfdbcbe64902f9a3dd30c440c71fb (diff)
downloadgcc-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/ChangeLog11
-rw-r--r--gcc/alias.c13
-rw-r--r--gcc/c-typeck.c15
-rw-r--r--gcc/common.opt4
-rw-r--r--gcc/doc/invoke.texi9
-rw-r--r--gcc/flags.h2
-rw-r--r--gcc/opts.c3
-rw-r--r--gcc/tree.h1
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. */
diff --git a/gcc/opts.c b/gcc/opts.c
index fa1971c..99d576a 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -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;
diff --git a/gcc/tree.h b/gcc/tree.h
index 0a1e3fb..6af6c66 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -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);