re PR middle-end/84723 (ICE in create_target_clone, at multiple_target.c:275)
authorJakub Jelinek <jakub@redhat.com>
Wed, 7 Mar 2018 09:16:07 +0000 (10:16 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 7 Mar 2018 09:16:07 +0000 (10:16 +0100)
PR middle-end/84723
* multiple_target.c: Include tree-inline.h and intl.h.
(expand_target_clones): Diagnose and fail if node->definition and
!tree_versionable_function_p (node->decl).

* gcc.target/i386/pr84723-1.c: New test.
* gcc.target/i386/pr84723-2.c: New test.
* gcc.target/i386/pr84723-3.c: New test.
* gcc.target/i386/pr84723-4.c: New test.
* gcc.target/i386/pr84723-5.c: New test.

From-SVN: r258316

gcc/ChangeLog
gcc/multiple_target.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr84723-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr84723-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr84723-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr84723-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr84723-5.c [new file with mode: 0644]

index 442b60b..078a909 100644 (file)
@@ -1,3 +1,10 @@
+2018-03-07  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/84723
+       * multiple_target.c: Include tree-inline.h and intl.h.
+       (expand_target_clones): Diagnose and fail if node->definition and
+       !tree_versionable_function_p (node->decl).
+
 2018-03-06  John David Anglin  <danglin@gcc.gnu.org>
 
        * config/pa/pa.h (ASM_GENERATE_INTERNAL_LABEL): Revise to use
index ecf69fc..a676798 100644 (file)
@@ -36,6 +36,8 @@ along with GCC; see the file COPYING3.  If not see
 #include "pretty-print.h"
 #include "gimple-iterator.h"
 #include "gimple-walk.h"
+#include "tree-inline.h"
+#include "intl.h"
 
 /* Walker callback that replaces all FUNCTION_DECL of a function that's
    going to be versioned.  */
@@ -312,6 +314,22 @@ expand_target_clones (struct cgraph_node *node, bool definition)
       return false;
     }
 
+  if (node->definition
+      && !tree_versionable_function_p (node->decl))
+    {
+      error_at (DECL_SOURCE_LOCATION (node->decl),
+               "clones for %<target_clones%> attribute cannot be created");
+      const char *reason = NULL;
+      if (lookup_attribute ("noclone", DECL_ATTRIBUTES (node->decl)))
+       reason = G_("function %q+F can never be copied "
+                   "because it has %<noclone%> attribute");
+      else
+       reason = copy_forbidden (DECL_STRUCT_FUNCTION (node->decl));
+      if (reason)
+       inform (DECL_SOURCE_LOCATION (node->decl), reason, node->decl);
+      return false;
+    }
+
   char *attr_str = XNEWVEC (char, attr_len);
   int attrnum = get_attr_str (arglist, attr_str);
   char **attrs = XNEWVEC (char *, attrnum);
index 0440f02..a2be76b 100644 (file)
@@ -1,3 +1,12 @@
+2018-03-07  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/84723
+       * gcc.target/i386/pr84723-1.c: New test.
+       * gcc.target/i386/pr84723-2.c: New test.
+       * gcc.target/i386/pr84723-3.c: New test.
+       * gcc.target/i386/pr84723-4.c: New test.
+       * gcc.target/i386/pr84723-5.c: New test.
+
 2018-03-06  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/64107
diff --git a/gcc/testsuite/gcc.target/i386/pr84723-1.c b/gcc/testsuite/gcc.target/i386/pr84723-1.c
new file mode 100644 (file)
index 0000000..0264ecb
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR middle-end/84723 */
+/* { dg-do compile } */
+/* { dg-require-ifunc } */
+/* { dg-options "-O2" } */
+
+__attribute__((target_clones ("avx", "default")))
+__attribute__((noclone))
+void
+foo (void)     /* { dg-error "clones for .target_clones. attribute cannot be created" } */
+{              /* { dg-message "function .foo. can never be copied because it has .noclone. attribute" "" { target *-*-* } .-1 } */
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr84723-2.c b/gcc/testsuite/gcc.target/i386/pr84723-2.c
new file mode 100644 (file)
index 0000000..6456d6d
--- /dev/null
@@ -0,0 +1,13 @@
+/* PR middle-end/84723 */
+/* { dg-do compile } */
+/* { dg-require-ifunc } */
+/* { dg-options "-O2" } */
+
+__attribute__((target_clones ("avx", "default")))
+void
+foo (void)     /* { dg-error "clones for .target_clones. attribute cannot be created" } */
+{              /* { dg-message "function .foo. can never be copied because it saves address of local label in a static variable" "" { target *-*-* } .-1 } */
+  static void *p = &&lab;
+  asm volatile ("" : "+m" (p) : : "memory");
+lab:;
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr84723-3.c b/gcc/testsuite/gcc.target/i386/pr84723-3.c
new file mode 100644 (file)
index 0000000..bb8e7ca
--- /dev/null
@@ -0,0 +1,17 @@
+/* PR middle-end/84723 */
+/* { dg-do compile } */
+/* { dg-require-ifunc } */
+/* { dg-options "-O2" } */
+
+__attribute__((target_clones ("avx", "default")))
+int
+foo (int x)    /* { dg-error "clones for .target_clones. attribute cannot be created" } */
+{              /* { dg-message "function .foo. can never be copied because it receives a non-local goto" "" { target *-*-* } .-1 } */
+  __label__ lab;
+  __attribute__((noinline)) void bar () { goto lab; }
+  if (x == 5)
+    bar ();
+  x++;
+lab:;
+  return x;
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr84723-4.c b/gcc/testsuite/gcc.target/i386/pr84723-4.c
new file mode 100644 (file)
index 0000000..9df1008
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR middle-end/84723 */
+/* { dg-do compile } */
+/* { dg-require-ifunc } */
+/* { dg-options "-O2" } */
+
+__attribute__((target_clones ("avx", "default")))
+__attribute__((naked))
+void
+foo (void)     /* { dg-error "clones for .target_clones. attribute cannot be created" } */
+{              /* { dg-message "function .foo. can never be copied because it has .noclone. attribute" "" { target *-*-* } .-1 } */
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr84723-5.c b/gcc/testsuite/gcc.target/i386/pr84723-5.c
new file mode 100644 (file)
index 0000000..c7aa928
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR middle-end/84723 */
+/* { dg-do compile } */
+/* { dg-require-ifunc } */
+/* { dg-options "-O2" } */
+
+__attribute__((target_clones ("avx", "default")))
+__attribute__((noipa))
+void
+foo (void)     /* { dg-error "clones for .target_clones. attribute cannot be created" } */
+{              /* { dg-message "function .foo. can never be copied because it has .noclone. attribute" "" { target *-*-* } .-1 } */
+}