]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Enhance target and target_clone error messages.
authormarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 2 May 2019 08:43:25 +0000 (08:43 +0000)
committermarxin <marxin@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 2 May 2019 08:43:25 +0000 (08:43 +0000)
2019-05-02  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.
2019-05-02  Martin Liska  <mliska@suse.cz>

* gcc.target/i386/funcspec-4.c: Update scanned pattern.
* g++.target/i386/pr57362.C: Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@270789 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cgraphclones.c
gcc/config/i386/i386-c.c
gcc/config/i386/i386-protos.h
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/funcspec-4.c

index a6ce52335d5de2bb187de434c008a4ee3435a2be..e99c6a1158926c9015811408df00a9191dc23cab 100644 (file)
@@ -1,3 +1,19 @@
+2019-05-02  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.
+
 2019-05-02  Martin Liska  <mliska@suse.cz>
 
        * gcc.c (process_command): Add dummy file only
index 15f7e119d18ea1ad6ad18c827e4d4bd6cfa41364..fd867ecac91a15fd7d8ef4559c3d5de8ccb72e23 100644 (file)
@@ -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;
index 5e7e46fcebe2de61077f0ad1de20b8ffd617e750..50cac3b1a9f4f59fe3ed00cc93f308588f485164 100644 (file)
@@ -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,
index f080ec35afe7896f1d01bab5e2e60d1fd394dfb0..597af643eb85e84b501bec8c059dec7a0ee022c7 100644 (file)
@@ -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
index e7ee83d63726db16b868c25df4bf04b2e69bc09e..bc2348c3bc7716cbc64639d07d85f1bf78ef3e92 100644 (file)
@@ -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);
 
@@ -32071,8 +32082,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)
index 30227ca83b601f18d9c356cf6229317ef24f8b23..851993426150785f81d23f55d905b8f5cb198bc3 100644 (file)
@@ -1,3 +1,8 @@
+2019-05-02  Martin Liska  <mliska@suse.cz>
+
+       * gcc.target/i386/funcspec-4.c: Update scanned pattern.
+       * g++.target/i386/pr57362.C: Likewise.
+
 2019-05-02  Martin Liska  <mliska@suse.cz>
 
        PR target/88809
index 025b97dff8e1cee72641647537f4baf174e5a21f..e345acdef1761e272a8d415312ca0a01b89379f2 100644 (file)
@@ -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" } */