expand: Don't depend on warning flags in code generation of strnlen [PR94189]
authorJakub Jelinek <jakub@redhat.com>
Tue, 17 Mar 2020 09:42:35 +0000 (10:42 +0100)
committerJakub Jelinek <jakub@redhat.com>
Tue, 17 Mar 2020 09:42:35 +0000 (10:42 +0100)
The following testcase FAILs with -O2 -fcompare-debug, but the reason isn't
that we'd emit different code based on -g or non-debug, but rather that
we emit different code depending on whether -w is used or not (or e.g.
-Wno-stringop-overflow or whether some other pass emitted some other warning
already on the call).

Code generation shouldn't depend on whether we emit a warning or not if at
all possible.

The following patch punts (i.e. doesn't optimize the strnlen call to a
constant value) if we would emit the warning if it was enabled.
In the PR there is an alternate patch which does optimize the strnlen call
no matter if we emit the warning or not, though I think I prefer the version
below, e.g. the strnlen call might be crossing field boundaries, which is in
strict reading undefined, but I'd be afraid people do that in the real
world programs.

2020-03-17  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/94189
* builtins.c (expand_builtin_strnlen): Do return NULL_RTX if we would
emit a warning if it was enabled and don't depend on TREE_NO_WARNING
for code-generation.

* gcc.dg/pr94189.c: New test.

gcc/ChangeLog
gcc/builtins.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr94189.c [new file with mode: 0644]

index 25a27f8070d4f8f32488359b1645a1d7290d026d..fc35ceac272a80eede3b18278b0f6fd0dffbac3e 100644 (file)
@@ -1,3 +1,10 @@
+2020-03-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/94189
+       * builtins.c (expand_builtin_strnlen): Do return NULL_RTX if we would
+       emit a warning if it was enabled and don't depend on TREE_NO_WARNING
+       for code-generation.
+
 2020-03-16  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR target/94185
index e4a8694054e2bbd98c0d8361689c17e607a28364..53bae599d3e2ddfe4c08f5b37dd5c51c245512bf 100644 (file)
@@ -3142,27 +3142,25 @@ expand_builtin_strnlen (tree exp, rtx target, machine_mode target_mode)
            return NULL_RTX;
        }
 
-      if (lendata.decl
-         && !TREE_NO_WARNING (exp)
-         && ((tree_int_cst_lt (len, bound))
-             || !exact))
+      if (lendata.decl && (tree_int_cst_lt (len, bound) || !exact))
        {
          location_t warnloc
            = expansion_point_location_if_in_system_header (loc);
 
-         if (warning_at (warnloc, OPT_Wstringop_overflow_,
-                         exact
-                         ? G_("%K%qD specified bound %E exceeds the size %E "
-                              "of unterminated array")
-                         : G_("%K%qD specified bound %E may exceed the size "
-                              "of at most %E of unterminated array"),
-                         exp, func, bound, len))
+         if (!TREE_NO_WARNING (exp)
+             && warning_at (warnloc, OPT_Wstringop_overflow_,
+                            exact
+                            ? G_("%K%qD specified bound %E exceeds the size "
+                                 "%E of unterminated array")
+                            : G_("%K%qD specified bound %E may exceed the "
+                                 "size of at most %E of unterminated array"),
+                            exp, func, bound, len))
            {
              inform (DECL_SOURCE_LOCATION (lendata.decl),
                      "referenced argument declared here");
              TREE_NO_WARNING (exp) = true;
-             return NULL_RTX;
            }
+         return NULL_RTX;
        }
 
       if (!len)
index ac9f0772bcf6322800a073093c5d9c7f580c7848..879a67d88ef21b1500835bad975cd9b8c18af9d3 100644 (file)
@@ -1,3 +1,8 @@
+2020-03-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/94189
+       * gcc.dg/pr94189.c: New test.
+
 2020-03-17  Martin Liska  <mliska@suse.cz>
 
        PR lto/94157
diff --git a/gcc/testsuite/gcc.dg/pr94189.c b/gcc/testsuite/gcc.dg/pr94189.c
new file mode 100644 (file)
index 0000000..f927d55
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR middle-end/94189 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fcompare-debug" } */
+
+const char a[] = { 'a', 'b', 'c', 'd' };/* { dg-message "declared here" } */
+
+int
+foo (void)
+{
+  return __builtin_strnlen (a, 5);     /* { dg-warning "specified bound 5 exceeds the size 4 of unterminated array" } */
+}