From 04a324433515f0b1076cb84b2a8e27c2025cd9d4 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 5 Oct 2016 19:47:34 +0200 Subject: [PATCH] re PR sanitizer/77823 (ICE: in ubsan_encode_value, at ubsan.c:137 with -fsanitize=undefined and vector types) PR sanitizer/77823 * c-ubsan.c (ubsan_instrument_shift): Return NULL_TREE if type0 is not integral. * c-c++-common/ubsan/shift-9.c: New test. From-SVN: r240796 --- gcc/c-family/ChangeLog | 4 +++ gcc/c-family/c-ubsan.c | 6 +++-- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/c-c++-common/ubsan/shift-9.c | 30 ++++++++++++++++++++++ 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/ubsan/shift-9.c diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index ea4278ce5af..d3c7cd5c2c0 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,5 +1,9 @@ 2016-10-05 Jakub Jelinek + PR sanitizer/77823 + * c-ubsan.c (ubsan_instrument_shift): Return NULL_TREE if type0 + is not integral. + * c-common.c (c_common_reswords): Update comment for C++11. 2016-10-04 Jason Merrill diff --git a/gcc/c-family/c-ubsan.c b/gcc/c-family/c-ubsan.c index 4022bdf7963..df7b9328d4c 100644 --- a/gcc/c-family/c-ubsan.c +++ b/gcc/c-family/c-ubsan.c @@ -114,6 +114,9 @@ ubsan_instrument_shift (location_t loc, enum tree_code code, tree t, tt = NULL_TREE; tree type0 = TREE_TYPE (op0); tree type1 = TREE_TYPE (op1); + if (!INTEGRAL_TYPE_P (type0)) + return NULL_TREE; + tree op1_utype = unsigned_type_for (type1); HOST_WIDE_INT op0_prec = TYPE_PRECISION (type0); tree uprecm1 = build_int_cst (op1_utype, op0_prec - 1); @@ -126,8 +129,7 @@ ubsan_instrument_shift (location_t loc, enum tree_code code, /* If this is not a signed operation, don't perform overflow checks. Also punt on bit-fields. */ - if (!INTEGRAL_TYPE_P (type0) - || TYPE_OVERFLOW_WRAPS (type0) + if (TYPE_OVERFLOW_WRAPS (type0) || GET_MODE_BITSIZE (TYPE_MODE (type0)) != TYPE_PRECISION (type0)) ; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 722fb8219e8..54d64ee984f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-10-05 Jakub Jelinek + + PR sanitizer/77823 + * c-c++-common/ubsan/shift-9.c: New test. + 2016-10-05 Senthil Kumar Selvaraj * gcc.dg/torture/pr69941.c: Use __INT32_TYPE__ instead diff --git a/gcc/testsuite/c-c++-common/ubsan/shift-9.c b/gcc/testsuite/c-c++-common/ubsan/shift-9.c new file mode 100644 index 00000000000..5f3fc3a43d3 --- /dev/null +++ b/gcc/testsuite/c-c++-common/ubsan/shift-9.c @@ -0,0 +1,30 @@ +/* PR sanitizer/77823 */ +/* { dg-do compile { target int128 } } */ +/* { dg-options "-fsanitize=undefined -Wno-psabi -w" } */ + +typedef unsigned V __attribute__((vector_size(32))); +typedef unsigned __int128 W __attribute__((vector_size(32))); + +V +foo (V v) +{ + return v << 30; +} + +V +bar (V v, V w) +{ + return v << w; +} + +W +baz (W v) +{ + return v << 30; +} + +W +boo (W v, W w) +{ + return v << w; +} -- 2.30.2