Commit b3b2bae4 by Jakub Jelinek Committed by Jakub Jelinek

re PR sanitizer/70683 (-fcompare-debug bug with -fsanitize=address)

	PR sanitizer/70683
	* tree-core.h (enum operand_equal_flag): Add OEP_NO_HASH_CHECK.
	* fold-const.c (operand_equal_p): If flag_checking and
	OEP_NO_HASH_CHECK is not set in flag, recurse with OEP_NO_HASH_CHECK
	and if it returns non-zero, assert iterative_hash_expr on both
	args is the same.

From-SVN: r235507
parent 3c98ff9b
2016-04-27 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/70683
* tree-core.h (enum operand_equal_flag): Add OEP_NO_HASH_CHECK.
* fold-const.c (operand_equal_p): If flag_checking and
OEP_NO_HASH_CHECK is not set in flag, recurse with OEP_NO_HASH_CHECK
and if it returns non-zero, assert iterative_hash_expr on both
args is the same.
2016-04-27 Bernd Schmidt <bschmidt@redhat.com> 2016-04-27 Bernd Schmidt <bschmidt@redhat.com>
* doc/invoke.texi (-frename-registers): Also enabled at -Os. * doc/invoke.texi (-frename-registers): Also enabled at -Os.
......
...@@ -2749,6 +2749,25 @@ combine_comparisons (location_t loc, ...@@ -2749,6 +2749,25 @@ combine_comparisons (location_t loc,
int int
operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags) operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
{ {
/* When checking, verify at the outermost operand_equal_p call that
if operand_equal_p returns non-zero then ARG0 and ARG1 has the same
hash value. */
if (flag_checking && !(flags & OEP_NO_HASH_CHECK))
{
if (operand_equal_p (arg0, arg1, flags | OEP_NO_HASH_CHECK))
{
inchash::hash hstate0 (0), hstate1 (0);
inchash::add_expr (arg0, hstate0, flags);
inchash::add_expr (arg1, hstate1, flags);
hashval_t h0 = hstate0.end ();
hashval_t h1 = hstate1.end ();
gcc_assert (h0 == h1);
return 1;
}
else
return 0;
}
/* If either is ERROR_MARK, they aren't equal. */ /* If either is ERROR_MARK, they aren't equal. */
if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK if (TREE_CODE (arg0) == ERROR_MARK || TREE_CODE (arg1) == ERROR_MARK
|| TREE_TYPE (arg0) == error_mark_node || TREE_TYPE (arg0) == error_mark_node
......
...@@ -765,7 +765,9 @@ enum operand_equal_flag { ...@@ -765,7 +765,9 @@ enum operand_equal_flag {
OEP_ONLY_CONST = 1, OEP_ONLY_CONST = 1,
OEP_PURE_SAME = 2, OEP_PURE_SAME = 2,
OEP_MATCH_SIDE_EFFECTS = 4, OEP_MATCH_SIDE_EFFECTS = 4,
OEP_ADDRESS_OF = 8 OEP_ADDRESS_OF = 8,
/* Internal within operand_equal_p: */
OEP_NO_HASH_CHECK = 16
}; };
/* Enum and arrays used for tree allocation stats. /* Enum and arrays used for tree allocation stats.
......
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