This is the mail archive of the gdb@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: adding namespace support to GDB


Hi Daniel,

I'm confused. This patch is against gcc not gdb. I meant that the patch
we will submit will be for gdb support of imported declarations.

Petr
> On Fri, 23 Aug 2002, Petr Sorfa wrote:
> 
> > Hi Daniel,
> >
> > Well, let me or John Wolfe submit a patch with the imported declaration
> > support next week. It will at least be some kind of comparison.
> 
> My gcc patch already includes this.
> 
> I've rediffed against current gcc sources, and pasted it below.
> 
> Index: dwarf2out.c
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/dwarf2out.c,v
> retrieving revision 1.379.2.3
> diff -c -3 -p -w -B -b -r1.379.2.3 dwarf2out.c
> *** dwarf2out.c 19 Aug 2002 01:30:33 -0000      1.379.2.3
> --- dwarf2out.c 23 Aug 2002 22:33:11 -0000
> *************** static void gen_tagged_type_instantiatio
> *** 3648,3654 ****
> --- 3648,3656 ----
>   static void gen_block_die             PARAMS ((tree, dw_die_ref, int));
>   static void decls_for_scope           PARAMS ((tree, dw_die_ref, int));
>   static int is_redundant_typedef               PARAMS ((tree));
> + static void gen_namespace_die           PARAMS ((tree, dw_die_ref));
>   static void gen_decl_die              PARAMS ((tree, dw_die_ref));
> + static dw_die_ref force_out_decl      PARAMS ((tree, dw_die_ref));
>   static unsigned lookup_filename               PARAMS ((const char *));
>   static void init_file_table           PARAMS ((void));
>   static void retry_incomplete_types    PARAMS ((void));
> *************** dwarf_tag_name (tag)
> *** 3905,3910 ****
> --- 3907,3914 ----
>         return "DW_TAG_namelist";
>       case DW_TAG_namelist_item:
>         return "DW_TAG_namelist_item";
> +     case DW_TAG_namespace:
> +       return "DW_TAG_namespace";
>       case DW_TAG_packed_type:
>         return "DW_TAG_packed_type";
>       case DW_TAG_subprogram:
> *************** scope_die_for (t, context_die)
> *** 9540,9548 ****
> 
>     containing_scope = TYPE_CONTEXT (t);
> 
> !   /* Ignore namespaces for the moment.  */
>     if (containing_scope && TREE_CODE (containing_scope) == NAMESPACE_DECL)
> !     containing_scope = NULL_TREE;
> 
>     /* Ignore function type "scopes" from the C frontend.  They mean that
>        a tagged type is local to a parmlist of a function declarator, but
> --- 9544,9563 ----
> 
>     containing_scope = TYPE_CONTEXT (t);
> 
> !   /* Handle namespaces properly */
>     if (containing_scope && TREE_CODE (containing_scope) == NAMESPACE_DECL)
> !     {
> !       dw_die_ref newcontext = lookup_decl_die (containing_scope);
> !
> !       if (!newcontext)
> !       {
> !         gen_decl_die (containing_scope, context_die);
> !         newcontext = lookup_decl_die (containing_scope);
> !         if (!newcontext)
> !           abort();
> !       }
> !       context_die = newcontext;
> !     }
> 
>     /* Ignore function type "scopes" from the C frontend.  They mean that
>        a tagged type is local to a parmlist of a function declarator, but
> *************** is_redundant_typedef (decl)
> *** 11374,11379 ****
> --- 11389,11453 ----
> 
>     return 0;
>   }
> + static dw_die_ref
> + force_out_decl (decl, context_die)
> +       tree decl;
> +       dw_die_ref context_die;
> + {
> +   /* Force out the namespace. */
> +   if (DECL_CONTEXT (decl) && TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL)
> +     {
> +       dw_die_ref newcontext;
> +       newcontext = lookup_decl_die (DECL_CONTEXT (decl));
> +       if (!newcontext)
> +       {
> +         gen_decl_die (DECL_CONTEXT (decl), context_die);
> +         newcontext = lookup_decl_die (DECL_CONTEXT (decl));
> +         if (!newcontext)
> +           abort();
> +       }
> +       context_die = newcontext;
> +     }
> +   return context_die;
> + }
> +
> + /* Generate a DIE for a namespace or namespace alias */
> + static void
> + gen_namespace_die (decl, context_die)
> +      register tree decl;
> +      register dw_die_ref context_die;
> + {
> +   /* Namespace aliases have a DECL_ABSTRACT_ORIGIN of the namespace
> +      they are an alias of.*/
> +   if (DECL_ABSTRACT_ORIGIN (decl) == NULL)
> +     {
> +       /* Output a real namespace */
> +       dw_die_ref namespace_die = new_die (DW_TAG_namespace, context_die, decl);
> +       add_name_and_src_coords_attributes (namespace_die, decl);
> +       equate_decl_number_to_die (decl, namespace_die);
> +     }
> +   else
> +     {
> +       /* Output a namespace alias */
> +       dw_die_ref namespace_die;
> +
> +       /* Force out the namespace we are an alias of, if necessary */
> +       dw_die_ref origin_die = lookup_decl_die  (DECL_ABSTRACT_ORIGIN (decl));
> +       if (!origin_die)
> +       {
> +         /* Attempt to force out origin. */
> +         dwarf2out_decl (DECL_ABSTRACT_ORIGIN (decl));
> +         origin_die = lookup_decl_die (DECL_ABSTRACT_ORIGIN (decl));
> +         if (!origin_die)
> +           abort();
> +       }
> +       /* Now create the namespace alias DIE. */
> +       namespace_die = new_die (DW_TAG_imported_declaration, context_die, decl);
> +       add_name_and_src_coords_attributes (namespace_die, decl);
> +       add_AT_die_ref (namespace_die, DW_AT_import, origin_die);
> +       equate_decl_number_to_die (decl, namespace_die);
> +     }
> + }
> 
>   /* Generate Dwarf debug information for a decl described by DECL.  */
> 
> *************** gen_decl_die (decl, context_die)
> *** 11424,11429 ****
> --- 11498,11505 ----
>         /* Otherwise we're emitting the primary DIE for this decl.  */
>         else if (debug_info_level > DINFO_LEVEL_TERSE)
>         {
> +         context_die = force_out_decl (decl, context_die);
> +
>           /* Before we describe the FUNCTION_DECL itself, make sure that we
>              have described its return type.  */
>           gen_type_die (TREE_TYPE (TREE_TYPE (decl)), context_die);
> *************** gen_decl_die (decl, context_die)
> *** 11447,11453 ****
>            actual typedefs.  */
>         if (debug_info_level <= DINFO_LEVEL_TERSE)
>         break;
> !
>         /* In the special case of a TYPE_DECL node representing the declaration
>            of some type tag, if the given TYPE_DECL is marked as having been
>            instantiated from some other (original) TYPE_DECL node (e.g. one which
> --- 11523,11529 ----
>            actual typedefs.  */
>         if (debug_info_level <= DINFO_LEVEL_TERSE)
>         break;
> !       context_die = force_out_decl (decl, context_die);
>         /* In the special case of a TYPE_DECL node representing the declaration
>            of some type tag, if the given TYPE_DECL is marked as having been
>            instantiated from some other (original) TYPE_DECL node (e.g. one which
> *************** gen_decl_die (decl, context_die)
> *** 11477,11482 ****
> --- 11553,11559 ----
>            variable declarations or definitions.  */
>         if (debug_info_level <= DINFO_LEVEL_TERSE)
>         break;
> +       context_die = force_out_decl (decl, context_die);
> 
>         /* Output any DIEs that are needed to specify the type of this data
>            object.  */
> *************** gen_decl_die (decl, context_die)
> *** 11504,11509 ****
> --- 11581,11587 ----
>         if (DECL_NAME (decl) != NULL_TREE
>           || TREE_CODE (TREE_TYPE (decl)) == UNION_TYPE)
>         {
> +         context_die = force_out_decl (decl, context_die);
>           gen_type_die (member_declared_type (decl), context_die);
>           gen_field_die (decl, context_die);
>         }
> *************** gen_decl_die (decl, context_die)
> *** 11515,11521 ****
>         break;
> 
>       case NAMESPACE_DECL:
> !       /* Ignore for now.  */
>         break;
> 
>       default:
> --- 11593,11600 ----
>         break;
> 
>       case NAMESPACE_DECL:
> !       context_die = force_out_decl (decl, context_die);
> !       gen_namespace_die (decl, context_die);
>         break;
> 
>       default:
> *************** dwarf2out_decl (decl)
> *** 11668,11673 ****
> --- 11747,11759 ----
> 
>         /* If we are in terse mode, don't generate any DIEs for types.  */
>         if (debug_info_level <= DINFO_LEVEL_TERSE)
> +     case NAMESPACE_DECL:
> +       if (debug_info_level <= DINFO_LEVEL_TERSE)
> +       return;
> +       if (lookup_decl_die (decl) != NULL)
> +         return;
> +       break;
> +
>         return;
> 
>         /* If we're a function-scope tag, initially use a parent of NULL;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]