diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-08-12 21:56:26 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-08-12 21:56:26 +0200 |
commit | b0cea284970de2f81be3a0564afa10a15f7802d6 (patch) | |
tree | 452ba5392a5f769e1c601d722988d77bf90bf45b | |
parent | e86aefb8e955a9545ffd16c960ff70cbad5fc9ad (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/ubsan/pr71512-1.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/ubsan/pr71512-2.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ubsan/pr71512.C | 20 | ||||
-rw-r--r-- | gcc/ubsan.c | 9 |
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 |