From 5c67de11093249111b5163134ad74e3b33d6e606 Mon Sep 17 00:00:00 2001 From: marxin Date: Fri, 10 Mar 2017 13:24:45 +0000 Subject: [PATCH 11/19] Backport r246027 gcc/ChangeLog: 2017-03-10 Martin Liska PR target/65705 PR target/69804 * toplev.c (process_options): Enable MPX with LSAN and UBSAN. * tree-chkp.c (chkp_walk_pointer_assignments): Verify that FIELD != NULL. --- gcc/testsuite/gcc.target/i386/pr71458.c | 2 +- gcc/toplev.c | 50 +++++++++++++++++++-------------- gcc/tree-chkp.c | 2 +- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/gcc/testsuite/gcc.target/i386/pr71458.c b/gcc/testsuite/gcc.target/i386/pr71458.c index 2faf6bb9391..d36b61cbe02 100644 --- a/gcc/testsuite/gcc.target/i386/pr71458.c +++ b/gcc/testsuite/gcc.target/i386/pr71458.c @@ -1,6 +1,6 @@ /* { dg-do compile { target { ! x32 } } } */ /* { dg-options "-fcheck-pointer-bounds -mmpx -fsanitize=bounds" } */ -/* { dg-error "-fcheck-pointer-bounds is not supported with Undefined Behavior Sanitizer" "" { target *-*-* } 0 } */ +/* { dg-error "'-fcheck-pointer-bounds' is not supported with '-fsanitize=bounds'" "" { target *-*-* } 0 } */ enum {} a[0]; void fn1(int); diff --git a/gcc/toplev.c b/gcc/toplev.c index edaae19ec1e..59604e56195 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1263,31 +1263,39 @@ process_options (void) if (targetm.chkp_bound_mode () == VOIDmode) { error_at (UNKNOWN_LOCATION, - "-fcheck-pointer-bounds is not supported for this target"); + "%<-fcheck-pointer-bounds%> is not supported for this " + "target"); flag_check_pointer_bounds = 0; } - if (flag_sanitize) + if (flag_sanitize & SANITIZE_BOUNDS_STRICT) { - if (flag_sanitize & SANITIZE_ADDRESS) - error_at (UNKNOWN_LOCATION, - "-fcheck-pointer-bounds is not supported with " - "Address Sanitizer"); - - if (flag_sanitize & (SANITIZE_UNDEFINED | SANITIZE_NONDEFAULT)) - error_at (UNKNOWN_LOCATION, - "-fcheck-pointer-bounds is not supported with " - "Undefined Behavior Sanitizer"); - - if (flag_sanitize & SANITIZE_LEAK) - error_at (UNKNOWN_LOCATION, - "-fcheck-pointer-bounds is not supported with " - "Leak Sanitizer"); - - if (flag_sanitize & SANITIZE_THREAD) - error_at (UNKNOWN_LOCATION, - "-fcheck-pointer-bounds is not supported with " - "Thread Sanitizer"); + error_at (UNKNOWN_LOCATION, + "%<-fcheck-pointer-bounds%> is not supported with " + "%<-fsanitize=bounds-strict%>"); + flag_check_pointer_bounds = 0; + } + else if (flag_sanitize & SANITIZE_BOUNDS) + { + error_at (UNKNOWN_LOCATION, + "%<-fcheck-pointer-bounds%> is not supported with " + "%<-fsanitize=bounds%>"); + flag_check_pointer_bounds = 0; + } + + if (flag_sanitize & SANITIZE_ADDRESS) + { + error_at (UNKNOWN_LOCATION, + "%<-fcheck-pointer-bounds%> is not supported with " + "Address Sanitizer"); + flag_check_pointer_bounds = 0; + } + + if (flag_sanitize & SANITIZE_THREAD) + { + error_at (UNKNOWN_LOCATION, + "%<-fcheck-pointer-bounds%> is not supported with " + "Thread Sanitizer"); flag_check_pointer_bounds = 0; } diff --git a/gcc/tree-chkp.c b/gcc/tree-chkp.c index 1d1013d01b6..9ab47b8adaf 100644 --- a/gcc/tree-chkp.c +++ b/gcc/tree-chkp.c @@ -3734,7 +3734,7 @@ chkp_walk_pointer_assignments (tree lhs, tree rhs, void *arg, FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (rhs), cnt, field, val) { - if (chkp_type_has_pointer (TREE_TYPE (field))) + if (field && chkp_type_has_pointer (TREE_TYPE (field))) { tree lhs_field = chkp_build_component_ref (lhs, field); chkp_walk_pointer_assignments (lhs_field, val, arg, handler); -- 2.12.0