aboutsummaryrefslogtreecommitdiff
path: root/gcc/c-family
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2015-07-23 17:14:31 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2015-07-23 17:14:31 +0000
commit5a5062b8dbc430e5f86cb207e540b4f1b0689def (patch)
tree3db028682f88b8818a98ceaf020e40c9051dec15 /gcc/c-family
parent7eb9f42e3b0c7be1db3e48fbda9d3bb70a49454b (diff)
downloadgcc-5a5062b8dbc430e5f86cb207e540b4f1b0689def.zip
gcc-5a5062b8dbc430e5f86cb207e540b4f1b0689def.tar.gz
gcc-5a5062b8dbc430e5f86cb207e540b4f1b0689def.tar.bz2
c-ubsan.c (ubsan_instrument_division): Use unshare_expr throughout.
* c-ubsan.c (ubsan_instrument_division): Use unshare_expr throughout. (ubsan_instrument_shift): Likewise. From-SVN: r226116
Diffstat (limited to 'gcc/c-family')
-rw-r--r--gcc/c-family/ChangeLog5
-rw-r--r--gcc/c-family/c-ubsan.c19
2 files changed, 17 insertions, 7 deletions
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 04c2fd6..caedf8e 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,5 +1,10 @@
2015-07-23 Marek Polacek <polacek@redhat.com>
+ * c-ubsan.c (ubsan_instrument_division): Use unshare_expr throughout.
+ (ubsan_instrument_shift): Likewise.
+
+2015-07-23 Marek Polacek <polacek@redhat.com>
+
PR sanitizer/66908
* c-ubsan.c: Include gimplify.h.
(ubsan_instrument_division): Unshare OP0 and OP1.
diff --git a/gcc/c-family/c-ubsan.c b/gcc/c-family/c-ubsan.c
index 3869511..e0cce84 100644
--- a/gcc/c-family/c-ubsan.c
+++ b/gcc/c-family/c-ubsan.c
@@ -75,7 +75,7 @@ ubsan_instrument_division (location_t loc, tree op0, tree op1)
&& !TYPE_UNSIGNED (type))
{
tree x;
- tt = fold_build2 (EQ_EXPR, boolean_type_node, op1,
+ tt = fold_build2 (EQ_EXPR, boolean_type_node, unshare_expr (op1),
build_int_cst (type, -1));
x = fold_build2 (EQ_EXPR, boolean_type_node, op0,
TYPE_MIN_VALUE (type));
@@ -103,7 +103,7 @@ ubsan_instrument_division (location_t loc, tree op0, tree op1)
TREE_SIDE_EFFECTS (op0) = 1;
}
}
- t = fold_build2 (COMPOUND_EXPR, TREE_TYPE (t), op0, t);
+ t = fold_build2 (COMPOUND_EXPR, TREE_TYPE (t), unshare_expr (op0), t);
if (flag_sanitize_undefined_trap_on_error)
tt = build_call_expr_loc (loc, builtin_decl_explicit (BUILT_IN_TRAP), 0);
else
@@ -117,6 +117,8 @@ ubsan_instrument_division (location_t loc, tree op0, tree op1)
? BUILT_IN_UBSAN_HANDLE_DIVREM_OVERFLOW
: BUILT_IN_UBSAN_HANDLE_DIVREM_OVERFLOW_ABORT;
tt = builtin_decl_explicit (bcode);
+ op0 = unshare_expr (op0);
+ op1 = unshare_expr (op1);
tt = build_call_expr_loc (loc, tt, 3, data, ubsan_encode_value (op0),
ubsan_encode_value (op1));
}
@@ -152,7 +154,7 @@ ubsan_instrument_shift (location_t loc, enum tree_code code,
&& flag_isoc99)
{
tree x = fold_build2 (MINUS_EXPR, op1_utype, uprecm1,
- fold_convert (op1_utype, op1));
+ fold_convert (op1_utype, unshare_expr (op1)));
tt = fold_convert_loc (loc, unsigned_type_for (type0), op0);
tt = fold_build2 (RSHIFT_EXPR, TREE_TYPE (tt), tt, x);
tt = fold_build2 (NE_EXPR, boolean_type_node, tt,
@@ -167,12 +169,13 @@ ubsan_instrument_shift (location_t loc, enum tree_code code,
&& (cxx_dialect >= cxx11))
{
tree x = fold_build2 (MINUS_EXPR, op1_utype, uprecm1,
- fold_convert (op1_utype, op1));
- tt = fold_convert_loc (loc, unsigned_type_for (type0), op0);
+ fold_convert (op1_utype, unshare_expr (op1)));
+ tt = fold_convert_loc (loc, unsigned_type_for (type0),
+ unshare_expr (op0));
tt = fold_build2 (RSHIFT_EXPR, TREE_TYPE (tt), tt, x);
tt = fold_build2 (GT_EXPR, boolean_type_node, tt,
build_int_cst (TREE_TYPE (tt), 1));
- x = fold_build2 (LT_EXPR, boolean_type_node, op0,
+ x = fold_build2 (LT_EXPR, boolean_type_node, unshare_expr (op0),
build_int_cst (type0, 0));
tt = fold_build2 (TRUTH_OR_EXPR, boolean_type_node, x, tt);
}
@@ -197,7 +200,7 @@ ubsan_instrument_shift (location_t loc, enum tree_code code,
TREE_SIDE_EFFECTS (op0) = 1;
}
}
- t = fold_build2 (COMPOUND_EXPR, TREE_TYPE (t), op0, t);
+ t = fold_build2 (COMPOUND_EXPR, TREE_TYPE (t), unshare_expr (op0), t);
t = fold_build2 (TRUTH_OR_EXPR, boolean_type_node, t,
tt ? tt : integer_zero_node);
@@ -216,6 +219,8 @@ ubsan_instrument_shift (location_t loc, enum tree_code code,
? BUILT_IN_UBSAN_HANDLE_SHIFT_OUT_OF_BOUNDS
: BUILT_IN_UBSAN_HANDLE_SHIFT_OUT_OF_BOUNDS_ABORT;
tt = builtin_decl_explicit (bcode);
+ op0 = unshare_expr (op0);
+ op1 = unshare_expr (op1);
tt = build_call_expr_loc (loc, tt, 3, data, ubsan_encode_value (op0),
ubsan_encode_value (op1));
}