[PATCH] Don't emit certain artificial names into DW_AT_name in debug info
Richard Guenther
rguenther@suse.de
Fri Jul 23 12:09:00 GMT 2010
On Fri, 23 Jul 2010, Jakub Jelinek wrote:
> On Thu, Jul 22, 2010 at 12:19:35PM -0700, Roland McGrath wrote:
> > Similarly:
> >
> > <formal_parameter name=".omp_data_i" type="#ref1" artificial=1 location={locexpr}/>
> >
> > Should that really have a name? As it stands, the debugger is going to
> > present ".omp_data_i" as a resolvable identifier in this scope, as it
> > would for any other artifical parameter (such as C++ "this").
> >
> > Next:
> >
> > <structure_type ref="ref4" name=".omp_data_s.10" byte_size=0x8>
> >
> > This needs artificial=true too. Again, it seems quite questionable
> > whether the non-source name should appear at all. AIUI, this sort of
> > thing is exactly what DW_AT_description is for.
>
> This patch attempts to deal with the artificial names of DW_AT_artificial
> DIEs in debug info, as discussed yesterday on IRC.
>
> We can't just avoid emitting DW_AT_name for DECL_ARTIFICIAL decls,
> because e.g. for `this' we want to emit the name. And, there are also types
> for which we don't want to emit the made up names.
> The names are useful in dumps though, so instead of clearing them this patch
> steals one free bit and uses it to say that DECL_NAME resp. TYPE_NAME
> shouldn't be added into debug info.
> In the debug info names like array3_integer(kind=4), a.0, .omp_data_i
> etc. are undesirable though, they show up when listing variables, stand in
> in tab completion, etc.
>
> Tested on a short fortran array testcase as well as OpenMP C testcase,
> bootstrapped/regtested on x86_64-linux and i686-linux. Ok for trunk?
Hmm - looking again I see
/* Nonzero for a given ..._DECL node means that the name of this node
should
be ignored for symbolic debug purposes. Moreover, for a FUNCTION_DECL,
the body of the function should also be ignored. */
#define DECL_IGNORED_P(NODE) \
(DECL_COMMON_CHECK (NODE)->decl_common.ignored_flag)
so why not use that?
Richard.
> 2010-07-23 Jakub Jelinek <jakub@redhat.com>
>
> * tree.h (struct tree_base): Add nameless_flag bitfield.
> (TYPE_NAMELESS, DECL_NAMELESS): Define.
> * omp-low.c (create_omp_child_function, scan_omp_parallel,
> scan_omp_task, lower_omp_taskreg): Set DECL_NAMELESS and/or
> DECL_ARTIFICIAL where needed.
> * dwarf2out.c (dwarf2_name): Return NULL if DECL_NAMELESS.
> (type_tag): Return NULL if TYPE_NAMELESS or if TYPE_DECL
> has DECL_NAMELESS set.
>
> * trans-types.c (gfc_get_array_descriptor_base,
> gfc_get_array_type_bounds): Set TYPE_NAMELESS.
> * trans-decl.c (gfc_build_qualified_array): Set DECL_NAMELESS
> instead of clearing DECL_NAME.
> (gfc_build_dummy_array_decl): Set DECL_NAMELESS.
>
> --- gcc/tree.h.jj 2010-07-16 17:55:08.000000000 +0200
> +++ gcc/tree.h 2010-07-23 10:44:34.000000000 +0200
> @@ -387,8 +387,9 @@ struct GTY(()) tree_base {
> unsigned visited : 1;
> unsigned packed_flag : 1;
> unsigned user_align : 1;
> + unsigned nameless_flag : 1;
>
> - unsigned spare : 13;
> + unsigned spare : 12;
>
> /* This field is only used with type nodes; the only reason it is present
> in tree_base instead of tree_type is to save space. The size of the
> @@ -2180,6 +2181,9 @@ extern enum machine_mode vector_type_mod
> the term. */
> #define TYPE_RESTRICT(NODE) (TYPE_CHECK (NODE)->type.restrict_flag)
>
> +/* If nonzero, type's name shouldn't be emitted into debug info. */
> +#define TYPE_NAMELESS(NODE) (TYPE_CHECK (NODE)->base.nameless_flag)
> +
> /* The address space the type is in. */
> #define TYPE_ADDR_SPACE(NODE) (TYPE_CHECK (NODE)->base.address_space)
>
> @@ -2529,6 +2533,10 @@ struct function;
> #define DECL_CONTEXT(NODE) (DECL_MINIMAL_CHECK (NODE)->decl_minimal.context)
> #define DECL_FIELD_CONTEXT(NODE) \
> (FIELD_DECL_CHECK (NODE)->decl_minimal.context)
> +
> +/* If nonzero, decl's name shouldn't be emitted into debug info. */
> +#define DECL_NAMELESS(NODE) (DECL_MINIMAL_CHECK (NODE)->base.nameless_flag)
> +
> struct GTY(()) tree_decl_minimal {
> struct tree_common common;
> location_t locus;
> --- gcc/omp-low.c.jj 2010-07-23 09:07:09.000000000 +0200
> +++ gcc/omp-low.c 2010-07-23 11:16:03.000000000 +0200
> @@ -1563,6 +1563,7 @@ create_omp_child_function (omp_context *
> TREE_STATIC (decl) = 1;
> TREE_USED (decl) = 1;
> DECL_ARTIFICIAL (decl) = 1;
> + DECL_NAMELESS (decl) = 1;
> DECL_IGNORED_P (decl) = 0;
> TREE_PUBLIC (decl) = 0;
> DECL_UNINLINABLE (decl) = 1;
> @@ -1580,6 +1581,7 @@ create_omp_child_function (omp_context *
> t = build_decl (DECL_SOURCE_LOCATION (decl),
> PARM_DECL, get_identifier (".omp_data_i"), ptr_type_node);
> DECL_ARTIFICIAL (t) = 1;
> + DECL_NAMELESS (t) = 1;
> DECL_ARG_TYPE (t) = ptr_type_node;
> DECL_CONTEXT (t) = current_function_decl;
> TREE_USED (t) = 1;
> @@ -1592,6 +1594,7 @@ create_omp_child_function (omp_context *
> PARM_DECL, get_identifier (".omp_data_o"),
> ptr_type_node);
> DECL_ARTIFICIAL (t) = 1;
> + DECL_NAMELESS (t) = 1;
> DECL_ARG_TYPE (t) = ptr_type_node;
> DECL_CONTEXT (t) = current_function_decl;
> TREE_USED (t) = 1;
> @@ -1638,6 +1641,8 @@ scan_omp_parallel (gimple_stmt_iterator
> name = create_tmp_var_name (".omp_data_s");
> name = build_decl (gimple_location (stmt),
> TYPE_DECL, name, ctx->record_type);
> + DECL_ARTIFICIAL (name) = 1;
> + DECL_NAMELESS (name) = 1;
> TYPE_NAME (ctx->record_type) = name;
> create_omp_child_function (ctx, false);
> gimple_omp_parallel_set_child_fn (stmt, ctx->cb.dst_fn);
> @@ -1681,6 +1686,8 @@ scan_omp_task (gimple_stmt_iterator *gsi
> name = create_tmp_var_name (".omp_data_s");
> name = build_decl (gimple_location (stmt),
> TYPE_DECL, name, ctx->record_type);
> + DECL_ARTIFICIAL (name) = 1;
> + DECL_NAMELESS (name) = 1;
> TYPE_NAME (ctx->record_type) = name;
> create_omp_child_function (ctx, false);
> gimple_omp_task_set_child_fn (stmt, ctx->cb.dst_fn);
> @@ -1692,6 +1699,8 @@ scan_omp_task (gimple_stmt_iterator *gsi
> name = create_tmp_var_name (".omp_data_a");
> name = build_decl (gimple_location (stmt),
> TYPE_DECL, name, ctx->srecord_type);
> + DECL_ARTIFICIAL (name) = 1;
> + DECL_NAMELESS (name) = 1;
> TYPE_NAME (ctx->srecord_type) = name;
> create_omp_child_function (ctx, true);
> }
> @@ -6487,6 +6496,7 @@ lower_omp_taskreg (gimple_stmt_iterator
> ctx->sender_decl
> = create_tmp_var (ctx->srecord_type ? ctx->srecord_type
> : ctx->record_type, ".omp_data_o");
> + DECL_NAMELESS (ctx->sender_decl) = 1;
> TREE_ADDRESSABLE (ctx->sender_decl) = 1;
> gimple_omp_taskreg_set_data_arg (stmt, ctx->sender_decl);
> }
> --- gcc/dwarf2out.c.jj 2010-07-23 09:07:15.000000000 +0200
> +++ gcc/dwarf2out.c 2010-07-23 11:13:59.000000000 +0200
> @@ -11243,6 +11243,8 @@ output_comdat_type_unit (comdat_type_nod
> static const char *
> dwarf2_name (tree decl, int scope)
> {
> + if (DECL_NAMELESS (decl))
> + return NULL;
> return lang_hooks.dwarf_name (decl, scope ? 1 : 0);
> }
>
> @@ -17711,7 +17713,8 @@ type_tag (const_tree type)
> tree t = 0;
>
> /* Find the IDENTIFIER_NODE for the type name. */
> - if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE)
> + if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE
> + && !TYPE_NAMELESS (type))
> t = TYPE_NAME (type);
>
> /* The g++ front end makes the TYPE_NAME of *each* tagged type point to
> @@ -17724,7 +17727,8 @@ type_tag (const_tree type)
> DECL_NAME isn't set. The default hook for decl_printable_name
> doesn't like that, and in this context it's correct to return
> 0, instead of "<anonymous>" or the like. */
> - if (DECL_NAME (TYPE_NAME (type)))
> + if (DECL_NAME (TYPE_NAME (type))
> + && !DECL_NAMELESS (TYPE_NAME (type)))
> name = lang_hooks.dwarf_name (TYPE_NAME (type), 2);
> }
>
> --- gcc/fortran/trans-types.c.jj 2010-07-16 17:55:04.000000000 +0200
> +++ gcc/fortran/trans-types.c 2010-07-23 11:13:59.000000000 +0200
> @@ -1546,6 +1546,7 @@ gfc_get_array_descriptor_base (int dimen
>
> sprintf (name, "array_descriptor" GFC_RANK_PRINTF_FORMAT, dimen + codimen);
> TYPE_NAME (fat_type) = get_identifier (name);
> + TYPE_NAMELESS (fat_type) = 1;
>
> /* Add the data member as the first element of the descriptor. */
> decl = gfc_add_field_to_struct_1 (fat_type,
> @@ -1616,6 +1617,7 @@ gfc_get_array_type_bounds (tree etype, i
> sprintf (name, "array" GFC_RANK_PRINTF_FORMAT "_%.*s", dimen + codimen,
> GFC_MAX_SYMBOL_LEN, type_name);
> TYPE_NAME (fat_type) = get_identifier (name);
> + TYPE_NAMELESS (fat_type) = 1;
>
> GFC_DESCRIPTOR_TYPE_P (fat_type) = 1;
> TYPE_LANG_SPECIFIC (fat_type)
> --- gcc/fortran/trans-decl.c.jj 2010-07-22 11:35:35.000000000 +0200
> +++ gcc/fortran/trans-decl.c 2010-07-23 11:27:32.000000000 +0200
> @@ -759,16 +759,16 @@ gfc_build_qualified_array (tree decl, gf
> gtype = build_array_type (gtype, rtype);
> /* Ensure the bound variables aren't optimized out at -O0.
> For -O1 and above they often will be optimized out, but
> - can be tracked by VTA. Also clear the artificial
> - lbound.N or ubound.N DECL_NAME, so that it doesn't end up
> - in debug info. */
> + can be tracked by VTA. Also set DECL_NAMELESS, so that
> + the artificial lbound.N or ubound.N DECL_NAME doesn't
> + end up in debug info. */
> if (lbound && TREE_CODE (lbound) == VAR_DECL
> && DECL_ARTIFICIAL (lbound) && DECL_IGNORED_P (lbound))
> {
> if (DECL_NAME (lbound)
> && strstr (IDENTIFIER_POINTER (DECL_NAME (lbound)),
> "lbound") != 0)
> - DECL_NAME (lbound) = NULL_TREE;
> + DECL_NAMELESS (lbound) = 1;
> DECL_IGNORED_P (lbound) = 0;
> }
> if (ubound && TREE_CODE (ubound) == VAR_DECL
> @@ -777,7 +777,7 @@ gfc_build_qualified_array (tree decl, gf
> if (DECL_NAME (ubound)
> && strstr (IDENTIFIER_POINTER (DECL_NAME (ubound)),
> "ubound") != 0)
> - DECL_NAME (ubound) = NULL_TREE;
> + DECL_NAMELESS (ubound) = 1;
> DECL_IGNORED_P (ubound) = 0;
> }
> }
> @@ -879,6 +879,7 @@ gfc_build_dummy_array_decl (gfc_symbol *
> VAR_DECL, get_identifier (name), type);
>
> DECL_ARTIFICIAL (decl) = 1;
> + DECL_NAMELESS (decl) = 1;
> TREE_PUBLIC (decl) = 0;
> TREE_STATIC (decl) = 0;
> DECL_EXTERNAL (decl) = 0;
>
>
> Jakub
>
>
--
Richard Guenther <rguenther@suse.de>
Novell / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 - GF: Markus Rex
More information about the Gcc-patches
mailing list