aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-08-12 21:56:26 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-08-12 21:56:26 +0200
commitb0cea284970de2f81be3a0564afa10a15f7802d6 (patch)
tree452ba5392a5f769e1c601d722988d77bf90bf45b
parente86aefb8e955a9545ffd16c960ff70cbad5fc9ad (diff)
downloadgcc-b0cea284970de2f81be3a0564afa10a15f7802d6.zip
gcc-b0cea284970de2f81be3a0564afa10a15f7802d6.tar.gz
gcc-b0cea284970de2f81be3a0564afa10a15f7802d6.tar.bz2
re PR c/71512 (ICE: verify_gimple failed with UBSAN)
PR c/71512 * ubsan.c (instrument_si_overflow): Pass true instead of false to gsi_replace. (pass_ubsan::execute): Call gimple_purge_dead_eh_edges at the end of bbs. Return TODO_cleanup_cfg if any returned true. * g++.dg/ubsan/pr71512.C: New test. * c-c++-common/ubsan/pr71512-1.c: New test. * c-c++-common/ubsan/pr71512-2.c: New test. From-SVN: r239430
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/c-c++-common/ubsan/pr71512-1.c5
-rw-r--r--gcc/testsuite/c-c++-common/ubsan/pr71512-2.c5
-rw-r--r--gcc/testsuite/g++.dg/ubsan/pr71512.C20
-rw-r--r--gcc/ubsan.c9
6 files changed, 51 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c920e7a..db6138d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2016-08-12 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/71512
+ * ubsan.c (instrument_si_overflow): Pass true instead of false
+ to gsi_replace.
+ (pass_ubsan::execute): Call gimple_purge_dead_eh_edges at the end
+ of bbs. Return TODO_cleanup_cfg if any returned true.
+
2016-08-12 Michael Meissner <meissner@linux.vnet.ibm.com>
* config/rs6000/vsx.md (vsx_concat_<mode>): Add support for the
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 34c1ab7..6ea002d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2016-08-12 Jakub Jelinek <jakub@redhat.com>
+
+ PR c/71512
+ * g++.dg/ubsan/pr71512.C: New test.
+ * c-c++-common/ubsan/pr71512-1.c: New test.
+ * c-c++-common/ubsan/pr71512-2.c: New test.
+
2016-08-12 Michael Meissner <meissner@linux.vnet.ibm.com>
* gcc.target/powerpc/vec-init-1.c: New tests to test various
diff --git a/gcc/testsuite/c-c++-common/ubsan/pr71512-1.c b/gcc/testsuite/c-c++-common/ubsan/pr71512-1.c
new file mode 100644
index 0000000..2a90ab1
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/ubsan/pr71512-1.c
@@ -0,0 +1,5 @@
+/* PR c/71512 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fnon-call-exceptions -ftrapv -fexceptions -fsanitize=undefined" } */
+
+#include "../../gcc.dg/pr44545.c"
diff --git a/gcc/testsuite/c-c++-common/ubsan/pr71512-2.c b/gcc/testsuite/c-c++-common/ubsan/pr71512-2.c
new file mode 100644
index 0000000..1c95593
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/ubsan/pr71512-2.c
@@ -0,0 +1,5 @@
+/* PR c/71512 */
+/* { dg-do compile } */
+/* { dg-options "-O -fexceptions -fnon-call-exceptions -ftrapv -fsanitize=undefined" } */
+
+#include "../../gcc.dg/pr47086.c"
diff --git a/gcc/testsuite/g++.dg/ubsan/pr71512.C b/gcc/testsuite/g++.dg/ubsan/pr71512.C
new file mode 100644
index 0000000..9822c98
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ubsan/pr71512.C
@@ -0,0 +1,20 @@
+/* PR c/71512 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftrapv -fnon-call-exceptions -fsanitize=undefined" } */
+
+bool
+foo (int *x, int *y, int *z)
+{
+ try
+ {
+ x[0] = y[0] + z[0];
+ x[1] = y[1] - z[1];
+ x[2] = y[2] * z[2];
+ x[3] = -y[3];
+ }
+ catch (...)
+ {
+ return true;
+ }
+ return false;
+}
diff --git a/gcc/ubsan.c b/gcc/ubsan.c
index 8ee57d5..a118af2 100644
--- a/gcc/ubsan.c
+++ b/gcc/ubsan.c
@@ -1292,7 +1292,7 @@ instrument_si_overflow (gimple_stmt_iterator gsi)
? IFN_UBSAN_CHECK_SUB
: IFN_UBSAN_CHECK_MUL, 2, a, b);
gimple_call_set_lhs (g, lhs);
- gsi_replace (&gsi, g, false);
+ gsi_replace (&gsi, g, true);
break;
case NEGATE_EXPR:
/* Represent i = -u;
@@ -1302,7 +1302,7 @@ instrument_si_overflow (gimple_stmt_iterator gsi)
b = gimple_assign_rhs1 (stmt);
g = gimple_build_call_internal (IFN_UBSAN_CHECK_SUB, 2, a, b);
gimple_call_set_lhs (g, lhs);
- gsi_replace (&gsi, g, false);
+ gsi_replace (&gsi, g, true);
break;
case ABS_EXPR:
/* Transform i = ABS_EXPR<u>;
@@ -1955,6 +1955,7 @@ pass_ubsan::execute (function *fun)
{
basic_block bb;
gimple_stmt_iterator gsi;
+ unsigned int ret = 0;
initialize_sanitizer_builtins ();
@@ -2013,8 +2014,10 @@ pass_ubsan::execute (function *fun)
gsi_next (&gsi);
}
+ if (gimple_purge_dead_eh_edges (bb))
+ ret = TODO_cleanup_cfg;
}
- return 0;
+ return ret;
}
} // anon namespace