summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2018-03-07 09:16:07 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2018-03-07 09:16:07 +0000
commit04258e15e2a3daf84a17c853025ef2a3d5ce7d8f (patch)
tree2db484bc4a8d437f58ff81f1b50abf3051bdeb07
parentc99c7ee14ed83dfffec415b78b1497e7e51be2a9 (diff)
downloadgcc-04258e15e2a3daf84a17c853025ef2a3d5ce7d8f.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@258316 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/multiple_target.c18
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/gcc.target/i386/pr84723-1.c11
-rw-r--r--gcc/testsuite/gcc.target/i386/pr84723-2.c13
-rw-r--r--gcc/testsuite/gcc.target/i386/pr84723-3.c17
-rw-r--r--gcc/testsuite/gcc.target/i386/pr84723-4.c11
-rw-r--r--gcc/testsuite/gcc.target/i386/pr84723-5.c11
8 files changed, 97 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 442b60bd1aa..078a9091b36 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/multiple_target.c b/gcc/multiple_target.c
index ecf69fc2124..a6767985774 100644
--- a/gcc/multiple_target.c
+++ b/gcc/multiple_target.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0440f02a696..a2be76bf2dc 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..0264ecb1159
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr84723-1.c
@@ -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
index 00000000000..6456d6d256f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr84723-2.c
@@ -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
index 00000000000..bb8e7cabc88
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr84723-3.c
@@ -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
index 00000000000..9df1008497c
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr84723-4.c
@@ -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
index 00000000000..c7aa92804fa
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr84723-5.c
@@ -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 } */
+}