From 38d518c93e13bf0a79bff4fb828b3373991fa9bb Mon Sep 17 00:00:00 2001 From: Elena Zannoni Date: Fri, 9 Jan 2004 22:22:07 +0000 Subject: [PATCH] 2004-01-09 David Carlton Checked in by Elena Zannoni . * dwarf2read.c (read_namespace): Pull out name-generating code into namespace_name. Rename previous_namespace to previous_prefix and processing_current_namespace to processing_current_prefix.. (namespace_name): New function. (add_partial_symbol): Substitute uses of pdi->name with actual_name. * cp-support.h: Rename processing_current_namespace to processing_current_prefix. Update copyright year. * cp-namespace.c: Rename processing_current_namespace to processing_current_prefix. Update copyright year. --- gdb/ChangeLog | 18 ++++- gdb/cp-namespace.c | 26 +++++--- gdb/cp-support.h | 4 +- gdb/dwarf2read.c | 159 +++++++++++++++++++++++++-------------------- 4 files changed, 125 insertions(+), 82 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 4a8755b3723..666495786b8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,19 @@ +2004-01-09 David Carlton + + Checked in by Elena Zannoni . + * dwarf2read.c (read_namespace): Pull out name-generating code + into namespace_name. Rename previous_namespace to previous_prefix + and processing_current_namespace to processing_current_prefix.. + (namespace_name): New function. + (add_partial_symbol): Substitute uses of pdi->name with + actual_name. + * cp-support.h: Rename processing_current_namespace to + processing_current_prefix. + Update copyright year. + * cp-namespace.c: Rename processing_current_namespace to + processing_current_prefix. + Update copyright year. + 2004-01-09 Andrew Cagney * jv-valprint.c, ser-unix.c: Add missing copyright years. @@ -13,7 +29,7 @@ * dwarf2read.c (read_array_type): Discard FORTRAN_HACK macro and ifdeffed code. Update copyright year. - + 2004-01-08 Michael Chastain * config/pa/tm-hppa.h: Update extern declarations for diff --git a/gdb/cp-namespace.c b/gdb/cp-namespace.c index 044b4737d50..a766acb470a 100644 --- a/gdb/cp-namespace.c +++ b/gdb/cp-namespace.c @@ -1,5 +1,5 @@ /* Helper routines for C++ support in GDB. - Copyright 2003 Free Software Foundation, Inc. + Copyright 2003, 2004 Free Software Foundation, Inc. Contributed by David Carlton and by Kealia, Inc. @@ -38,14 +38,22 @@ unsigned char processing_has_namespace_info; -/* If processing_has_namespace_info is nonzero, this string should - contain the name of the current namespace. The string is - temporary; copy it if you need it. */ +/* This contains our best guess as to the name of the current + enclosing namespace(s)/class(es), if any. For example, if we're + within the method foo() in the following code: -/* FIXME: carlton/2003-06-12: This isn't entirely reliable: currently, - we get mislead by DW_AT_specification. */ + namespace N { + class C { + void foo () { + } + }; + } -const char *processing_current_namespace; + then processing_current_prefix should be set to "N::C". If + processing_has_namespace_info is false, then this variable might + not be reliable. */ + +const char *processing_current_prefix; /* List of using directives that are active in the current file. */ @@ -223,8 +231,8 @@ cp_set_block_scope (const struct symbol *symbol, if (processing_has_namespace_info) { block_set_scope - (block, obsavestring (processing_current_namespace, - strlen (processing_current_namespace), + (block, obsavestring (processing_current_prefix, + strlen (processing_current_prefix), obstack), obstack); } diff --git a/gdb/cp-support.h b/gdb/cp-support.h index c08efe1539c..d4785c3baf7 100644 --- a/gdb/cp-support.h +++ b/gdb/cp-support.h @@ -1,5 +1,5 @@ /* Helper routines for C++ support in GDB. - Copyright 2002, 2003 Free Software Foundation, Inc. + Copyright 2002, 2003, 2004 Free Software Foundation, Inc. Contributed by MontaVista Software. Namespace support contributed by David Carlton. @@ -69,7 +69,7 @@ extern struct type *cp_lookup_rtti_type (const char *name, extern unsigned char processing_has_namespace_info; -extern const char *processing_current_namespace; +extern const char *processing_current_prefix; extern int cp_is_anonymous (const char *namespace); diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 9c07a04e5bc..765ac7d845d 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -809,6 +809,9 @@ static void read_common_block (struct die_info *, struct dwarf2_cu *); static void read_namespace (struct die_info *die, struct dwarf2_cu *); +static const char *namespace_name (struct die_info *die, + int *is_anonymous); + static void read_enumeration (struct die_info *, struct dwarf2_cu *); static struct type *dwarf_base_type (int, int, struct dwarf2_cu *); @@ -1424,6 +1427,7 @@ add_partial_symbol (struct partial_die_info *pdi, { struct objfile *objfile = cu->objfile; CORE_ADDR addr = 0; + char *actual_name = pdi->name; const struct partial_symbol *psym = NULL; switch (pdi->tag) @@ -1431,9 +1435,9 @@ add_partial_symbol (struct partial_die_info *pdi, case DW_TAG_subprogram: if (pdi->is_external) { - /*prim_record_minimal_symbol (pdi->name, pdi->lowpc + baseaddr, + /*prim_record_minimal_symbol (actual_name, pdi->lowpc + baseaddr, mst_text, objfile); */ - psym = add_psymbol_to_list (pdi->name, strlen (pdi->name), + psym = add_psymbol_to_list (actual_name, strlen (actual_name), VAR_DOMAIN, LOC_BLOCK, &objfile->global_psymbols, 0, pdi->lowpc + baseaddr, @@ -1441,9 +1445,9 @@ add_partial_symbol (struct partial_die_info *pdi, } else { - /*prim_record_minimal_symbol (pdi->name, pdi->lowpc + baseaddr, + /*prim_record_minimal_symbol (actual_name, pdi->lowpc + baseaddr, mst_file_text, objfile); */ - psym = add_psymbol_to_list (pdi->name, strlen (pdi->name), + psym = add_psymbol_to_list (actual_name, strlen (actual_name), VAR_DOMAIN, LOC_BLOCK, &objfile->static_psymbols, 0, pdi->lowpc + baseaddr, @@ -1469,7 +1473,7 @@ add_partial_symbol (struct partial_die_info *pdi, if (pdi->locdesc) addr = decode_locdesc (pdi->locdesc, cu); if (pdi->locdesc || pdi->has_type) - psym = add_psymbol_to_list (pdi->name, strlen (pdi->name), + psym = add_psymbol_to_list (actual_name, strlen (actual_name), VAR_DOMAIN, LOC_STATIC, &objfile->global_psymbols, 0, addr + baseaddr, @@ -1481,9 +1485,9 @@ add_partial_symbol (struct partial_die_info *pdi, if (pdi->locdesc == NULL) return; addr = decode_locdesc (pdi->locdesc, cu); - /*prim_record_minimal_symbol (pdi->name, addr + baseaddr, + /*prim_record_minimal_symbol (actual_name, addr + baseaddr, mst_file_data, objfile); */ - psym = add_psymbol_to_list (pdi->name, strlen (pdi->name), + psym = add_psymbol_to_list (actual_name, strlen (actual_name), VAR_DOMAIN, LOC_STATIC, &objfile->static_psymbols, 0, addr + baseaddr, @@ -1492,7 +1496,7 @@ add_partial_symbol (struct partial_die_info *pdi, break; case DW_TAG_typedef: case DW_TAG_base_type: - add_psymbol_to_list (pdi->name, strlen (pdi->name), + add_psymbol_to_list (actual_name, strlen (actual_name), VAR_DOMAIN, LOC_TYPEDEF, &objfile->static_psymbols, 0, (CORE_ADDR) 0, cu_language, objfile); @@ -1505,7 +1509,7 @@ add_partial_symbol (struct partial_die_info *pdi, references. */ if (pdi->has_children == 0) return; - add_psymbol_to_list (pdi->name, strlen (pdi->name), + add_psymbol_to_list (actual_name, strlen (actual_name), STRUCT_DOMAIN, LOC_TYPEDEF, &objfile->static_psymbols, 0, (CORE_ADDR) 0, cu_language, objfile); @@ -1513,14 +1517,14 @@ add_partial_symbol (struct partial_die_info *pdi, if (cu_language == language_cplus) { /* For C++, these implicitly act as typedefs as well. */ - add_psymbol_to_list (pdi->name, strlen (pdi->name), + add_psymbol_to_list (actual_name, strlen (actual_name), VAR_DOMAIN, LOC_TYPEDEF, &objfile->static_psymbols, 0, (CORE_ADDR) 0, cu_language, objfile); } break; case DW_TAG_enumerator: - add_psymbol_to_list (pdi->name, strlen (pdi->name), + add_psymbol_to_list (actual_name, strlen (actual_name), VAR_DOMAIN, LOC_CONST, &objfile->static_psymbols, 0, (CORE_ADDR) 0, cu_language, objfile); @@ -1863,7 +1867,7 @@ process_die (struct die_info *die, struct dwarf2_cu *cu) if (!processing_has_namespace_info) { processing_has_namespace_info = 1; - processing_current_namespace = ""; + processing_current_prefix = ""; } read_namespace (die, cu); break; @@ -1878,7 +1882,7 @@ process_die (struct die_info *die, struct dwarf2_cu *cu) if (!processing_has_namespace_info) { processing_has_namespace_info = 1; - processing_current_namespace = ""; + processing_current_prefix = ""; } gdb_assert (die->child == NULL); break; @@ -3218,11 +3222,79 @@ static void read_namespace (struct die_info *die, struct dwarf2_cu *cu) { struct objfile *objfile = cu->objfile; - const char *previous_namespace = processing_current_namespace; + const char *previous_prefix = processing_current_prefix; const char *name = NULL; int is_anonymous; struct die_info *current_die; + name = namespace_name (die, &is_anonymous); + + /* Now build the name of the current namespace. */ + + if (previous_prefix[0] == '\0') + { + processing_current_prefix = name; + } + else + { + /* We need temp_name around because processing_current_prefix + is a const char *. */ + char *temp_name = alloca (strlen (previous_prefix) + + 2 + strlen(name) + 1); + strcpy (temp_name, previous_prefix); + strcat (temp_name, "::"); + strcat (temp_name, name); + + processing_current_prefix = temp_name; + } + + /* Add a symbol associated to this if we haven't seen the namespace + before. Also, add a using directive if it's an anonymous + namespace. */ + + if (dwarf2_extension (die) == NULL) + { + struct type *type; + + /* FIXME: carlton/2003-06-27: Once GDB is more const-correct, + this cast will hopefully become unnecessary. */ + type = init_type (TYPE_CODE_NAMESPACE, 0, 0, + (char *) processing_current_prefix, + objfile); + TYPE_TAG_NAME (type) = TYPE_NAME (type); + + new_symbol (die, type, cu); + + if (is_anonymous) + cp_add_using_directive (processing_current_prefix, + strlen (previous_prefix), + strlen (processing_current_prefix)); + } + + if (die->child != NULL) + { + struct die_info *child_die = die->child; + + while (child_die && child_die->tag) + { + process_die (child_die, cu); + child_die = sibling_die (child_die); + } + } + + processing_current_prefix = previous_prefix; +} + +/* Return the name of the namespace represented by DIE. Set + *IS_ANONYMOUS to tell whether or not the namespace is an anonymous + namespace. */ + +static const char * +namespace_name (struct die_info *die, int *is_anonymous) +{ + struct die_info *current_die; + const char *name = NULL; + /* Loop through the extensions until we find a name. */ for (current_die = die; @@ -3236,64 +3308,11 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu) /* Is it an anonymous namespace? */ - is_anonymous = (name == NULL); - if (is_anonymous) + *is_anonymous = (name == NULL); + if (*is_anonymous) name = "(anonymous namespace)"; - /* Now build the name of the current namespace. */ - - if (previous_namespace[0] == '\0') - { - processing_current_namespace = name; - } - else - { - /* We need temp_name around because processing_current_namespace - is a const char *. */ - char *temp_name = alloca (strlen (previous_namespace) - + 2 + strlen(name) + 1); - strcpy (temp_name, previous_namespace); - strcat (temp_name, "::"); - strcat (temp_name, name); - - processing_current_namespace = temp_name; - } - - /* Add a symbol associated to this if we haven't seen the namespace - before. Also, add a using directive if it's an anonymous - namespace. */ - - if (dwarf2_extension (die) == NULL) - { - struct type *type; - - /* FIXME: carlton/2003-06-27: Once GDB is more const-correct, - this cast will hopefully become unnecessary. */ - type = init_type (TYPE_CODE_NAMESPACE, 0, 0, - (char *) processing_current_namespace, - objfile); - TYPE_TAG_NAME (type) = TYPE_NAME (type); - - new_symbol (die, type, cu); - - if (is_anonymous) - cp_add_using_directive (processing_current_namespace, - strlen (previous_namespace), - strlen (processing_current_namespace)); - } - - if (die->child != NULL) - { - struct die_info *child_die = die->child; - - while (child_die && child_die->tag) - { - process_die (child_die, cu); - child_die = sibling_die (child_die); - } - } - - processing_current_namespace = previous_namespace; + return name; } /* Extract all information from a DW_TAG_pointer_type DIE and add to