diff --git a/gcc/ChangeLog b/gcc/ChangeLog index df8135bc5fe..dd646d4c7fb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-05-16 Martin Liska + + 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 PR tree-optimization/90394 diff --git a/gcc/multiple_target.c b/gcc/multiple_target.c index 0a87241b251..fa194d416fe 100644 --- a/gcc/multiple_target.c +++ b/gcc/multiple_target.c @@ -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 % attribute"); + else if (node->alias) + reason + = "% cannot be combined with % attribute"; else reason = copy_forbidden (DECL_STRUCT_FUNCTION (node->decl)); if (reason) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d7af875cf74..36dbb1ba8b0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-05-16 Martin Liska + + PR lto/90500 + * gcc.target/i386/pr90500-1.c: New test. + * gcc.target/i386/pr90500-2.c: New test. + 2019-05-16 Vladislav Ivanishin 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 index 00000000000..7ac6a739c05 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr90500-1.c @@ -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 index 00000000000..0fafb8adb21 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr90500-2.c @@ -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 } */