re PR sanitizer/63913 (ICE: verify_gimple failed: statement marked for throw, but doesn't with -fnon-call-exceptions -fsanitize=bool)

PR sanitizer/63913
	* ubsan.c: Include tree-eh.h.
	(instrument_bool_enum_load): Handle loads that can throw.

	* g++.dg/ubsan/pr63913.C: New test.

From-SVN: r217755
This commit is contained in:
Jakub Jelinek 2014-11-19 10:27:30 +01:00 committed by Jakub Jelinek
parent 8f7d0ab920
commit d469883955
4 changed files with 47 additions and 5 deletions

View File

@ -1,5 +1,9 @@
2014-11-19 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/63913
* ubsan.c: Include tree-eh.h.
(instrument_bool_enum_load): Handle loads that can throw.
PR rtl-optimization/63843
* simplify-rtx.c (simplify_binary_operation_1) <case ASHIFTRT>: For
optimization of ashiftrt of subreg of lshiftrt, check that code

View File

@ -1,3 +1,8 @@
2014-11-19 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/63913
* g++.dg/ubsan/pr63913.C: New test.
2014-11-19 Andreas Schwab <schwab@suse.de>
* gcc.dg/pure-2.c: Update line numbers.

View File

@ -0,0 +1,12 @@
// PR sanitizer/63913
// { dg-do compile }
// { dg-options "-fsanitize=bool -fnon-call-exceptions" }
struct B { B (); ~B (); };
double
foo (bool *x)
{
B b;
return *x;
}

View File

@ -67,6 +67,7 @@ along with GCC; see the file COPYING3. If not see
#include "dfp.h"
#include "builtins.h"
#include "tree-object-size.h"
#include "tree-eh.h"
/* Map from a tree to a VAR_DECL tree. */
@ -1159,7 +1160,9 @@ instrument_bool_enum_load (gimple_stmt_iterator *gsi)
|| TREE_CODE (gimple_assign_lhs (stmt)) != SSA_NAME)
return;
bool can_throw = stmt_could_throw_p (stmt);
location_t loc = gimple_location (stmt);
tree lhs = gimple_assign_lhs (stmt);
tree ptype = build_pointer_type (TREE_TYPE (rhs));
tree atype = reference_alias_ptr_type (rhs);
gimple g = gimple_build_assign (make_ssa_name (ptype, NULL),
@ -1169,9 +1172,24 @@ instrument_bool_enum_load (gimple_stmt_iterator *gsi)
tree mem = build2 (MEM_REF, utype, gimple_assign_lhs (g),
build_int_cst (atype, 0));
tree urhs = make_ssa_name (utype, NULL);
g = gimple_build_assign (urhs, mem);
gimple_set_location (g, loc);
gsi_insert_before (gsi, g, GSI_SAME_STMT);
if (can_throw)
{
gimple_assign_set_lhs (stmt, urhs);
g = gimple_build_assign_with_ops (NOP_EXPR, lhs, urhs, NULL_TREE);
gimple_set_location (g, loc);
edge e = find_fallthru_edge (gimple_bb (stmt)->succs);
gsi_insert_on_edge_immediate (e, g);
gimple_assign_set_rhs_from_tree (gsi, mem);
update_stmt (stmt);
*gsi = gsi_for_stmt (g);
g = stmt;
}
else
{
g = gimple_build_assign (urhs, mem);
gimple_set_location (g, loc);
gsi_insert_before (gsi, g, GSI_SAME_STMT);
}
minv = fold_convert (utype, minv);
maxv = fold_convert (utype, maxv);
if (!integer_zerop (minv))
@ -1193,8 +1211,11 @@ instrument_bool_enum_load (gimple_stmt_iterator *gsi)
gimple_set_location (g, loc);
gsi_insert_after (gsi, g, GSI_NEW_STMT);
gimple_assign_set_rhs_with_ops (&gsi2, NOP_EXPR, urhs, NULL_TREE);
update_stmt (stmt);
if (!can_throw)
{
gimple_assign_set_rhs_with_ops (&gsi2, NOP_EXPR, urhs, NULL_TREE);
update_stmt (stmt);
}
gsi2 = gsi_after_labels (then_bb);
if (flag_sanitize_undefined_trap_on_error)