Commit 5399d643 by James E Wilson Committed by Jim Wilson

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
parent a4e9467d
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> 2004-03-10 Roman Zippel <zippel@linux-m68k.org>
PR bootstrap/12371 PR bootstrap/12371
......
...@@ -290,6 +290,19 @@ alias_sets_conflict_p (HOST_WIDE_INT set1, HOST_WIDE_INT set2) ...@@ -290,6 +290,19 @@ alias_sets_conflict_p (HOST_WIDE_INT set1, HOST_WIDE_INT set2)
child of the other. Therefore, they cannot alias. */ child of the other. Therefore, they cannot alias. */
return 0; 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 /* 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 has any readonly fields. If any of the fields have types that
......
...@@ -3027,10 +3027,17 @@ build_c_cast (tree type, tree expr) ...@@ -3027,10 +3027,17 @@ build_c_cast (tree type, tree expr)
if the cast breaks type based aliasing. */ if the cast breaks type based aliasing. */
if (!COMPLETE_TYPE_P (TREE_TYPE (type))) if (!COMPLETE_TYPE_P (TREE_TYPE (type)))
warning ("type-punning to incomplete type might break strict-aliasing rules"); warning ("type-punning to incomplete type might break strict-aliasing rules");
else if (!alias_sets_conflict_p else
(get_alias_set (TREE_TYPE (TREE_OPERAND (expr, 0))), {
get_alias_set (TREE_TYPE (type)))) HOST_WIDE_INT set1 = get_alias_set (TREE_TYPE (TREE_OPERAND (expr, 0)));
warning ("dereferencing type-punned pointer will break strict-aliasing rules"); 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 /* If pedantic, warn for conversions between function and object
......
...@@ -104,6 +104,10 @@ Wstrict-aliasing ...@@ -104,6 +104,10 @@ Wstrict-aliasing
Common Common
Warn about code which might break strict aliasing rules Warn about code which might break strict aliasing rules
Wstrict-aliasing=
Common Joined UInteger
Warn about code which might break strict aliasing rules
Wswitch Wswitch
Common Common
Warn about enumerated switches, with no default, missing a case Warn about enumerated switches, with no default, missing a case
......
...@@ -226,7 +226,7 @@ in the following sections. ...@@ -226,7 +226,7 @@ in the following sections.
-Wno-multichar -Wnonnull -Wpacked -Wpadded @gol -Wno-multichar -Wnonnull -Wpacked -Wpadded @gol
-Wparentheses -Wpointer-arith -Wredundant-decls @gol -Wparentheses -Wpointer-arith -Wredundant-decls @gol
-Wreturn-type -Wsequence-point -Wshadow @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 -Wswitch -Wswitch-default -Wswitch-enum @gol
-Wsystem-headers -Wtrigraphs -Wundef -Wuninitialized @gol -Wsystem-headers -Wtrigraphs -Wundef -Wuninitialized @gol
-Wunknown-pragmas -Wunreachable-code @gol -Wunknown-pragmas -Wunreachable-code @gol
...@@ -2449,6 +2449,13 @@ compiler is using for optimization. The warning does not catch all ...@@ -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 cases, but does attempt to catch the more common pitfalls. It is
included in @option{-Wall}. 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 @item -Wall
@opindex Wall @opindex Wall
All of the above @samp{-W} options combined. This enables all the All of the above @samp{-W} options combined. This enables all the
......
...@@ -184,7 +184,7 @@ extern bool warn_deprecated_decl; ...@@ -184,7 +184,7 @@ extern bool warn_deprecated_decl;
/* Nonzero means warn about constructs which might not be strict /* Nonzero means warn about constructs which might not be strict
aliasing safe. */ aliasing safe. */
extern bool warn_strict_aliasing; extern int warn_strict_aliasing;
/* Nonzero if generating code to do profiling. */ /* Nonzero if generating code to do profiling. */
......
...@@ -100,7 +100,7 @@ bool warn_shadow; ...@@ -100,7 +100,7 @@ bool warn_shadow;
/* Nonzero means warn about constructs which might not be /* Nonzero means warn about constructs which might not be
strict-aliasing safe. */ 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 /* 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. */ case, fails to have a case for every enum value. */
...@@ -747,6 +747,7 @@ common_handle_option (size_t scode, const char *arg, ...@@ -747,6 +747,7 @@ common_handle_option (size_t scode, const char *arg,
break; break;
case OPT_Wstrict_aliasing: case OPT_Wstrict_aliasing:
case OPT_Wstrict_aliasing_:
warn_strict_aliasing = value; warn_strict_aliasing = value;
break; break;
......
...@@ -2887,6 +2887,7 @@ extern tree strip_float_extensions (tree); ...@@ -2887,6 +2887,7 @@ extern tree strip_float_extensions (tree);
extern void record_component_aliases (tree); extern void record_component_aliases (tree);
extern HOST_WIDE_INT get_alias_set (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_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 readonly_fields_p (tree);
extern int objects_must_conflict_p (tree, tree); extern int objects_must_conflict_p (tree, tree);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment