* [PATCH][stage1] Enhance target and target_clone error messages. @ 2019-04-18 11:15 Martin Liška 2019-04-18 12:00 ` Martin Liška 2019-04-19 0:59 ` Martin Sebor 0 siblings, 2 replies; 5+ messages in thread From: Martin Liška @ 2019-04-18 11:15 UTC (permalink / raw) To: gcc-patches [-- Attachment #1: Type: text/plain, Size: 621 bytes --] Hi. The patch distinguishes among target and target_clone attribute when reporting for an error. I've also reworded the affected error messages a bit. Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed after stage1 opens? Thanks, Martin --- gcc/cgraphclones.c | 2 +- gcc/config/i386/i386-c.c | 5 +- gcc/config/i386/i386-protos.h | 4 +- gcc/config/i386/i386.c | 54 +++++++++++++--------- gcc/testsuite/gcc.target/i386/funcspec-4.c | 2 +- 5 files changed, 39 insertions(+), 28 deletions(-) [-- Attachment #2: 0001-Enhance-target-and-target_clone-error-messages.patch --] [-- Type: text/x-patch, Size: 9176 bytes --] diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c index 15f7e119d18..fd867ecac91 100644 --- a/gcc/cgraphclones.c +++ b/gcc/cgraphclones.c @@ -1056,7 +1056,7 @@ cgraph_node::create_version_clone_with_body location_t saved_loc = input_location; tree v = TREE_VALUE (target_attributes); input_location = DECL_SOURCE_LOCATION (new_decl); - bool r = targetm.target_option.valid_attribute_p (new_decl, NULL, v, 0); + bool r = targetm.target_option.valid_attribute_p (new_decl, NULL, v, 1); input_location = saved_loc; if (!r) return NULL; diff --git a/gcc/config/i386/i386-c.c b/gcc/config/i386/i386-c.c index 5e7e46fcebe..50cac3b1a9f 100644 --- a/gcc/config/i386/i386-c.c +++ b/gcc/config/i386/i386-c.c @@ -586,8 +586,9 @@ ix86_pragma_target_parse (tree args, tree pop_target) } else { - cur_tree = ix86_valid_target_attribute_tree (args, &global_options, - &global_options_set); + cur_tree = ix86_valid_target_attribute_tree (NULL_TREE, args, + &global_options, + &global_options_set, 0); if (!cur_tree || cur_tree == error_mark_node) { cl_target_option_restore (&global_options, diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h index 83645e89a81..cfc4783205e 100644 --- a/gcc/config/i386/i386-protos.h +++ b/gcc/config/i386/i386-protos.h @@ -215,9 +215,9 @@ extern unsigned int ix86_minimum_alignment (tree, machine_mode, extern tree ix86_handle_shared_attribute (tree *, tree, tree, int, bool *); extern tree ix86_handle_selectany_attribute (tree *, tree, tree, int, bool *); extern int x86_field_alignment (tree, int); -extern tree ix86_valid_target_attribute_tree (tree, +extern tree ix86_valid_target_attribute_tree (tree, tree, struct gcc_options *, - struct gcc_options *); + struct gcc_options *, bool); extern unsigned int ix86_get_callcvt (const_tree); #endif diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index ed9a9c2e3f7..aa8adc7b2aa 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -847,10 +847,11 @@ static void ix86_function_specific_post_stream_in (struct cl_target_option *); static void ix86_function_specific_print (FILE *, int, struct cl_target_option *); static bool ix86_valid_target_attribute_p (tree, tree, tree, int); -static bool ix86_valid_target_attribute_inner_p (tree, char *[], +static bool ix86_valid_target_attribute_inner_p (tree, tree, char *[], struct gcc_options *, struct gcc_options *, - struct gcc_options *); + struct gcc_options *, + bool); static bool ix86_can_inline_p (tree, tree); static void ix86_set_current_function (tree); static unsigned int ix86_minimum_incoming_stack_boundary (bool); @@ -5149,10 +5150,11 @@ ix86_function_specific_print (FILE *file, int indent, over the list. */ static bool -ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], +ix86_valid_target_attribute_inner_p (tree fndecl, tree args, char *p_strings[], struct gcc_options *opts, struct gcc_options *opts_set, - struct gcc_options *enum_opts_set) + struct gcc_options *enum_opts_set, + bool target_clone_attr) { char *next_optstr; bool ret = true; @@ -5296,9 +5298,12 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], IX86_ATTR_YES ("recip", OPT_mrecip, MASK_RECIP), - }; + location_t loc + = fndecl == NULL ? UNKNOWN_LOCATION : DECL_SOURCE_LOCATION (fndecl); + const char *attr_name = target_clone_attr ? "target_clone" : "target"; + /* If this is a list, recurse to get the options. */ if (TREE_CODE (args) == TREE_LIST) { @@ -5306,9 +5311,10 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], for (; args; args = TREE_CHAIN (args)) if (TREE_VALUE (args) - && !ix86_valid_target_attribute_inner_p (TREE_VALUE (args), + && !ix86_valid_target_attribute_inner_p (fndecl, TREE_VALUE (args), p_strings, opts, opts_set, - enum_opts_set)) + enum_opts_set, + target_clone_attr)) ret = false; return ret; @@ -5316,7 +5322,7 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], else if (TREE_CODE (args) != STRING_CST) { - error ("attribute %<target%> argument not a string"); + error_at (loc, "attribute %qs argument not a string", attr_name); return false; } @@ -5328,7 +5334,6 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], char *p = next_optstr; char *orig_p = p; char *comma = strchr (next_optstr, ','); - const char *opt_string; size_t len, opt_len; int opt; bool opt_set_p; @@ -5374,7 +5379,6 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], { opt = attrs[i].opt; mask = attrs[i].mask; - opt_string = attrs[i].string; break; } } @@ -5382,7 +5386,8 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], /* Process the option. */ if (opt == N_OPTS) { - error ("attribute(target(\"%s\")) is unknown", orig_p); + error_at (loc, "attribute value %qs is unknown in %qs attribute", + orig_p, attr_name); ret = false; } @@ -5410,7 +5415,8 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], { if (p_strings[opt]) { - error ("option(\"%s\") was already specified", opt_string); + error_at (loc, "attribute value %qs was already specified " + "in %qs attribute", orig_p, attr_name); ret = false; } else @@ -5429,7 +5435,8 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], global_dc); else { - error ("attribute(target(\"%s\")) is unknown", orig_p); + error_at (loc, "attribute value %qs is unknown in %qs attribute", + orig_p, attr_name); ret = false; } } @@ -5453,9 +5460,10 @@ release_options_strings (char **option_strings) /* Return a TARGET_OPTION_NODE tree of the target options listed or NULL. */ tree -ix86_valid_target_attribute_tree (tree args, +ix86_valid_target_attribute_tree (tree fndecl, tree args, struct gcc_options *opts, - struct gcc_options *opts_set) + struct gcc_options *opts_set, + bool target_clone_attr) { const char *orig_arch_string = opts->x_ix86_arch_string; const char *orig_tune_string = opts->x_ix86_tune_string; @@ -5471,8 +5479,9 @@ ix86_valid_target_attribute_tree (tree args, memset (&enum_opts_set, 0, sizeof (enum_opts_set)); /* Process each of the options on the chain. */ - if (! ix86_valid_target_attribute_inner_p (args, option_strings, opts, - opts_set, &enum_opts_set)) + if (!ix86_valid_target_attribute_inner_p (fndecl, args, option_strings, opts, + opts_set, &enum_opts_set, + target_clone_attr)) return error_mark_node; /* If the changed options are different from the default, rerun @@ -5545,7 +5554,7 @@ static bool ix86_valid_target_attribute_p (tree fndecl, tree ARG_UNUSED (name), tree args, - int ARG_UNUSED (flags)) + int flags) { struct gcc_options func_options; tree new_target, new_optimize; @@ -5580,8 +5589,9 @@ ix86_valid_target_attribute_p (tree fndecl, cl_target_option_restore (&func_options, TREE_TARGET_OPTION (target_option_default_node)); - new_target = ix86_valid_target_attribute_tree (args, &func_options, - &global_options_set); + /* FLAGS == 1 is used for target_clones attribute. */ + new_target = ix86_valid_target_attribute_tree (fndecl, args, &func_options, + &global_options_set, flags == 1); new_optimize = build_optimization_node (&func_options); @@ -31967,8 +31977,8 @@ get_builtin_code_for_version (tree decl, tree *predicate_list) if (strstr (attrs_str, "arch=") != NULL) { cl_target_option_save (&cur_target, &global_options); - target_node = ix86_valid_target_attribute_tree (attrs, &global_options, - &global_options_set); + target_node = ix86_valid_target_attribute_tree (decl, attrs, &global_options, + &global_options_set, 0); gcc_assert (target_node); if (target_node == error_mark_node) diff --git a/gcc/testsuite/gcc.target/i386/funcspec-4.c b/gcc/testsuite/gcc.target/i386/funcspec-4.c index 025b97dff8e..e345acdef17 100644 --- a/gcc/testsuite/gcc.target/i386/funcspec-4.c +++ b/gcc/testsuite/gcc.target/i386/funcspec-4.c @@ -5,7 +5,7 @@ extern void error1 (void) __attribute__((__target__("fma400"))); /* { dg-error "unknown" } */ /* Multiple arch switches */ -extern void error2 (void) __attribute__((__target__("arch=core2,arch=k8"))); /* { dg-error "already specified" } */ +extern void error2 (void) __attribute__((__target__("arch=core2,arch=k8"))); /* { dg-error "attribute value 'arch=k8' was already specified in 'target' attribute" } */ /* Unknown tune target */ extern void error3 (void) __attribute__((__target__("tune=foobar"))); /* { dg-error "bad value" } */ ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH][stage1] Enhance target and target_clone error messages. 2019-04-18 11:15 [PATCH][stage1] Enhance target and target_clone error messages Martin Liška @ 2019-04-18 12:00 ` Martin Liška 2019-04-19 0:59 ` Martin Sebor 1 sibling, 0 replies; 5+ messages in thread From: Martin Liška @ 2019-04-18 12:00 UTC (permalink / raw) To: gcc-patches [-- Attachment #1: Type: text/plain, Size: 745 bytes --] On 4/18/19 1:09 PM, Martin LiÅ¡ka wrote: > Hi. > > The patch distinguishes among target and target_clone attribute when > reporting for an error. I've also reworded the affected error messages > a bit. > > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > > Ready to be installed after stage1 opens? > Thanks, > Martin > > --- > gcc/cgraphclones.c | 2 +- > gcc/config/i386/i386-c.c | 5 +- > gcc/config/i386/i386-protos.h | 4 +- > gcc/config/i386/i386.c | 54 +++++++++++++--------- > gcc/testsuite/gcc.target/i386/funcspec-4.c | 2 +- > 5 files changed, 39 insertions(+), 28 deletions(-) > > I forgot to attach ChangeLog. Martin [-- Attachment #2: 0001-Enhance-target-and-target_clone-error-messages.patch --] [-- Type: text/x-patch, Size: 10502 bytes --] From 8330ad8d25463ea2f596a617f3e133d2050b9ac8 Mon Sep 17 00:00:00 2001 From: marxin <mliska@suse.cz> Date: Wed, 17 Apr 2019 13:59:14 +0200 Subject: [PATCH] Enhance target and target_clone error messages. gcc/ChangeLog: 2019-04-18 Martin Liska <mliska@suse.cz> * cgraphclones.c: Call valid_attribute_p with 1 for target_clone. * config/i386/i386-c.c (ix86_pragma_target_parse): Use 0 as it's for target attribute. * config/i386/i386-protos.h (ix86_valid_target_attribute_tree): Add new boolean argument. * config/i386/i386.c (ix86_valid_target_attribute_inner_p): Likewise. (ix86_valid_target_attribute_tree): Pass target_clone_attr to ix86_valid_target_attribute_inner_p. (ix86_valid_target_attribute_p): Pass flags argument to ix86_valid_target_attribute_inner_p. (get_builtin_code_for_version): Use 0 as it's target attribute. gcc/testsuite/ChangeLog: 2019-04-18 Martin Liska <mliska@suse.cz> * gcc.target/i386/funcspec-4.c: Update scanned pattern. --- gcc/cgraphclones.c | 2 +- gcc/config/i386/i386-c.c | 5 +- gcc/config/i386/i386-protos.h | 4 +- gcc/config/i386/i386.c | 56 +++++++++++++--------- gcc/testsuite/gcc.target/i386/funcspec-4.c | 2 +- 5 files changed, 41 insertions(+), 28 deletions(-) diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c index 15f7e119d18..fd867ecac91 100644 --- a/gcc/cgraphclones.c +++ b/gcc/cgraphclones.c @@ -1056,7 +1056,7 @@ cgraph_node::create_version_clone_with_body location_t saved_loc = input_location; tree v = TREE_VALUE (target_attributes); input_location = DECL_SOURCE_LOCATION (new_decl); - bool r = targetm.target_option.valid_attribute_p (new_decl, NULL, v, 0); + bool r = targetm.target_option.valid_attribute_p (new_decl, NULL, v, 1); input_location = saved_loc; if (!r) return NULL; diff --git a/gcc/config/i386/i386-c.c b/gcc/config/i386/i386-c.c index 5e7e46fcebe..50cac3b1a9f 100644 --- a/gcc/config/i386/i386-c.c +++ b/gcc/config/i386/i386-c.c @@ -586,8 +586,9 @@ ix86_pragma_target_parse (tree args, tree pop_target) } else { - cur_tree = ix86_valid_target_attribute_tree (args, &global_options, - &global_options_set); + cur_tree = ix86_valid_target_attribute_tree (NULL_TREE, args, + &global_options, + &global_options_set, 0); if (!cur_tree || cur_tree == error_mark_node) { cl_target_option_restore (&global_options, diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h index 83645e89a81..cfc4783205e 100644 --- a/gcc/config/i386/i386-protos.h +++ b/gcc/config/i386/i386-protos.h @@ -215,9 +215,9 @@ extern unsigned int ix86_minimum_alignment (tree, machine_mode, extern tree ix86_handle_shared_attribute (tree *, tree, tree, int, bool *); extern tree ix86_handle_selectany_attribute (tree *, tree, tree, int, bool *); extern int x86_field_alignment (tree, int); -extern tree ix86_valid_target_attribute_tree (tree, +extern tree ix86_valid_target_attribute_tree (tree, tree, struct gcc_options *, - struct gcc_options *); + struct gcc_options *, bool); extern unsigned int ix86_get_callcvt (const_tree); #endif diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index ed9a9c2e3f7..eff22215e99 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -847,10 +847,11 @@ static void ix86_function_specific_post_stream_in (struct cl_target_option *); static void ix86_function_specific_print (FILE *, int, struct cl_target_option *); static bool ix86_valid_target_attribute_p (tree, tree, tree, int); -static bool ix86_valid_target_attribute_inner_p (tree, char *[], +static bool ix86_valid_target_attribute_inner_p (tree, tree, char *[], struct gcc_options *, struct gcc_options *, - struct gcc_options *); + struct gcc_options *, + bool); static bool ix86_can_inline_p (tree, tree); static void ix86_set_current_function (tree); static unsigned int ix86_minimum_incoming_stack_boundary (bool); @@ -5149,10 +5150,11 @@ ix86_function_specific_print (FILE *file, int indent, over the list. */ static bool -ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], +ix86_valid_target_attribute_inner_p (tree fndecl, tree args, char *p_strings[], struct gcc_options *opts, struct gcc_options *opts_set, - struct gcc_options *enum_opts_set) + struct gcc_options *enum_opts_set, + bool target_clone_attr) { char *next_optstr; bool ret = true; @@ -5296,9 +5298,12 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], IX86_ATTR_YES ("recip", OPT_mrecip, MASK_RECIP), - }; + location_t loc + = fndecl == NULL ? UNKNOWN_LOCATION : DECL_SOURCE_LOCATION (fndecl); + const char *attr_name = target_clone_attr ? "target_clone" : "target"; + /* If this is a list, recurse to get the options. */ if (TREE_CODE (args) == TREE_LIST) { @@ -5306,9 +5311,10 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], for (; args; args = TREE_CHAIN (args)) if (TREE_VALUE (args) - && !ix86_valid_target_attribute_inner_p (TREE_VALUE (args), + && !ix86_valid_target_attribute_inner_p (fndecl, TREE_VALUE (args), p_strings, opts, opts_set, - enum_opts_set)) + enum_opts_set, + target_clone_attr)) ret = false; return ret; @@ -5316,7 +5322,7 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], else if (TREE_CODE (args) != STRING_CST) { - error ("attribute %<target%> argument not a string"); + error_at (loc, "attribute %qs argument not a string", attr_name); return false; } @@ -5328,7 +5334,6 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], char *p = next_optstr; char *orig_p = p; char *comma = strchr (next_optstr, ','); - const char *opt_string; size_t len, opt_len; int opt; bool opt_set_p; @@ -5374,7 +5379,6 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], { opt = attrs[i].opt; mask = attrs[i].mask; - opt_string = attrs[i].string; break; } } @@ -5382,7 +5386,8 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], /* Process the option. */ if (opt == N_OPTS) { - error ("attribute(target(\"%s\")) is unknown", orig_p); + error_at (loc, "attribute value %qs is unknown in %qs attribute", + orig_p, attr_name); ret = false; } @@ -5410,7 +5415,8 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], { if (p_strings[opt]) { - error ("option(\"%s\") was already specified", opt_string); + error_at (loc, "attribute value %qs was already specified " + "in %qs attribute", orig_p, attr_name); ret = false; } else @@ -5429,7 +5435,8 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], global_dc); else { - error ("attribute(target(\"%s\")) is unknown", orig_p); + error_at (loc, "attribute value %qs is unknown in %qs attribute", + orig_p, attr_name); ret = false; } } @@ -5453,9 +5460,10 @@ release_options_strings (char **option_strings) /* Return a TARGET_OPTION_NODE tree of the target options listed or NULL. */ tree -ix86_valid_target_attribute_tree (tree args, +ix86_valid_target_attribute_tree (tree fndecl, tree args, struct gcc_options *opts, - struct gcc_options *opts_set) + struct gcc_options *opts_set, + bool target_clone_attr) { const char *orig_arch_string = opts->x_ix86_arch_string; const char *orig_tune_string = opts->x_ix86_tune_string; @@ -5471,8 +5479,9 @@ ix86_valid_target_attribute_tree (tree args, memset (&enum_opts_set, 0, sizeof (enum_opts_set)); /* Process each of the options on the chain. */ - if (! ix86_valid_target_attribute_inner_p (args, option_strings, opts, - opts_set, &enum_opts_set)) + if (!ix86_valid_target_attribute_inner_p (fndecl, args, option_strings, opts, + opts_set, &enum_opts_set, + target_clone_attr)) return error_mark_node; /* If the changed options are different from the default, rerun @@ -5545,7 +5554,7 @@ static bool ix86_valid_target_attribute_p (tree fndecl, tree ARG_UNUSED (name), tree args, - int ARG_UNUSED (flags)) + int flags) { struct gcc_options func_options; tree new_target, new_optimize; @@ -5580,8 +5589,10 @@ ix86_valid_target_attribute_p (tree fndecl, cl_target_option_restore (&func_options, TREE_TARGET_OPTION (target_option_default_node)); - new_target = ix86_valid_target_attribute_tree (args, &func_options, - &global_options_set); + /* FLAGS == 1 is used for target_clones attribute. */ + new_target + = ix86_valid_target_attribute_tree (fndecl, args, &func_options, + &global_options_set, flags == 1); new_optimize = build_optimization_node (&func_options); @@ -31967,8 +31978,9 @@ get_builtin_code_for_version (tree decl, tree *predicate_list) if (strstr (attrs_str, "arch=") != NULL) { cl_target_option_save (&cur_target, &global_options); - target_node = ix86_valid_target_attribute_tree (attrs, &global_options, - &global_options_set); + target_node + = ix86_valid_target_attribute_tree (decl, attrs, &global_options, + &global_options_set, 0); gcc_assert (target_node); if (target_node == error_mark_node) diff --git a/gcc/testsuite/gcc.target/i386/funcspec-4.c b/gcc/testsuite/gcc.target/i386/funcspec-4.c index 025b97dff8e..e345acdef17 100644 --- a/gcc/testsuite/gcc.target/i386/funcspec-4.c +++ b/gcc/testsuite/gcc.target/i386/funcspec-4.c @@ -5,7 +5,7 @@ extern void error1 (void) __attribute__((__target__("fma400"))); /* { dg-error "unknown" } */ /* Multiple arch switches */ -extern void error2 (void) __attribute__((__target__("arch=core2,arch=k8"))); /* { dg-error "already specified" } */ +extern void error2 (void) __attribute__((__target__("arch=core2,arch=k8"))); /* { dg-error "attribute value 'arch=k8' was already specified in 'target' attribute" } */ /* Unknown tune target */ extern void error3 (void) __attribute__((__target__("tune=foobar"))); /* { dg-error "bad value" } */ -- 2.21.0 ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH][stage1] Enhance target and target_clone error messages. 2019-04-18 11:15 [PATCH][stage1] Enhance target and target_clone error messages Martin Liška 2019-04-18 12:00 ` Martin Liška @ 2019-04-19 0:59 ` Martin Sebor 2019-04-23 10:08 ` Martin Liška 1 sibling, 1 reply; 5+ messages in thread From: Martin Sebor @ 2019-04-19 0:59 UTC (permalink / raw) To: Martin Liška, gcc-patches On 4/18/19 5:09 AM, Martin LiÅ¡ka wrote: > Hi. > > The patch distinguishes among target and target_clone attribute when > reporting for an error. I've also reworded the affected error messages > a bit. > > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > > Ready to be installed after stage1 opens? > Thanks, > Martin > > --- > gcc/cgraphclones.c | 2 +- > gcc/config/i386/i386-c.c | 5 +- > gcc/config/i386/i386-protos.h | 4 +- > gcc/config/i386/i386.c | 54 +++++++++++++--------- > gcc/testsuite/gcc.target/i386/funcspec-4.c | 2 +- > 5 files changed, 39 insertions(+), 28 deletions(-) Just a suggestion to also consider making the phrasing in the messages consistent by adding "is" below @@ -5316,7 +5322,7 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], else if (TREE_CODE (args) != STRING_CST) { - error ("attribute %<target%> argument not a string"); + error_at (loc, "attribute %qs argument not a string", attr_name); return false; i.e., "is not a string" and changing the below @@ -5382,7 +5386,8 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], /* Process the option. */ if (opt == N_OPTS) { - error ("attribute(target(\"%s\")) is unknown", orig_p); + error_at (loc, "attribute value %qs is unknown in %qs attribute", + orig_p, attr_name); to error_at (loc, "attribute %qs argument %qs is unknown", attr_name, orig_p); Martin ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH][stage1] Enhance target and target_clone error messages. 2019-04-19 0:59 ` Martin Sebor @ 2019-04-23 10:08 ` Martin Liška 2019-04-30 15:15 ` Jeff Law 0 siblings, 1 reply; 5+ messages in thread From: Martin Liška @ 2019-04-23 10:08 UTC (permalink / raw) To: Martin Sebor, gcc-patches [-- Attachment #1: Type: text/plain, Size: 2222 bytes --] On 4/19/19 2:28 AM, Martin Sebor wrote: > On 4/18/19 5:09 AM, Martin LiÅ¡ka wrote: >> Hi. >> >> The patch distinguishes among target and target_clone attribute when >> reporting for an error. I've also reworded the affected error messages >> a bit. >> >> Patch can bootstrap on x86_64-linux-gnu and survives regression tests. >> >> Ready to be installed after stage1 opens? >> Thanks, >> Martin >> >> --- >>  gcc/cgraphclones.c                        | 2 +- >>  gcc/config/i386/i386-c.c                  | 5 +- >>  gcc/config/i386/i386-protos.h             | 4 +- >>  gcc/config/i386/i386.c                    | 54 +++++++++++++--------- >>  gcc/testsuite/gcc.target/i386/funcspec-4.c | 2 +- >>  5 files changed, 39 insertions(+), 28 deletions(-) > > Just a suggestion to also consider making the phrasing in the messages > consistent by adding "is" below > > @@ -5316,7 +5322,7 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], > >   else if (TREE_CODE (args) != STRING_CST) >     { > -     error ("attribute %<target%> argument not a string"); > +     error_at (loc, "attribute %qs argument not a string", attr_name); >       return false; > > i.e., "is not a string" and changing the below > > @@ -5382,7 +5386,8 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], >       /* Process the option. */ >       if (opt == N_OPTS) >     { > -     error ("attribute(target(\"%s\")) is unknown", orig_p); > +     error_at (loc, "attribute value %qs is unknown in %qs attribute", > +           orig_p, attr_name); > > to > >  error_at (loc, "attribute %qs argument %qs is unknown", >            attr_name, orig_p); > > Martin Thank you Martin. I'm sending updated patch. Martin [-- Attachment #2: 0001-Enhance-target-and-target_clone-error-messages.patch --] [-- Type: text/x-patch, Size: 11173 bytes --] From 2778f9ab4f1cd091780694e8cc1335d6125d95ec Mon Sep 17 00:00:00 2001 From: marxin <mliska@suse.cz> Date: Wed, 17 Apr 2019 13:59:14 +0200 Subject: [PATCH] Enhance target and target_clone error messages. gcc/ChangeLog: 2019-04-18 Martin Liska <mliska@suse.cz> * cgraphclones.c: Call valid_attribute_p with 1 for target_clone. * config/i386/i386-c.c (ix86_pragma_target_parse): Use 0 as it's for target attribute. * config/i386/i386-protos.h (ix86_valid_target_attribute_tree): Add new boolean argument. * config/i386/i386.c (ix86_valid_target_attribute_inner_p): Likewise. (ix86_valid_target_attribute_tree): Pass target_clone_attr to ix86_valid_target_attribute_inner_p. (ix86_valid_target_attribute_p): Pass flags argument to ix86_valid_target_attribute_inner_p. (get_builtin_code_for_version): Use 0 as it's target attribute. gcc/testsuite/ChangeLog: 2019-04-18 Martin Liska <mliska@suse.cz> * gcc.target/i386/funcspec-4.c: Update scanned pattern. * g++.target/i386/pr57362.C: Likewise. --- gcc/cgraphclones.c | 2 +- gcc/config/i386/i386-c.c | 5 +- gcc/config/i386/i386-protos.h | 4 +- gcc/config/i386/i386.c | 56 +++++++++++++--------- gcc/testsuite/g++.target/i386/pr57362.C | 2 +- gcc/testsuite/gcc.target/i386/funcspec-4.c | 2 +- 6 files changed, 42 insertions(+), 29 deletions(-) diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c index 15f7e119d18..fd867ecac91 100644 --- a/gcc/cgraphclones.c +++ b/gcc/cgraphclones.c @@ -1056,7 +1056,7 @@ cgraph_node::create_version_clone_with_body location_t saved_loc = input_location; tree v = TREE_VALUE (target_attributes); input_location = DECL_SOURCE_LOCATION (new_decl); - bool r = targetm.target_option.valid_attribute_p (new_decl, NULL, v, 0); + bool r = targetm.target_option.valid_attribute_p (new_decl, NULL, v, 1); input_location = saved_loc; if (!r) return NULL; diff --git a/gcc/config/i386/i386-c.c b/gcc/config/i386/i386-c.c index 5e7e46fcebe..50cac3b1a9f 100644 --- a/gcc/config/i386/i386-c.c +++ b/gcc/config/i386/i386-c.c @@ -586,8 +586,9 @@ ix86_pragma_target_parse (tree args, tree pop_target) } else { - cur_tree = ix86_valid_target_attribute_tree (args, &global_options, - &global_options_set); + cur_tree = ix86_valid_target_attribute_tree (NULL_TREE, args, + &global_options, + &global_options_set, 0); if (!cur_tree || cur_tree == error_mark_node) { cl_target_option_restore (&global_options, diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h index 83645e89a81..cfc4783205e 100644 --- a/gcc/config/i386/i386-protos.h +++ b/gcc/config/i386/i386-protos.h @@ -215,9 +215,9 @@ extern unsigned int ix86_minimum_alignment (tree, machine_mode, extern tree ix86_handle_shared_attribute (tree *, tree, tree, int, bool *); extern tree ix86_handle_selectany_attribute (tree *, tree, tree, int, bool *); extern int x86_field_alignment (tree, int); -extern tree ix86_valid_target_attribute_tree (tree, +extern tree ix86_valid_target_attribute_tree (tree, tree, struct gcc_options *, - struct gcc_options *); + struct gcc_options *, bool); extern unsigned int ix86_get_callcvt (const_tree); #endif diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 198af816f74..49f48e6041c 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -847,10 +847,11 @@ static void ix86_function_specific_post_stream_in (struct cl_target_option *); static void ix86_function_specific_print (FILE *, int, struct cl_target_option *); static bool ix86_valid_target_attribute_p (tree, tree, tree, int); -static bool ix86_valid_target_attribute_inner_p (tree, char *[], +static bool ix86_valid_target_attribute_inner_p (tree, tree, char *[], struct gcc_options *, struct gcc_options *, - struct gcc_options *); + struct gcc_options *, + bool); static bool ix86_can_inline_p (tree, tree); static void ix86_set_current_function (tree); static unsigned int ix86_minimum_incoming_stack_boundary (bool); @@ -5149,10 +5150,11 @@ ix86_function_specific_print (FILE *file, int indent, over the list. */ static bool -ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], +ix86_valid_target_attribute_inner_p (tree fndecl, tree args, char *p_strings[], struct gcc_options *opts, struct gcc_options *opts_set, - struct gcc_options *enum_opts_set) + struct gcc_options *enum_opts_set, + bool target_clone_attr) { char *next_optstr; bool ret = true; @@ -5296,9 +5298,12 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], IX86_ATTR_YES ("recip", OPT_mrecip, MASK_RECIP), - }; + location_t loc + = fndecl == NULL ? UNKNOWN_LOCATION : DECL_SOURCE_LOCATION (fndecl); + const char *attr_name = target_clone_attr ? "target_clone" : "target"; + /* If this is a list, recurse to get the options. */ if (TREE_CODE (args) == TREE_LIST) { @@ -5306,9 +5311,10 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], for (; args; args = TREE_CHAIN (args)) if (TREE_VALUE (args) - && !ix86_valid_target_attribute_inner_p (TREE_VALUE (args), + && !ix86_valid_target_attribute_inner_p (fndecl, TREE_VALUE (args), p_strings, opts, opts_set, - enum_opts_set)) + enum_opts_set, + target_clone_attr)) ret = false; return ret; @@ -5316,7 +5322,7 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], else if (TREE_CODE (args) != STRING_CST) { - error ("attribute %<target%> argument not a string"); + error_at (loc, "attribute %qs argument is not a string", attr_name); return false; } @@ -5328,7 +5334,6 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], char *p = next_optstr; char *orig_p = p; char *comma = strchr (next_optstr, ','); - const char *opt_string; size_t len, opt_len; int opt; bool opt_set_p; @@ -5374,7 +5379,6 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], { opt = attrs[i].opt; mask = attrs[i].mask; - opt_string = attrs[i].string; break; } } @@ -5382,7 +5386,8 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], /* Process the option. */ if (opt == N_OPTS) { - error ("attribute(target(\"%s\")) is unknown", orig_p); + error_at (loc, "attribute %qs argument %qs is unknown", + orig_p, attr_name); ret = false; } @@ -5410,7 +5415,8 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], { if (p_strings[opt]) { - error ("option(\"%s\") was already specified", opt_string); + error_at (loc, "attribute value %qs was already specified " + "in %qs attribute", orig_p, attr_name); ret = false; } else @@ -5429,7 +5435,8 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], global_dc); else { - error ("attribute(target(\"%s\")) is unknown", orig_p); + error_at (loc, "attribute value %qs is unknown in %qs attribute", + orig_p, attr_name); ret = false; } } @@ -5453,9 +5460,10 @@ release_options_strings (char **option_strings) /* Return a TARGET_OPTION_NODE tree of the target options listed or NULL. */ tree -ix86_valid_target_attribute_tree (tree args, +ix86_valid_target_attribute_tree (tree fndecl, tree args, struct gcc_options *opts, - struct gcc_options *opts_set) + struct gcc_options *opts_set, + bool target_clone_attr) { const char *orig_arch_string = opts->x_ix86_arch_string; const char *orig_tune_string = opts->x_ix86_tune_string; @@ -5471,8 +5479,9 @@ ix86_valid_target_attribute_tree (tree args, memset (&enum_opts_set, 0, sizeof (enum_opts_set)); /* Process each of the options on the chain. */ - if (! ix86_valid_target_attribute_inner_p (args, option_strings, opts, - opts_set, &enum_opts_set)) + if (!ix86_valid_target_attribute_inner_p (fndecl, args, option_strings, opts, + opts_set, &enum_opts_set, + target_clone_attr)) return error_mark_node; /* If the changed options are different from the default, rerun @@ -5545,7 +5554,7 @@ static bool ix86_valid_target_attribute_p (tree fndecl, tree ARG_UNUSED (name), tree args, - int ARG_UNUSED (flags)) + int flags) { struct gcc_options func_options; tree new_target, new_optimize; @@ -5580,8 +5589,10 @@ ix86_valid_target_attribute_p (tree fndecl, cl_target_option_restore (&func_options, TREE_TARGET_OPTION (target_option_default_node)); - new_target = ix86_valid_target_attribute_tree (args, &func_options, - &global_options_set); + /* FLAGS == 1 is used for target_clones attribute. */ + new_target + = ix86_valid_target_attribute_tree (fndecl, args, &func_options, + &global_options_set, flags == 1); new_optimize = build_optimization_node (&func_options); @@ -32103,8 +32114,9 @@ get_builtin_code_for_version (tree decl, tree *predicate_list) if (strstr (attrs_str, "arch=") != NULL) { cl_target_option_save (&cur_target, &global_options); - target_node = ix86_valid_target_attribute_tree (attrs, &global_options, - &global_options_set); + target_node + = ix86_valid_target_attribute_tree (decl, attrs, &global_options, + &global_options_set, 0); gcc_assert (target_node); if (target_node == error_mark_node) diff --git a/gcc/testsuite/g++.target/i386/pr57362.C b/gcc/testsuite/g++.target/i386/pr57362.C index 5e612130357..c76e5206c32 100644 --- a/gcc/testsuite/g++.target/i386/pr57362.C +++ b/gcc/testsuite/g++.target/i386/pr57362.C @@ -199,4 +199,4 @@ int foo(void) { return 1; } /* { dg-prune-output "attribute.* is unknown" } */ /* { dg-prune-output "missing 'target' attribute*" } */ /* { dg-prune-output "redefinition of 'int foo" } */ -/* { dg-prune-output "no dispatcher found for" } */ +/* { dg-prune-output "ISA '.*' is not supported in 'target' attribute, use 'arch=' syntax" } */ diff --git a/gcc/testsuite/gcc.target/i386/funcspec-4.c b/gcc/testsuite/gcc.target/i386/funcspec-4.c index 025b97dff8e..e345acdef17 100644 --- a/gcc/testsuite/gcc.target/i386/funcspec-4.c +++ b/gcc/testsuite/gcc.target/i386/funcspec-4.c @@ -5,7 +5,7 @@ extern void error1 (void) __attribute__((__target__("fma400"))); /* { dg-error "unknown" } */ /* Multiple arch switches */ -extern void error2 (void) __attribute__((__target__("arch=core2,arch=k8"))); /* { dg-error "already specified" } */ +extern void error2 (void) __attribute__((__target__("arch=core2,arch=k8"))); /* { dg-error "attribute value 'arch=k8' was already specified in 'target' attribute" } */ /* Unknown tune target */ extern void error3 (void) __attribute__((__target__("tune=foobar"))); /* { dg-error "bad value" } */ -- 2.21.0 ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH][stage1] Enhance target and target_clone error messages. 2019-04-23 10:08 ` Martin Liška @ 2019-04-30 15:15 ` Jeff Law 0 siblings, 0 replies; 5+ messages in thread From: Jeff Law @ 2019-04-30 15:15 UTC (permalink / raw) To: Martin Liška, Martin Sebor, gcc-patches On 4/23/19 4:06 AM, Martin LiÅ¡ka wrote: > On 4/19/19 2:28 AM, Martin Sebor wrote: >> On 4/18/19 5:09 AM, Martin LiÅ¡ka wrote: >>> Hi. >>> >>> The patch distinguishes among target and target_clone attribute when >>> reporting for an error. I've also reworded the affected error messages >>> a bit. >>> >>> Patch can bootstrap on x86_64-linux-gnu and survives regression tests. >>> >>> Ready to be installed after stage1 opens? >>> Thanks, >>> Martin >>> >>> --- >>>  gcc/cgraphclones.c                        | 2 +- >>>  gcc/config/i386/i386-c.c                  | 5 +- >>>  gcc/config/i386/i386-protos.h             | 4 +- >>>  gcc/config/i386/i386.c                    | 54 +++++++++++++--------- >>>  gcc/testsuite/gcc.target/i386/funcspec-4.c | 2 +- >>>  5 files changed, 39 insertions(+), 28 deletions(-) >> Just a suggestion to also consider making the phrasing in the messages >> consistent by adding "is" below >> >> @@ -5316,7 +5322,7 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], >> >>   else if (TREE_CODE (args) != STRING_CST) >>     { >> -     error ("attribute %<target%> argument not a string"); >> +     error_at (loc, "attribute %qs argument not a string", attr_name); >>       return false; >> >> i.e., "is not a string" and changing the below >> >> @@ -5382,7 +5386,8 @@ ix86_valid_target_attribute_inner_p (tree args, char *p_strings[], >>       /* Process the option. */ >>       if (opt == N_OPTS) >>     { >> -     error ("attribute(target(\"%s\")) is unknown", orig_p); >> +     error_at (loc, "attribute value %qs is unknown in %qs attribute", >> +           orig_p, attr_name); >> >> to >> >>  error_at (loc, "attribute %qs argument %qs is unknown", >>            attr_name, orig_p); >> >> Martin > Thank you Martin. I'm sending updated patch. > > Martin > > > 0001-Enhance-target-and-target_clone-error-messages.patch > > From 2778f9ab4f1cd091780694e8cc1335d6125d95ec Mon Sep 17 00:00:00 2001 > From: marxin <mliska@suse.cz> > Date: Wed, 17 Apr 2019 13:59:14 +0200 > Subject: [PATCH] Enhance target and target_clone error messages. > > gcc/ChangeLog: > > 2019-04-18 Martin Liska <mliska@suse.cz> > > * cgraphclones.c: Call valid_attribute_p with 1 for > target_clone. > * config/i386/i386-c.c (ix86_pragma_target_parse): Use 0 as > it's for target attribute. > * config/i386/i386-protos.h (ix86_valid_target_attribute_tree): > Add new boolean argument. > * config/i386/i386.c (ix86_valid_target_attribute_inner_p): > Likewise. > (ix86_valid_target_attribute_tree): Pass target_clone_attr > to ix86_valid_target_attribute_inner_p. > (ix86_valid_target_attribute_p): Pass flags argument to > ix86_valid_target_attribute_inner_p. > (get_builtin_code_for_version): Use 0 as it's target attribute. > > gcc/testsuite/ChangeLog: > > 2019-04-18 Martin Liska <mliska@suse.cz> > > * gcc.target/i386/funcspec-4.c: Update scanned pattern. > * g++.target/i386/pr57362.C: Likewise. OK Jeff ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2019-04-30 15:14 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-04-18 11:15 [PATCH][stage1] Enhance target and target_clone error messages Martin Liška 2019-04-18 12:00 ` Martin Liška 2019-04-19 0:59 ` Martin Sebor 2019-04-23 10:08 ` Martin Liška 2019-04-30 15:15 ` Jeff Law
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).