Do not allow target_clones with alias attr (PR lto/90500).
authorMartin Liska <mliska@suse.cz>
Thu, 16 May 2019 13:08:48 +0000 (15:08 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Thu, 16 May 2019 13:08:48 +0000 (13:08 +0000)
2019-05-16  Martin Liska  <mliska@suse.cz>

PR lto/90500
* multiple_target.c (expand_target_clones): Do not allow
target_clones being used with a symbol that is an alias.
2019-05-16  Martin Liska  <mliska@suse.cz>

PR lto/90500
* gcc.target/i386/pr90500-1.c: New test.
* gcc.target/i386/pr90500-2.c: New test.

From-SVN: r271289

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

index df8135bc5fed542499f9dbea9fdfb17ab4a77150..dd646d4c7fbb13a9bbbe43517b32a75ebb737d98 100644 (file)
@@ -1,3 +1,9 @@
+2019-05-16  Martin Liska  <mliska@suse.cz>
+
+       PR lto/90500
+       * multiple_target.c (expand_target_clones): Do not allow
+       target_clones being used with a symbol that is an alias.
+
 2019-05-16  Vladislav Ivanishin  <vlad@ispras.ru>
 
        PR tree-optimization/90394
index 0a87241b25191ae910289fc5fb3d296ae554ff19..fa194d416fe00eee1892cd8293ab5fd254c9f192 100644 (file)
@@ -356,7 +356,7 @@ expand_target_clones (struct cgraph_node *node, bool definition)
     }
 
   if (node->definition
-      && !tree_versionable_function_p (node->decl))
+      && (node->alias || !tree_versionable_function_p (node->decl)))
     {
       auto_diagnostic_group d;
       error_at (DECL_SOURCE_LOCATION (node->decl),
@@ -365,6 +365,9 @@ expand_target_clones (struct cgraph_node *node, bool definition)
       if (lookup_attribute ("noclone", DECL_ATTRIBUTES (node->decl)))
        reason = G_("function %q+F can never be copied "
                    "because it has %<noclone%> attribute");
+      else if (node->alias)
+       reason
+         = "%<target_clones%> cannot be combined with %<alias%> attribute";
       else
        reason = copy_forbidden (DECL_STRUCT_FUNCTION (node->decl));
       if (reason)
index d7af875cf74f053cef2ad90e10a8cb9d308d5da2..36dbb1ba8b0968c25568c95ebd344b3b45fb613c 100644 (file)
@@ -1,3 +1,9 @@
+2019-05-16  Martin Liska  <mliska@suse.cz>
+
+       PR lto/90500
+       * gcc.target/i386/pr90500-1.c: New test.
+       * gcc.target/i386/pr90500-2.c: New test.
+
 2019-05-16  Vladislav Ivanishin  <vlad@ispras.ru>
 
        PR tree-optimization/90394
diff --git a/gcc/testsuite/gcc.target/i386/pr90500-1.c b/gcc/testsuite/gcc.target/i386/pr90500-1.c
new file mode 100644 (file)
index 0000000..7ac6a73
--- /dev/null
@@ -0,0 +1,8 @@
+/* PR middle-end/84723 */
+/* { dg-do compile } */
+/* { dg-require-ifunc } */
+
+__attribute__((target_clones("arch=haswell", "default"))) int __tanh() {}
+__typeof(__tanh) tanhf64 __attribute__((alias("__tanh")))/* { dg-error "clones for .target_clones. attribute cannot be created" } */
+  /* { dg-message "'target_clones' cannot be combined with 'alias' attribute" "" { target *-*-* } .-1 } */
+__attribute__((__copy__(__tanh)));
diff --git a/gcc/testsuite/gcc.target/i386/pr90500-2.c b/gcc/testsuite/gcc.target/i386/pr90500-2.c
new file mode 100644 (file)
index 0000000..0fafb8a
--- /dev/null
@@ -0,0 +1,7 @@
+/* PR middle-end/84723 */
+/* { dg-do compile } */
+/* { dg-require-ifunc } */
+
+__attribute__((target_clones("arch=haswell", "default"))) int __tanh() {}
+__typeof(__tanh) tanhf64 __attribute__((alias("__tanh"),target_clones("arch=haswell", "default"))); /* { dg-error "clones for .target_clones. attribute cannot be created" } */
+  /* { dg-message "'target_clones' cannot be combined with 'alias' attribute" "" { target *-*-* } .-1 } */