This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [C++ PATCH] namespace stat hack representation
- From: Marek Polacek <polacek at redhat dot com>
- To: Nathan Sidwell <nathan at acm dot org>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 29 May 2017 17:17:27 +0200
- Subject: Re: [C++ PATCH] namespace stat hack representation
- Authentication-results: sourceware.org; auth=none
- Authentication-results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com
- Authentication-results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=polacek at redhat dot com
- Dkim-filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 1C1A572464
- Dmarc-filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 1C1A572464
- References: <0d2c28a2-6ec9-d9dd-e3c2-717fc4dd401d@acm.org>
On Mon, May 29, 2017 at 11:11:12AM -0400, Nathan Sidwell wrote:
> Currently bindings have two slots, a 'value' slot for the regular binding,
> and a 'type' slot for the struct name binding, which is only used when the
> value slot is holding something else. for instance:
>
> struct foo {...} foo;
>
> The value slot will be a VAR_DECL, and the type slot an artificial
> TYPE_DECL.
>
> The type slot is very rarely non-null, because such code use is terribly
> confusing. But as the name suggests, it's needed because of the C library's
> definition:
>
> struct stat {...};
> int stat (const char *, struct stat *);
>
> This patch changes the representation for namespace bindings, so we only use
> one slot, and if the stat hack is needed, it contains an OVERLOAD that is
> marked with LOOKUP_P (such overloads cannot otherwise appear in a binding).
> In that case the TYPE holds the TYPE_DECL and the FUNCTION holds the value
> binding.
>
> This patch doesn't change the use of cxx_binding, so the underlying accessor
> find_namespace_slot simply returns the address of the value field. (The
> next patch will remove cxx_binding for namespaces.)
>
> nathan
>
> --
> Nathan Sidwell
> 2017-05-29 Nathan Sidwell <nathan@acm.org>
>
> Stat hack representation
> * name-lookup.c (STAT_HACK_P, STAT_TYPE, STAT_DECL,
> MAYBE_STAT_DECL, MAYBE_STAT_TYPE): New.
> (stat_hack): New.
> (find_namespace_binding): Replace with ...
> (find_namespace_slot): ... this.
> (find_namespace_value): New.
> (name_lookup::search_namespace_only,
> name_lookup::adl_namespace_only): Adjust.
> (update_binding): Add SLOT parameter, adjust.
> (check_local_shadow): Use find_namespace_value.
> (set_local_extern_decl_linkage): Likewise.
> (do_pushdecl): Adjust for namespace slot.
> (push_local_binding): Assert not a namespace binding.
> (check_for_out_of_scope_variable): Use find_namespace_value.
> (set_identifier_type_value_with_scope): Likewise.
> (get_namespace_binding): Likewise.
> (set_namespace_binding): Delete.
> (set_global_binding): Directly update the binding.
> (finish_namespace_using_decl): Likewise.
> (lookup_type_scope_1): Use find_namespace_slot and update.
> (do_push_nested_namespace): Use find_namespace_value.
>
> Index: name-lookup.c
> ===================================================================
> --- name-lookup.c (revision 248573)
> +++ name-lookup.c (working copy)
> @@ -38,6 +38,27 @@ static cp_binding_level *innermost_noncl
> static void set_identifier_type_value_with_scope (tree id, tree decl,
> cp_binding_level *b);
>
> +/* Create an overload suitable for recording an artificial TYPE_DECL
> + and another decl. We use this machanism to implement the struct
> + stat hack within a namespace. It'd be nice to use it everywhere. */
> +
> +#define STAT_HACK_P(N) ((N) && TREE_CODE (N) == OVERLOAD && OVL_LOOKUP_P (N))
> +#define STAT_TYPE(N) TREE_TYPE (N)
> +#define STAT_DECL(N) OVL_FUNCTION (N)
> +#define MAYBE_STAT_DECL(N) (STAT_HACK_P (N) ? STAT_DECL (N) : N)
> +#define MAYBE_STAT_TYPE(N) (STAT_HACK_P (N) ? STAT_TYPE (N) : NULL_TREE)
> +
> +static tree stat_hack (tree decl = NULL_TREE, tree type = NULL_TREE)
Should be
static tree
stat_hack (tree decl = NULL_TREE, tree type = NULL_TREE)
to make it easier to grep for the function with ^stat_hack.
(Didn't check the rest of the patch.)
Marek