MPX: Fix option handling.
authorMartin Liska <mliska@suse.cz>
Fri, 10 Mar 2017 13:24:45 +0000 (14:24 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Fri, 10 Mar 2017 13:24:45 +0000 (13:24 +0000)
2017-03-10  Martin Liska  <mliska@suse.cz>

        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.

From-SVN: r246027

gcc/ChangeLog
gcc/testsuite/gcc.target/i386/pr71458.c
gcc/toplev.c
gcc/tree-chkp.c

index 5050ca8d822c4c3c6303197ab0c572baa54355e0..306b5f140b6153ee3c6872da26d5e710fc2fdab9 100644 (file)
@@ -1,3 +1,11 @@
+2017-03-10  Martin Liska  <mliska@suse.cz>
+
+        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.
+
 2017-03-10  Olivier Hainque  <hainque@adacore.com>
 
        * tree-switch-conversion (array_value_type): Start by resetting
index 2faf6bb9391cc5cfefccdfd490086a1d1e65008e..d36b61cbe02fad513dfb5bb5da37854caf8d5f67 100644 (file)
@@ -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);
index 6a7e4fbdffb646745232267c808202fc6ce749e9..54a4f05c9a1fc967cf3233a70d6489788d196ee9 100644 (file)
@@ -1270,31 +1270,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;
        }
index acd57eac5efdbdfbac0f5594a9b1ee10baa6b2da..75caf83a9829e23483bcc037f3a00913f223e1ce 100644 (file)
@@ -3803,7 +3803,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);