> On 11/15/19 10:05 AM, Jan Hubicka wrote:
> > I am by no means expert in the area so feedback is welcome.  I would
> > like to get the patch to trunk early next week if it works well.
> 
> Thank you Honza for the patch. The idea looks nice to me and I have just
> few comments:
> 
> 1) we should also support foo@@@VER_1 format:
> https://sourceware.org/binutils/docs/as/Symver.html#Symver

We currently support symvers only on definitions, since symvers to
external symbols has different semantics (so it should go in
incrementally).  @@@ makes sense only if you do not attach attribute
dirrectly to a definition as we require right now.

   The third usage of the '.symver' directive is:
        .symver NAME, NAME2@@@NODENAME
   When NAME is not defined within the file being assembled, it is
   treated as NAME2@NODENAME.  When NAME is defined within the file
   being
   assembled, the symbol name, NAME, will be changed to NAME2@@NODENAME.

I really think versioned symbol references should have different
attribute (such as symver_ref since it does different thing). 
> 
> 2) I quoted some error format messages

Thanks,
I updated the patch.

Honza
> 
> Martin

> diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c
> index 8dcd38631d2..1723111bec0 100644
> --- a/gcc/c-family/c-attribs.c
> +++ b/gcc/c-family/c-attribs.c
> @@ -2338,12 +2338,11 @@ handle_symver_attribute (tree *node, tree ARG_UNUSED 
> (name), tree args,
>  {
>    tree symver;
>    const char *symver_str;
> -  unsigned n;
>  
>    if (TREE_CODE (*node) != FUNCTION_DECL && TREE_CODE (*node) != VAR_DECL)
>      {
>        warning (OPT_Wattributes,
> -            "symver attribute is only applicable on functions and 
> variables");
> +            "%<symver%> attribute is only applicable on functions and 
> variables");
>        *no_add_attrs = true;
>        return NULL_TREE;
>      }
> @@ -2351,7 +2350,7 @@ handle_symver_attribute (tree *node, tree ARG_UNUSED 
> (name), tree args,
>    if (!decl_in_symtab_p (*node))
>      {
>        warning (OPT_Wattributes,
> -            "symver attribute is only applicable to symbols");
> +            "%<symver%> attribute is only applicable to symbols");
>        *no_add_attrs = true;
>        return NULL_TREE;
>      }
> @@ -2361,7 +2360,7 @@ handle_symver_attribute (tree *node, tree ARG_UNUSED 
> (name), tree args,
>        symver = TREE_VALUE (args);
>        if (TREE_CODE (symver) != STRING_CST)
>       {
> -       error ("symver attribute argument not a string constant");
> +       error ("%<symver%> attribute argument not a string constant");
>         *no_add_attrs = true;
>         return NULL_TREE;
>       }
> @@ -2369,13 +2368,14 @@ handle_symver_attribute (tree *node, tree ARG_UNUSED 
> (name), tree args,
>        symver_str = TREE_STRING_POINTER (symver);
>  
>        int ats = 0;
> -      for (n = 0; n < TREE_STRING_LENGTH (symver); n++)
> +      for (int n = 0; n < TREE_STRING_LENGTH (symver); n++)
>       if (symver_str[n] == '@')
>         ats++;
>  
> -      if (ats != 1 && ats != 2)
> +      if (ats < 1 || ats > 3)
>       {
> -       error ("symver attribute argument must have format 
> %<name@nodename%>");
> +       error ("%<symver%> attribute argument %qs must contain one, "
> +              "two or three %<@%>", symver_str);
>         *no_add_attrs = true;
>         return NULL_TREE;
>       }
> diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
> index b45a864f3ed..c7caff5023a 100644
> --- a/gcc/cgraphunit.c
> +++ b/gcc/cgraphunit.c
> @@ -776,7 +776,7 @@ process_symver_attribute (symtab_node *n)
>        return;
>      }
>  
> -  /* Create new symbol table entry represneting the version.  */
> +  /* Create new symbol table entry representing the version.  */
>    tree new_decl = copy_node (n->decl);
>  
>    DECL_INITIAL (new_decl) = NULL_TREE;

Reply via email to