Commit a164374e by Martin Liska Committed by Martin Liska

Handle multiple 'default' in target attribute (PR middle-end/89970).

2019-04-12  Martin Liska  <mliska@suse.cz>

	PR middle-end/89970
	* multiple_target.c (create_dispatcher_calls): Wrap ifunc
	in error message.
	(separate_attrs): Handle multiple 'default's.
	(expand_target_clones): Rework error handling code.
2019-04-12  Martin Liska  <mliska@suse.cz>

	PR middle-end/89970
	* gcc.target/i386/mvc15.c: New test.
	* gcc.target/i386/mvc3.c: Quote target in error pattern.
	* gcc.target/i386/mvc4.c: Remove duplicit 'default'.

From-SVN: r270314
parent 34f02c07
2019-04-12 Martin Liska <mliska@suse.cz>
PR middle-end/89970
* multiple_target.c (create_dispatcher_calls): Wrap ifunc
in error message.
(separate_attrs): Handle multiple 'default's.
(expand_target_clones): Rework error handling code.
2019-04-12 Kelvin Nilsen <kelvin@gcc.gnu.org>
PR target/87532
......
......@@ -73,7 +73,7 @@ create_dispatcher_calls (struct cgraph_node *node)
if (!targetm.has_ifunc_p ())
{
error_at (DECL_SOURCE_LOCATION (node->decl),
"the call requires ifunc, which is not"
"the call requires %<ifunc%>, which is not"
" supported by this target");
return;
}
......@@ -235,8 +235,10 @@ get_attr_str (tree arglist, char *attr_str)
}
/* Return number of attributes separated by comma and put them into ARGS.
If there is no DEFAULT attribute return -1. If there is an empty
string in attribute return -2. */
If there is no DEFAULT attribute return -1.
If there is an empty string in attribute return -2.
If there are multiple DEFAULT attributes return -3.
*/
static int
separate_attrs (char *attr_str, char **attrs, int attrnum)
......@@ -256,6 +258,8 @@ separate_attrs (char *attr_str, char **attrs, int attrnum)
}
if (default_count == 0)
return -1;
else if (default_count > 1)
return -3;
else if (i + default_count < attrnum)
return -2;
......@@ -347,8 +351,7 @@ expand_target_clones (struct cgraph_node *node, bool definition)
if (attr_len == -1)
{
warning_at (DECL_SOURCE_LOCATION (node->decl),
0,
"single %<target_clones%> attribute is ignored");
0, "single %<target_clones%> attribute is ignored");
return false;
}
......@@ -374,18 +377,26 @@ expand_target_clones (struct cgraph_node *node, bool definition)
char **attrs = XNEWVEC (char *, attrnum);
attrnum = separate_attrs (attr_str, attrs, attrnum);
if (attrnum == -1)
switch (attrnum)
{
case -1:
error_at (DECL_SOURCE_LOCATION (node->decl),
"default target was not set");
XDELETEVEC (attrs);
XDELETEVEC (attr_str);
return false;
}
else if (attrnum == -2)
{
"%<default%> target was not set");
break;
case -2:
error_at (DECL_SOURCE_LOCATION (node->decl),
"an empty string cannot be in %<target_clones%> attribute");
break;
case -3:
error_at (DECL_SOURCE_LOCATION (node->decl),
"multiple %<default%> targets were set");
break;
default:
break;
}
if (attrnum < 0)
{
XDELETEVEC (attrs);
XDELETEVEC (attr_str);
return false;
......
2019-04-12 Martin Liska <mliska@suse.cz>
PR middle-end/89970
* gcc.target/i386/mvc15.c: New test.
* gcc.target/i386/mvc3.c: Quote target in error pattern.
* gcc.target/i386/mvc4.c: Remove duplicit 'default'.
2019-04-12 Kelvin Nilsen <kelvin@gcc.gnu.org>
PR target/87532
......
/* { dg-do compile } */
/* { dg-require-ifunc "" } */
__attribute__((target_clones("default", "default")))
int foo (); /* { dg-error "multiple 'default' targets were set" } */
int
bar ()
{
return foo();
}
......@@ -2,7 +2,7 @@
/* { dg-require-ifunc "" } */
__attribute__((target_clones("avx","arch=slm","arch=core-avx2")))
int foo (); /* { dg-error "default target was not set" } */
int foo (); /* { dg-error "'default' target was not set" } */
int
bar ()
......
/* { dg-do run } */
/* { dg-require-ifunc "" } */
__attribute__((target_clones("default","avx","default")))
__attribute__((target_clones("default","avx")))
int
foo ()
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment