On Wed, Jun 14, 2017 at 1:03 PM, Martin Liška <mli...@suse.cz> wrote: > On 06/14/2017 11:07 AM, Richard Biener wrote: >> On Wed, Jun 14, 2017 at 9:48 AM, Martin Liška <mli...@suse.cz> wrote: >>> On 06/13/2017 03:20 PM, Richard Biener wrote: >>>> On Tue, Jun 13, 2017 at 2:32 PM, Martin Liška <mli...@suse.cz> wrote: >>>>> Hello. >>>>> >>>>> After some discussions with Richi, I would like to propose patch that will >>>>> come up with a canonical name of attribute names. That means >>>>> __attribute__((__abi_tag__)) >>>>> will be given 'abi_tag' as IDENTIFIER_NAME of the attribute. The change >>>>> can improve >>>>> attribute name lookup and we can delete all the ugly code that compares >>>>> strlen(i1) >>>>> == strlen(i2) + 4, etc. >>>>> >>>>> Patch can bootstrap on ppc64le-redhat-linux and survives regression tests >>>>> (w/ default >>>>> languages). I'm currently testing objc, obj-c++ and go. >>>>> >>>>> Ready to be installed? >>>> >>>> >>>> +tree >>>> +canonize_attr_name (tree attr_name) >>>> +{ >>>> >>>> needs a comment. >>> >>> Did that in header file. >> >> Coding convention requires it at the implementation. >> >>>> >>>> + if (l > 4 && s[0] == '_') >>>> + { >>>> + gcc_assert (s[1] == '_'); >>>> + gcc_assert (s[l - 2] == '_'); >>>> + gcc_assert (s[l - 1] == '_'); >>>> + return get_identifier_with_length (s + 2, l - 4); >>>> + } >>>> >>>> a single gcc_checking_assert please. I think this belongs in attribs.[ch]. >>> >>> Ok, I'll put it there and make it static inline. >>> >>>> >>>> Seeing >>>> >>>> diff --git a/gcc/c-family/c-lex.c b/gcc/c-family/c-lex.c >>>> index e1c8bdff986..6d0e9279ed6 100644 >>>> --- a/gcc/c-family/c-lex.c >>>> +++ b/gcc/c-family/c-lex.c >>>> @@ -316,6 +316,7 @@ c_common_has_attribute (cpp_reader *pfile) >>>> { >>>> attr_name = get_identifier ((const char *) >>>> cpp_token_as_text (pfile, token)); >>>> + attr_name = canonize_attr_name (attr_name); >>>> >>>> I wondered if we can save allocating the non-canonical identifier. Like >>>> with >>>> >>>> tree >>>> canonize_attr_name (const char *attr_name, size_t len) >>>> >>>> as we can pass it IDENTIFIER_POINTER/LENGTH or the token. OTOH >>>> all other cases do have IDENTIFIERs already... >>> >>> Well, back trace where identifiers are allocated is: >>> >>> #0 make_node_stat (code=code@entry=IDENTIFIER_NODE) at >>> ../../gcc/tree.c:1011 >>> #1 0x0000000000da073e in alloc_node (table=<optimized out>) at >>> ../../gcc/stringpool.c:75 >>> #2 0x000000000163b49a in ht_lookup_with_hash (table=0x22f57b0, >>> str=str@entry=0x2383615 "__abi_tag__ (\"cxx11\")))\n#endif\n\n\n#if >>> __cplusplus\n\n// Macro for constexpr, to support in mixed 03/0x >>> mode.\n#ifndef _GLIBCXX_CONSTEXPR\n# if __cplusplus >= 201103L\n# define >>> _GLIBCXX_CONSTEXPR constexpr\n"..., len=len@entry=11, >>> hash=hash@entry=144997377, insert=insert@entry=HT_ALLOC) at >>> ../../libcpp/symtab.c:155 >>> #3 0x000000000162d8ee in lex_identifier (pfile=pfile@entry=0x22f2fe0, >>> base=0x2383615 "__abi_tag__ (\"cxx11\")))\n#endif\n\n\n#if >>> __cplusplus\n\n// Macro for constexpr, to support in mixed 03/0x >>> mode.\n#ifndef _GLIBCXX_CONSTEXPR\n# if __cplusplus >= 201103L\n# define >>> _GLIBCXX_CONSTEXPR constexpr\n"..., >>> starts_ucn=starts_ucn@entry=false, nst=nst@entry=0x7fffffffcd54, >>> spelling=spelling@entry=0x2348d98) at ../../libcpp/lex.c:1459 >>> #4 0x00000000016304f0 in _cpp_lex_direct (pfile=pfile@entry=0x22f2fe0) at >>> ../../libcpp/lex.c:2788 >>> >>> It's probably not possible to make a decision from this context about >>> how an identifier will be used? >> >> No. >> >>>> >>>> @ -24638,6 +24639,11 @@ cp_parser_gnu_attribute_list (cp_parser* parser) >>>> else >>>> { >>>> arguments = build_tree_list_vec (vec); >>>> + tree tv; >>>> + if (arguments != NULL_TREE >>>> + && ((tv = TREE_VALUE (arguments)) != NULL_TREE) >>>> + && TREE_CODE (tv) == IDENTIFIER_NODE) >>>> + TREE_VALUE (arguments) = canonize_attr_name (tv); >>>> release_tree_vector (vec); >>>> } >>>> >>>> are you sure this is needed? This seems to be solely arguments to >>>> attributes. >>> >>> It's need for cases like: >>> __intN_t (8, __QI__); >> >> But __QI__ is not processed in lookup_attribute, is it? So canonizing that >> looks unrelated? I didn't see similar handling in the C FE btw (but >> maybe I missed it). > > It's for instance compared in cmp_attribs in:
Ah, of course. Richard. > /usr/include/stdio.h:391:62: internal compiler error: in cmp_attribs, at > c-family/c-format.c:3985 > __THROWNL __attribute__ ((__format__ (__printf__, 3, 4))); > ^ > nf0xa86d86 cmp_attribs > ../../gcc/c-family/c-format.c:3985 > 0xa86dfe convert_format_name_to_system_name > ../../gcc/c-family/c-format.c:3967 > 0xa8835c convert_format_name_to_system_name > ../../gcc/c-family/c-format.c:339 > 0xa8835c decode_format_attr > ../../gcc/c-family/c-format.c:300 > 0xa8b880 handle_format_attribute(tree_node**, tree_node*, tree_node*, int, > bool*) > ../../gcc/c-family/c-format.c:4019 > 0xa49fb7 decl_attributes(tree_node**, tree_node*, int) > ../../gcc/attribs.c:548 > 0x866dd3 cplus_decl_attributes(tree_node**, tree_node*, int) > ../../gcc/cp/decl2.c:1431 > 0x7786a1 grokfndecl > ../../gcc/cp/decl.c:8836 > 0x85127d grokdeclarator(cp_declarator const*, cp_decl_specifier_seq*, > decl_context, int, tree_node**) > ../../gcc/cp/decl.c:12215 > 0x8542a6 start_decl(cp_declarator const*, cp_decl_specifier_seq*, int, > tree_node*, tree_node*, tree_node**) > ../../gcc/cp/decl.c:4922 > 0x910de7 cp_parser_init_declarator > ../../gcc/cp/parser.c:19268 > 0x905145 cp_parser_simple_declaration > ../../gcc/cp/parser.c:12804 > 0x904cae cp_parser_block_declaration > ../../gcc/cp/parser.c:12629 > 0x904a30 cp_parser_declaration > ../../gcc/cp/parser.c:12527 > 0x904589 cp_parser_declaration_seq_opt > ../../gcc/cp/parser.c:12403 > 0x9066a5 cp_parser_linkage_specification > ../../gcc/cp/parser.c:13557 > 0x9047ad cp_parser_declaration > ../../gcc/cp/parser.c:12464 > 0x904589 cp_parser_declaration_seq_opt > ../../gcc/cp/parser.c:12403 > 0x8f31b7 cp_parser_translation_unit > ../../gcc/cp/parser.c:4364 > 0x94402a c_parse_file() > ../../gcc/cp/parser.c:38486 > > Martin > >> >>>> >>>> The rest of the changes look good but please wait for input from FE >>>> maintainers. >>> >>> Good, I'm attaching v2 and CCing FE maintainers. >>> >>> Martin >>> >>>> >>>> Thanks, >>>> Richard. >>>> >>>>> Martin >>>>> >>>>> >>>>> gcc/cp/ChangeLog: >>>>> >>>>> 2017-06-09 Martin Liska <mli...@suse.cz> >>>>> >>>>> * parser.c (cp_parser_gnu_attribute_list): Canonize attribute >>>>> names. >>>>> (cp_parser_std_attribute): Likewise. >>>>> >>>>> gcc/go/ChangeLog: >>>>> >>>>> 2017-06-09 Martin Liska <mli...@suse.cz> >>>>> >>>>> * go-gcc.cc (Gcc_backend::function): Use no_split_stack >>>>> instead of __no_split_stack__. >>>>> >>>>> gcc/c/ChangeLog: >>>>> >>>>> 2017-06-09 Martin Liska <mli...@suse.cz> >>>>> >>>>> * c-parser.c (c_parser_attributes): Canonize attribute names. >>>>> >>>>> gcc/c-family/ChangeLog: >>>>> >>>>> 2017-06-09 Martin Liska <mli...@suse.cz> >>>>> >>>>> * c-format.c (cmp_attribs): Simplify comparison of attributes. >>>>> * c-lex.c (c_common_has_attribute): Canonize attribute names. >>>>> >>>>> gcc/ChangeLog: >>>>> >>>>> 2017-06-09 Martin Liska <mli...@suse.cz> >>>>> >>>>> * tree.c (cmp_attrib_identifiers): Simplify comparison of >>>>> attributes. >>>>> (private_is_attribute_p): Likewise. >>>>> (private_lookup_attribute): Likewise. >>>>> (private_lookup_attribute_by_prefix): Likewise. >>>>> (remove_attribute): Likewise. >>>>> (canonize_attr_name): New function. >>>>> * tree.h: Declared here. >>>>> >>>>> gcc/testsuite/ChangeLog: >>>>> >>>>> 2017-06-09 Martin Liska <mli...@suse.cz> >>>>> >>>>> * g++.dg/cpp0x/pr65558.C: Change expected warning. >>>>> * gcc.dg/parm-impl-decl-1.c: Likewise. >>>>> * gcc.dg/parm-impl-decl-3.c: Likewise. >>>>> --- >>>>> gcc/c-family/c-format.c | 13 ++-- >>>>> gcc/c-family/c-lex.c | 1 + >>>>> gcc/c/c-parser.c | 9 +++ >>>>> gcc/cp/parser.c | 11 +++- >>>>> gcc/go/go-gcc.cc | 2 +- >>>>> gcc/testsuite/g++.dg/cpp0x/pr65558.C | 2 +- >>>>> gcc/testsuite/gcc.dg/parm-impl-decl-1.c | 2 +- >>>>> gcc/testsuite/gcc.dg/parm-impl-decl-3.c | 2 +- >>>>> gcc/tree.c | 108 >>>>> +++++++++++--------------------- >>>>> gcc/tree.h | 4 ++ >>>>> 10 files changed, 69 insertions(+), 85 deletions(-) >>>>> >>>>> >>> >