This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH,c++] convert incomplete_vars into a VEC
- From: NightStrike <nightstrike at gmail dot com>
- To: Nathan Froyd <froydnj at codesourcery dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Mon, 7 Jun 2010 12:33:47 -0400
- Subject: Re: [PATCH,c++] convert incomplete_vars into a VEC
- References: <20100601205347.GN3534@codesourcery.com>
Ping
On Tue, Jun 1, 2010 at 4:53 PM, Nathan Froyd <froydnj@codesourcery.com> wrote:
> This patch creates a specific data structure to hold the information for
> each element of `incomplete_vars' and turns `incomplete_vars' into a
> VEC. ?The C++ FE may have gone crazy with its use of TREE_LIST, but it's
> nice that there's documentation on what TREE_PURPOSE and TREE_VALUE
> mean.
>
> Tested on x86_64-unknown-linux-gnu. ?OK to commit?
>
> -Nathan
>
> ? ? ? ?* decl.c (incomplete_var): Declare. ?Declare VECs containing them.
> ? ? ? ?(incomplete_vars): Adjust comment. ?Change type to a VEC.
> ? ? ? ?(maybe_register_incomplete_var): Adjust for new type.
> ? ? ? ?(complete_vars): Adjust iteration over incomplete_vars.
>
> Index: decl.c
> ===================================================================
> --- decl.c ? ? ?(revision 160119)
> +++ decl.c ? ? ?(working copy)
> @@ -237,11 +237,18 @@ VEC(tree, gc) *deferred_mark_used_calls;
> ?enum deprecated_states deprecated_state = DEPRECATED_NORMAL;
>
>
> -/* A TREE_LIST of VAR_DECLs. ?The TREE_PURPOSE is a RECORD_TYPE or
> - ? UNION_TYPE; the TREE_VALUE is a VAR_DECL with that type. ?At the
> - ? time the VAR_DECL was declared, the type was incomplete. ?*/
> +/* A list of VAR_DECLs whose type was incomplete at the time the
> + ? variable was declared. ?*/
>
> -static GTY(()) tree incomplete_vars;
> +typedef struct GTY(()) incomplete_var_d {
> + ?tree decl;
> + ?tree incomplete_type;
> +} incomplete_var;
> +
> +DEF_VEC_O(incomplete_var);
> +DEF_VEC_ALLOC_O(incomplete_var,gc);
> +
> +static GTY(()) VEC(incomplete_var,gc) *incomplete_vars;
>
> ?/* Returns the kind of template specialization we are currently
> ? ?processing, given that it's declaration contained N_CLASS_SCOPES
> @@ -12859,7 +12866,12 @@ maybe_register_incomplete_var (tree var)
> ? ? ? ? ?/* RTTI TD entries are created while defining the type_info. ?*/
> ? ? ? ? ?|| (TYPE_LANG_SPECIFIC (inner_type)
> ? ? ? ? ? ? ?&& TYPE_BEING_DEFINED (inner_type)))
> - ? ? ? incomplete_vars = tree_cons (inner_type, var, incomplete_vars);
> + ? ? ? {
> + ? ? ? ? incomplete_var *iv
> + ? ? ? ? ? = VEC_safe_push (incomplete_var, gc, incomplete_vars, NULL);
> + ? ? ? ? iv->decl = var;
> + ? ? ? ? iv->incomplete_type = inner_type;
> + ? ? ? }
> ? ? }
> ?}
>
> @@ -12870,24 +12882,24 @@ maybe_register_incomplete_var (tree var)
> ?void
> ?complete_vars (tree type)
> ?{
> - ?tree *list = &incomplete_vars;
> + ?unsigned ix;
> + ?incomplete_var *iv;
>
> - ?gcc_assert (CLASS_TYPE_P (type));
> - ?while (*list)
> + ?for (ix = 0; VEC_iterate (incomplete_var, incomplete_vars, ix, iv); )
> ? ? {
> - ? ? ?if (same_type_p (type, TREE_PURPOSE (*list)))
> + ? ? ?if (same_type_p (type, iv->incomplete_type))
> ? ? ? ?{
> - ? ? ? ? tree var = TREE_VALUE (*list);
> + ? ? ? ? tree var = iv->decl;
> ? ? ? ? ?tree type = TREE_TYPE (var);
> ? ? ? ? ?/* Complete the type of the variable. ?The VAR_DECL itself
> ? ? ? ? ? ? will be laid out in expand_expr. ?*/
> ? ? ? ? ?complete_type (type);
> ? ? ? ? ?cp_apply_type_quals_to_decl (cp_type_quals (type), var);
> ? ? ? ? ?/* Remove this entry from the list. ?*/
> - ? ? ? ? *list = TREE_CHAIN (*list);
> + ? ? ? ? VEC_unordered_remove (incomplete_var, incomplete_vars, ix);
> ? ? ? ?}
> ? ? ? else
> - ? ? ? list = &TREE_CHAIN (*list);
> + ? ? ? ix++;
> ? ? }
>
> ? /* Check for pending declarations which may have abstract type. ?*/
> Index: ChangeLog
> ===================================================================
>