> 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;