From patchwork Wed Jun 16 21:19:51 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathan Froyd X-Patchwork-Id: 55938 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 2A783B7D66 for ; Thu, 17 Jun 2010 07:20:03 +1000 (EST) Received: (qmail 4645 invoked by alias); 16 Jun 2010 21:20:00 -0000 Received: (qmail 4628 invoked by uid 22791); 16 Jun 2010 21:19:58 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL, BAYES_00, TW_FN, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 16 Jun 2010 21:19:53 +0000 Received: (qmail 27513 invoked from network); 16 Jun 2010 21:19:51 -0000 Received: from unknown (HELO localhost) (froydnj@127.0.0.2) by mail.codesourcery.com with ESMTPA; 16 Jun 2010 21:19:51 -0000 Date: Wed, 16 Jun 2010 14:19:51 -0700 From: Nathan Froyd To: gcc-patches@gcc.gnu.org Subject: [PATCH,c++] convert arg_lookup.{classes,namespaces} to VECs Message-ID: <20100616211951.GJ27105@codesourcery.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.17+20080114 (2008-01-14) X-IsSubscribed: yes 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 AS $SUBEJCT suggests. Removal of TREE_LISTs in an area which has its own timevar can't be a bad thing. The only interesting part of this patch is the middle-end changes, which I need separate approval for. vec_member can be used in other followup patches as well. Tested x86_64-unknown-linux-gnu. -Nathan gcc/ * tree.h (vec_member): Declare. * tree.c (vec_member): Define. gcc/cp/ * name-lookup.c (struct arg_lookup): Convert namesspaces and classes fields to VEC. (arg_assoc_namespace): Adjust for new type of namespaces. (arg_assoc_class): Adjust for new type of classes. (lookup_arg_dependent): Use make_tree_vector and release_tree_vector. * typeck2.c (build_x_arrow): Use vec_member. diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c index 0c759c6..2643e8c 100644 --- a/gcc/cp/name-lookup.c +++ b/gcc/cp/name-lookup.c @@ -4589,8 +4589,8 @@ struct arg_lookup { tree name; VEC(tree,gc) *args; - tree namespaces; - tree classes; + VEC(tree,gc) *namespaces; + VEC(tree,gc) *classes; tree functions; }; @@ -4667,9 +4667,9 @@ arg_assoc_namespace (struct arg_lookup *k, tree scope) { tree value; - if (purpose_member (scope, k->namespaces)) - return 0; - k->namespaces = tree_cons (scope, NULL_TREE, k->namespaces); + if (vec_member (scope, k->namespaces)) + return false; + VEC_safe_push (tree, gc, k->namespaces, scope); /* Check out our super-users. */ for (value = DECL_NAMESPACE_ASSOCIATIONS (scope); value; @@ -4850,9 +4850,9 @@ arg_assoc_class (struct arg_lookup *k, tree type) if (!CLASS_TYPE_P (type)) return false; - if (purpose_member (type, k->classes)) + if (vec_member (type, k->classes)) return false; - k->classes = tree_cons (type, NULL_TREE, k->classes); + VEC_safe_push (tree, gc, k->classes, type); if (TYPE_CLASS_SCOPE_P (type) && arg_assoc_class_only (k, TYPE_CONTEXT (type))) @@ -5049,14 +5049,14 @@ lookup_arg_dependent (tree name, tree fns, VEC(tree,gc) *args) k.name = name; k.args = args; k.functions = fns; - k.classes = NULL_TREE; + k.classes = make_tree_vector (); /* We previously performed an optimization here by setting NAMESPACES to the current namespace when it was safe. However, DR 164 says that namespaces that were already searched in the first stage of template processing are searched again (potentially picking up later definitions) in the second stage. */ - k.namespaces = NULL_TREE; + k.namespaces = make_tree_vector (); arg_assoc_args_vec (&k, args); @@ -5070,6 +5070,9 @@ lookup_arg_dependent (tree name, tree fns, VEC(tree,gc) *args) error (" in call to %qD", name); fns = error_mark_node; } + + release_tree_vector (k.classes); + release_tree_vector (k.namespaces); POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, fns); } diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index e7b97c4..7aed503 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -1419,18 +1419,14 @@ build_x_arrow (tree expr) /*overloaded_p=*/NULL, tf_warning_or_error))) { - tree t; - unsigned ix; - if (expr == error_mark_node) return error_mark_node; - for (ix = 0; VEC_iterate (tree, types_memoized, ix, t); ix++) - if (TREE_TYPE (expr) == t) - { - error ("circular pointer delegation detected"); - return error_mark_node; - } + if (vec_member (TREE_TYPE (expr), types_memoized)) + { + error ("circular pointer delegation detected"); + return error_mark_node; + } VEC_safe_push (tree, gc, types_memoized, TREE_TYPE (expr)); last_rval = expr; diff --git a/gcc/tree.c b/gcc/tree.c index 67e2f41..cb8e4fe 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -1923,6 +1923,19 @@ purpose_member (const_tree elem, tree list) return NULL_TREE; } +/* Return true if ELEM is in V. */ + +bool +vec_member (const_tree elem, VEC(tree,gc) *v) +{ + unsigned ix; + tree t; + for (ix = 0; VEC_iterate (tree, v, ix, t); ix++) + if (elem == t) + return true; + return false; +} + /* Returns element number IDX (zero-origin) of chain CHAIN, or NULL_TREE. */ diff --git a/gcc/tree.h b/gcc/tree.h index 13c684a..a70608e 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -4086,6 +4086,7 @@ extern bool range_in_array_bounds_p (tree); extern tree value_member (tree, tree); extern tree purpose_member (const_tree, tree); +extern bool vec_member (const_tree, VEC(tree,gc) *); extern tree chain_index (int, tree); extern int attribute_list_equal (const_tree, const_tree);