From patchwork Wed Jul 18 21:04:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 945911 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-481833-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="yU5oNTgk"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 41W8mk5jZhz9s4s for ; Thu, 19 Jul 2018 07:05:09 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:reply-to:references:mime-version :content-type:in-reply-to; q=dns; s=default; b=kofhz3kKgoUFYEwE7 Y4xLAEGvb7uAsYMaDOnn0xFk6ODwv0bMPrZ/D0NiO0eRHsVXa39iii9r9wtsx+tx fUe7LnFeizqwyCj9nfKxGxPskzM5FCZxFAtCteSvMGkfWMD1k1lt5l6YJ6csXwB0 wRZqkjzOi8AEDayAQ/L7IOCDss= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:subject:message-id:reply-to:references:mime-version :content-type:in-reply-to; s=default; bh=Xad5rV47AclDqIF8JE8ZDez Szb8=; b=yU5oNTgkUn2tnCy0hbEZ0xK1P+InKbL/wpURKEwdQsMKzzLtk7167ho 53knA3zLI0sSUQP7QltLMfYEfvdtrKdv/Q536tOHYTEhR+GizqjS1QjQdKNEMoPt B51+71Oo/Ptd+sRT+TWL2XFGPLmshmD7qjl+X/5o4eRhD4DVzV6Y= Received: (qmail 107069 invoked by alias); 18 Jul 2018 21:05:01 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 107056 invoked by uid 89); 18 Jul 2018 21:05:01 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-16.9 required=5.0 tests=BAYES_00, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=tree_value, TREE_VALUE, tree_purpose, TREE_PURPOSE X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 18 Jul 2018 21:04:59 +0000 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B1D1B356DA; Wed, 18 Jul 2018 21:04:57 +0000 (UTC) Received: from tucnak.zalov.cz (ovpn-117-71.ams2.redhat.com [10.36.117.71]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 37AB7600C2; Wed, 18 Jul 2018 21:04:57 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.15.2/8.15.2) with ESMTP id w6IL4sdm018263; Wed, 18 Jul 2018 23:04:55 +0200 Received: (from jakub@localhost) by tucnak.zalov.cz (8.15.2/8.15.2/Submit) id w6IL4r5w018262; Wed, 18 Jul 2018 23:04:53 +0200 Date: Wed, 18 Jul 2018 23:04:53 +0200 From: Jakub Jelinek To: Nathan Sidwell Cc: Jason Merrill , gcc-patches@gcc.gnu.org Subject: [C++ PATCH] Further get_identifier ("string literal") C++ FE caching Message-ID: <20180718210453.GI7166@tucnak> Reply-To: Jakub Jelinek References: <20180713134935.GV7166@tucnak> <7802d658-cc0f-664d-9261-d2e9388047a4@acm.org> <20180713165330.GW7166@tucnak> <20180718101931.GX7166@tucnak> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20180718101931.GX7166@tucnak> User-Agent: Mutt/1.9.2 (2017-12-15) X-IsSubscribed: yes On Wed, Jul 18, 2018 at 12:19:31PM +0200, Jakub Jelinek wrote: > Shall I submit an incremental patch for the "abi_tag", "gnu", "begin", "end", "get", > "tuple_size", "tuple_element" etc. identifiers? Here it is in an incremental patch. I've tried to do it only for get_identifier ("string literal") calls that can be called many times during parsing rather than just at most once, and aren't related to -fgnu-tm, -fopenmp, Obj-C++ or vtv. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2018-07-18 Jakub Jelinek * cp-tree.h (enum cp_tree_index): Add CPTI_{ABI_TAG,ALIGNED,BEGIN,END,GET,TUPLE_{ELEMENT,SIZE}}_IDENTIFIER and CPTI_{GNU,TYPE,VALUE,FUN,CLOSURE}_IDENTIFIER. (abi_tag_identifier, aligned_identifier, begin_identifier, end_identifier, get__identifier, gnu_identifier, tuple_element_identifier, tuple_size_identifier, type_identifier, value_identifier, fun_identifier, closure_identifier): Define. * decl.c (initialize_predefined_identifiers): Initialize the above identifiers. (get_tuple_size): Use tuple_size_identifier instead of get_identifier ("tuple_size") and value_identifier instead of get_identifier ("value"). (get_tuple_element_type): Use tuple_element_identifier instead of get_identifier ("tuple_element") and type_identifier instead of get_identifier ("type"). (get_tuple_decomp_init): Use get__identifier instead of get_identifier ("get"). * lambda.c (maybe_add_lambda_conv_op): Use fun_identifier instead of get_identifier ("_FUN"). * parser.c (cp_parser_lambda_declarator_opt): Use closure_identifier instead of get_identifier ("__closure"). (cp_parser_std_attribute): Use gnu_identifier instead of get_identifier ("gnu"). (cp_parser_std_attribute_spec): Likewise. Use aligned_identifier instead of get_identifier ("aligned"). * class.c (check_abi_tags, inherit_targ_abi_tags): Use abi_tag_identifier instead of get_identifier ("abi_tag"). Jakub --- gcc/cp/cp-tree.h.jj 2018-07-18 11:57:55.980529748 +0200 +++ gcc/cp/cp-tree.h 2018-07-18 18:52:44.805248036 +0200 @@ -160,6 +160,18 @@ enum cp_tree_index CPTI_FOR_RANGE_IDENTIFIER, CPTI_FOR_BEGIN_IDENTIFIER, CPTI_FOR_END_IDENTIFIER, + CPTI_ABI_TAG_IDENTIFIER, + CPTI_ALIGNED_IDENTIFIER, + CPTI_BEGIN_IDENTIFIER, + CPTI_END_IDENTIFIER, + CPTI_GET_IDENTIFIER, + CPTI_GNU_IDENTIFIER, + CPTI_TUPLE_ELEMENT_IDENTIFIER, + CPTI_TUPLE_SIZE_IDENTIFIER, + CPTI_TYPE_IDENTIFIER, + CPTI_VALUE_IDENTIFIER, + CPTI_FUN_IDENTIFIER, + CPTI_CLOSURE_IDENTIFIER, CPTI_LANG_NAME_C, CPTI_LANG_NAME_CPLUSPLUS, @@ -286,6 +298,18 @@ extern GTY(()) tree cp_global_trees[CPTI #define for_range_identifier cp_global_trees[CPTI_FOR_RANGE_IDENTIFIER] #define for_begin_identifier cp_global_trees[CPTI_FOR_BEGIN_IDENTIFIER] #define for_end_identifier cp_global_trees[CPTI_FOR_END_IDENTIFIER] +#define abi_tag_identifier cp_global_trees[CPTI_ABI_TAG_IDENTIFIER] +#define aligned_identifier cp_global_trees[CPTI_ALIGNED_IDENTIFIER] +#define begin_identifier cp_global_trees[CPTI_BEGIN_IDENTIFIER] +#define end_identifier cp_global_trees[CPTI_END_IDENTIFIER] +#define get__identifier cp_global_trees[CPTI_GET_IDENTIFIER] +#define gnu_identifier cp_global_trees[CPTI_GNU_IDENTIFIER] +#define tuple_element_identifier cp_global_trees[CPTI_TUPLE_ELEMENT_IDENTIFIER] +#define tuple_size_identifier cp_global_trees[CPTI_TUPLE_SIZE_IDENTIFIER] +#define type_identifier cp_global_trees[CPTI_TYPE_IDENTIFIER] +#define value_identifier cp_global_trees[CPTI_VALUE_IDENTIFIER] +#define fun_identifier cp_global_trees[CPTI_FUN_IDENTIFIER] +#define closure_identifier cp_global_trees[CPTI_CLOSURE_IDENTIFIER] #define lang_name_c cp_global_trees[CPTI_LANG_NAME_C] #define lang_name_cplusplus cp_global_trees[CPTI_LANG_NAME_CPLUSPLUS] --- gcc/cp/decl.c.jj 2018-07-18 11:59:06.220595473 +0200 +++ gcc/cp/decl.c 2018-07-18 18:52:58.676265952 +0200 @@ -4050,6 +4050,18 @@ initialize_predefined_identifiers (void) {"__for_range", &for_range_identifier, cik_normal}, {"__for_begin", &for_begin_identifier, cik_normal}, {"__for_end", &for_end_identifier, cik_normal}, + {"abi_tag", &abi_tag_identifier, cik_normal}, + {"aligned", &aligned_identifier, cik_normal}, + {"begin", &begin_identifier, cik_normal}, + {"end", &end_identifier, cik_normal}, + {"get", &get__identifier, cik_normal}, + {"gnu", &gnu_identifier, cik_normal}, + {"tuple_element", &tuple_element_identifier, cik_normal}, + {"tuple_size", &tuple_size_identifier, cik_normal}, + {"type", &type_identifier, cik_normal}, + {"value", &value_identifier, cik_normal}, + {"_FUN", &fun_identifier, cik_normal}, + {"__closure", &closure_identifier, cik_normal}, {NULL, NULL, cik_normal} }; @@ -7334,14 +7346,14 @@ get_tuple_size (tree type) { tree args = make_tree_vec (1); TREE_VEC_ELT (args, 0) = type; - tree inst = lookup_template_class (get_identifier ("tuple_size"), args, + tree inst = lookup_template_class (tuple_size_identifier, args, /*in_decl*/NULL_TREE, /*context*/std_node, /*entering_scope*/false, tf_none); inst = complete_type (inst); if (inst == error_mark_node || !COMPLETE_TYPE_P (inst)) return NULL_TREE; - tree val = lookup_qualified_name (inst, get_identifier ("value"), + tree val = lookup_qualified_name (inst, value_identifier, /*type*/false, /*complain*/false); if (TREE_CODE (val) == VAR_DECL || TREE_CODE (val) == CONST_DECL) val = maybe_constant_value (val); @@ -7359,12 +7371,12 @@ get_tuple_element_type (tree type, unsig tree args = make_tree_vec (2); TREE_VEC_ELT (args, 0) = build_int_cst (integer_type_node, i); TREE_VEC_ELT (args, 1) = type; - tree inst = lookup_template_class (get_identifier ("tuple_element"), args, + tree inst = lookup_template_class (tuple_element_identifier, args, /*in_decl*/NULL_TREE, /*context*/std_node, /*entering_scope*/false, tf_warning_or_error); - return make_typename_type (inst, get_identifier ("type"), + return make_typename_type (inst, type_identifier, none_type, tf_warning_or_error); } @@ -7373,7 +7385,6 @@ get_tuple_element_type (tree type, unsig static tree get_tuple_decomp_init (tree decl, unsigned i) { - tree get_id = get_identifier ("get"); tree targs = make_tree_vec (1); TREE_VEC_ELT (targs, 0) = build_int_cst (integer_type_node, i); @@ -7386,7 +7397,7 @@ get_tuple_decomp_init (tree decl, unsign || TYPE_REF_IS_RVALUE (etype)) e = move (e); - tree fns = lookup_qualified_name (TREE_TYPE (e), get_id, + tree fns = lookup_qualified_name (TREE_TYPE (e), get__identifier, /*type*/false, /*complain*/false); bool use_member_get = false; @@ -7418,7 +7429,7 @@ get_tuple_decomp_init (tree decl, unsign else { vec *args = make_tree_vector_single (e); - fns = lookup_template_function (get_id, targs); + fns = lookup_template_function (get__identifier, targs); fns = perform_koenig_lookup (fns, args, tf_warning_or_error); return finish_call_expr (fns, &args, /*novirt*/false, /*koenig*/true, tf_warning_or_error); --- gcc/cp/lambda.c.jj 2018-06-16 08:49:51.377795726 +0200 +++ gcc/cp/lambda.c 2018-07-18 18:50:03.840040093 +0200 @@ -1214,8 +1214,7 @@ maybe_add_lambda_conv_op (tree type) /* Now build up the thunk to be returned. */ - name = get_identifier ("_FUN"); - tree statfn = build_lang_decl (FUNCTION_DECL, name, stattype); + tree statfn = build_lang_decl (FUNCTION_DECL, fun_identifier, stattype); SET_DECL_LANGUAGE (statfn, lang_cplusplus); fn = statfn; DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (callop); --- gcc/cp/parser.c.jj 2018-07-18 12:00:22.907667232 +0200 +++ gcc/cp/parser.c 2018-07-18 18:50:46.361095022 +0200 @@ -10638,7 +10638,7 @@ cp_parser_lambda_declarator_opt (cp_pars DECL_INITIALIZED_IN_CLASS_P (fco) = 1; DECL_ARTIFICIAL (fco) = 1; /* Give the object parameter a different name. */ - DECL_NAME (DECL_ARGUMENTS (fco)) = get_identifier ("__closure"); + DECL_NAME (DECL_ARGUMENTS (fco)) = closure_identifier; } if (template_param_list) { @@ -25341,13 +25341,13 @@ cp_parser_std_attribute (cp_parser *pars NULL_TREE); /* C++11 noreturn attribute is equivalent to GNU's. */ if (is_attribute_p ("noreturn", attr_id)) - TREE_PURPOSE (TREE_PURPOSE (attribute)) = get_identifier ("gnu"); + TREE_PURPOSE (TREE_PURPOSE (attribute)) = gnu_identifier; /* C++14 deprecated attribute is equivalent to GNU's. */ else if (is_attribute_p ("deprecated", attr_id)) - TREE_PURPOSE (TREE_PURPOSE (attribute)) = get_identifier ("gnu"); + TREE_PURPOSE (TREE_PURPOSE (attribute)) = gnu_identifier; /* C++17 fallthrough attribute is equivalent to GNU's. */ else if (is_attribute_p ("fallthrough", attr_id)) - TREE_PURPOSE (TREE_PURPOSE (attribute)) = get_identifier ("gnu"); + TREE_PURPOSE (TREE_PURPOSE (attribute)) = gnu_identifier; /* Transactional Memory TS optimize_for_synchronized attribute is equivalent to GNU transaction_callable. */ else if (is_attribute_p ("optimize_for_synchronized", attr_id)) @@ -25367,7 +25367,7 @@ cp_parser_std_attribute (cp_parser *pars vec *vec; int attr_flag = normal_attr; - if (attr_ns == get_identifier ("gnu") + if (attr_ns == gnu_identifier && attribute_takes_identifier_p (attr_id)) /* A GNU attribute that takes an identifier in parameter. */ attr_flag = id_attr; @@ -25580,10 +25580,9 @@ cp_parser_std_attribute_spec (cp_parser /* Build the C++-11 representation of an 'aligned' attribute. */ - attributes = - build_tree_list (build_tree_list (get_identifier ("gnu"), - get_identifier ("aligned")), - alignas_expr); + attributes + = build_tree_list (build_tree_list (gnu_identifier, + aligned_identifier), alignas_expr); } return attributes; --- gcc/cp/class.c.jj 2018-07-16 23:24:23.326390997 +0200 +++ gcc/cp/class.c 2018-07-18 18:39:49.184244081 +0200 @@ -1517,8 +1517,7 @@ check_abi_tags (tree t, tree subob, bool TREE_VALUE (attr) = chainon (data.tags, TREE_VALUE (attr)); else DECL_ATTRIBUTES (t) - = tree_cons (get_identifier ("abi_tag"), data.tags, - DECL_ATTRIBUTES (t)); + = tree_cons (abi_tag_identifier, data.tags, DECL_ATTRIBUTES (t)); } mark_abi_tags (t, false); @@ -1590,8 +1589,7 @@ inherit_targ_abi_tags (tree t) TREE_VALUE (attr) = chainon (data.tags, TREE_VALUE (attr)); else TYPE_ATTRIBUTES (t) - = tree_cons (get_identifier ("abi_tag"), data.tags, - TYPE_ATTRIBUTES (t)); + = tree_cons (abi_tag_identifier, data.tags, TYPE_ATTRIBUTES (t)); } mark_abi_tags (t, false);