2004-03-15 David Carlton <carlton@kealia.com>

Fix for PR c++/1553:
	* dwarf2read.c (read_structure_type): Determine type name by
	calling determine_class_name.
	(determine_class_name): New.
	(determine_prefix): Look at TYPE_TAG_NAME and call
	determine_class_name when appropriate.
	(determine_prefix_aux, class_name): Delete.
This commit is contained in:
David Carlton 2004-03-15 22:33:52 +00:00
parent fe8bf7d723
commit 8176b9b8a3
2 changed files with 109 additions and 133 deletions

View File

@ -1,3 +1,13 @@
2004-03-15 David Carlton <carlton@kealia.com>
Fix for PR c++/1553:
* dwarf2read.c (read_structure_type): Determine type name by
calling determine_class_name.
(determine_class_name): New.
(determine_prefix): Look at TYPE_TAG_NAME and call
determine_class_name when appropriate.
(determine_prefix_aux, class_name): Delete.
2004-03-15 Kevin Buettner <kevinb@redhat.com> 2004-03-15 Kevin Buettner <kevinb@redhat.com>
* breakpoint.c (TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT): Delete * breakpoint.c (TARGET_REGION_SIZE_OK_FOR_HW_WATCHPOINT): Delete

View File

@ -782,12 +782,8 @@ static void read_type_die (struct die_info *, struct dwarf2_cu *);
static char *determine_prefix (struct die_info *die, struct dwarf2_cu *); static char *determine_prefix (struct die_info *die, struct dwarf2_cu *);
static char *determine_prefix_aux (struct die_info *die, struct dwarf2_cu *);
static char *typename_concat (const char *prefix, const char *suffix); static char *typename_concat (const char *prefix, const char *suffix);
static char *class_name (struct die_info *die, struct dwarf2_cu *);
static void read_typedef (struct die_info *, struct dwarf2_cu *); static void read_typedef (struct die_info *, struct dwarf2_cu *);
static void read_base_type (struct die_info *, struct dwarf2_cu *); static void read_base_type (struct die_info *, struct dwarf2_cu *);
@ -824,6 +820,8 @@ static void read_structure_type (struct die_info *, struct dwarf2_cu *);
static void process_structure_scope (struct die_info *, struct dwarf2_cu *); static void process_structure_scope (struct die_info *, struct dwarf2_cu *);
static char *determine_class_name (struct die_info *die, struct dwarf2_cu *cu);
static void read_common_block (struct die_info *, struct dwarf2_cu *); static void read_common_block (struct die_info *, struct dwarf2_cu *);
static void read_namespace (struct die_info *die, struct dwarf2_cu *); static void read_namespace (struct die_info *die, struct dwarf2_cu *);
@ -3167,13 +3165,8 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
struct objfile *objfile = cu->objfile; struct objfile *objfile = cu->objfile;
struct type *type; struct type *type;
struct attribute *attr; struct attribute *attr;
char *name = NULL;
const char *previous_prefix = processing_current_prefix; const char *previous_prefix = processing_current_prefix;
struct cleanup *back_to = NULL; struct cleanup *back_to = NULL;
/* This says whether or not we want to try to update the structure's
name to include enclosing namespace/class information, if
any. */
int need_to_update_name = 0;
if (die->type) if (die->type)
return; return;
@ -3184,41 +3177,20 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
attr = dwarf2_attr (die, DW_AT_name, cu); attr = dwarf2_attr (die, DW_AT_name, cu);
if (attr && DW_STRING (attr)) if (attr && DW_STRING (attr))
{ {
name = DW_STRING (attr);
if (cu->language == language_cplus) if (cu->language == language_cplus)
{ {
struct die_info *spec_die = die_specification (die, cu); char *new_prefix = determine_class_name (die, cu);
TYPE_TAG_NAME (type) = obsavestring (new_prefix,
if (spec_die != NULL) strlen (new_prefix),
{ &objfile->objfile_obstack);
char *specification_prefix = determine_prefix (spec_die, cu); back_to = make_cleanup (xfree, new_prefix);
processing_current_prefix = specification_prefix;
back_to = make_cleanup (xfree, specification_prefix);
}
}
if (processing_has_namespace_info)
{
/* FIXME: carlton/2003-11-10: This variable exists only for
const-correctness reasons. When I tried to change
TYPE_TAG_NAME to be a const char *, I ran into a cascade
of changes which would have forced decode_line_1 to take
a const char **. */
char *new_prefix = obconcat (&objfile->objfile_obstack,
processing_current_prefix,
processing_current_prefix[0] == '\0'
? "" : "::",
name);
TYPE_TAG_NAME (type) = new_prefix;
processing_current_prefix = new_prefix; processing_current_prefix = new_prefix;
} }
else else
{ {
/* The name is already allocated along with this objfile, so /* The name is already allocated along with this objfile, so
we don't need to duplicate it for the type. */ we don't need to duplicate it for the type. */
TYPE_TAG_NAME (type) = name; TYPE_TAG_NAME (type) = DW_STRING (attr);
need_to_update_name = (cu->language == language_cplus);
} }
} }
@ -3279,41 +3251,6 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
/* C++ member function. */ /* C++ member function. */
read_type_die (child_die, cu); read_type_die (child_die, cu);
dwarf2_add_member_fn (&fi, child_die, type, cu); dwarf2_add_member_fn (&fi, child_die, type, cu);
if (need_to_update_name)
{
/* The demangled names of member functions contain
information about enclosing namespaces/classes,
if any. */
/* FIXME: carlton/2003-11-10: The excessive
demangling here is a bit wasteful, as is the
memory usage for names. */
/* NOTE: carlton/2003-11-10: As commented in
add_partial_structure, the demangler sometimes
prints the type info in a different form from the
debug info. We could solve this by using the
demangled name to get the prefix; if doing so,
however, we'd need to be careful when reading a
class that's nested inside a template class.
That would also cause problems when trying to
determine RTTI information, since we use the
demangler to determine the appropriate class
name. */
char *actual_class_name
= class_name_from_physname (dwarf2_linkage_name
(child_die, cu));
if (actual_class_name != NULL
&& strcmp (actual_class_name, name) != 0)
{
TYPE_TAG_NAME (type)
= obsavestring (actual_class_name,
strlen (actual_class_name),
&objfile->objfile_obstack);
}
xfree (actual_class_name);
need_to_update_name = 0;
}
} }
else if (child_die->tag == DW_TAG_inheritance) else if (child_die->tag == DW_TAG_inheritance)
{ {
@ -3474,6 +3411,62 @@ read_enumeration_type (struct die_info *die, struct dwarf2_cu *cu)
die->type = type; die->type = type;
} }
/* Determine the name of the type represented by DIE, which should be
a named C++ compound type. Return the name in question; the caller
is responsible for xfree()'ing it. */
static char *
determine_class_name (struct die_info *die, struct dwarf2_cu *cu)
{
struct cleanup *back_to = NULL;
struct die_info *spec_die = die_specification (die, cu);
char *new_prefix = NULL;
/* If this is the definition of a class that is declared by another
die, then processing_current_prefix may not be accurate; see
read_func_scope for a similar example. */
if (spec_die != NULL)
{
char *specification_prefix = determine_prefix (spec_die, cu);
processing_current_prefix = specification_prefix;
back_to = make_cleanup (xfree, specification_prefix);
}
/* If we don't have namespace debug info, guess the name by trying
to demangle the names of members, just like we did in
add_partial_structure. */
if (!processing_has_namespace_info)
{
struct die_info *child;
for (child = die->child;
child != NULL && child->tag != 0;
child = sibling_die (child))
{
if (child->tag == DW_TAG_subprogram)
{
new_prefix = class_name_from_physname (dwarf2_linkage_name
(child, cu));
if (new_prefix != NULL)
break;
}
}
}
if (new_prefix == NULL)
{
const char *name = dwarf2_name (die, cu);
new_prefix = typename_concat (processing_current_prefix,
name ? name : "<<anonymous>>");
}
if (back_to != NULL)
do_cleanups (back_to);
return new_prefix;
}
/* Given a pointer to a die which begins an enumeration, process all /* Given a pointer to a die which begins an enumeration, process all
the dies that define the members of the enumeration, and create the the dies that define the members of the enumeration, and create the
symbol for the enumeration type. symbol for the enumeration type.
@ -3724,6 +3717,7 @@ read_namespace (struct die_info *die, struct dwarf2_cu *cu)
TYPE_TAG_NAME (type) = TYPE_NAME (type); TYPE_TAG_NAME (type) = TYPE_NAME (type);
new_symbol (die, type, cu); new_symbol (die, type, cu);
die->type = type;
if (is_anonymous) if (is_anonymous)
cp_add_using_directive (processing_current_prefix, cp_add_using_directive (processing_current_prefix,
@ -6297,18 +6291,6 @@ read_type_die (struct die_info *die, struct dwarf2_cu *cu)
static char * static char *
determine_prefix (struct die_info *die, struct dwarf2_cu *cu) determine_prefix (struct die_info *die, struct dwarf2_cu *cu)
{
char *prefix = determine_prefix_aux (die, cu);
return prefix ? prefix : xstrdup ("");
}
/* Return the name of the namespace/class that DIE is defined
within, or NULL if we can't tell. The caller should xfree the
result. */
static char *
determine_prefix_aux (struct die_info *die, struct dwarf2_cu *cu)
{ {
struct die_info *parent; struct die_info *parent;
@ -6319,49 +6301,55 @@ determine_prefix_aux (struct die_info *die, struct dwarf2_cu *cu)
if (parent == NULL) if (parent == NULL)
{ {
return (processing_has_namespace_info ? xstrdup ("") : NULL); return xstrdup ("");
} }
else else
{ {
char *parent_prefix = determine_prefix_aux (parent, cu);
char *retval;
switch (parent->tag) { switch (parent->tag) {
case DW_TAG_namespace: case DW_TAG_namespace:
{ {
int dummy; /* FIXME: carlton/2004-03-05: Should I follow extension dies
before doing this check? */
retval = typename_concat (parent_prefix, if (parent->type != NULL && TYPE_TAG_NAME (parent->type) != NULL)
namespace_name (parent, &dummy, cu)); {
return xstrdup (TYPE_TAG_NAME (parent->type));
}
else
{
int dummy;
char *parent_prefix = determine_prefix (parent, cu);
char *retval = typename_concat (parent_prefix,
namespace_name (parent, &dummy,
cu));
xfree (parent_prefix);
return retval;
}
} }
break; break;
case DW_TAG_class_type: case DW_TAG_class_type:
case DW_TAG_structure_type: case DW_TAG_structure_type:
{ {
if (parent_prefix != NULL) if (parent->type != NULL && TYPE_TAG_NAME (parent->type) != NULL)
{ {
const char *parent_name = dwarf2_name (parent, cu); return xstrdup (TYPE_TAG_NAME (parent->type));
if (parent_name != NULL)
retval = typename_concat (parent_prefix, dwarf2_name (parent, cu));
else
/* FIXME: carlton/2003-11-10: I'm not sure what the
best thing to do here is. */
retval = typename_concat (parent_prefix,
"<<anonymous class>>");
} }
else else
retval = class_name (parent, cu); {
} const char *old_prefix = processing_current_prefix;
break; char *new_prefix = determine_prefix (parent, cu);
default: char *retval;
retval = parent_prefix;
break;
}
if (retval != parent_prefix) processing_current_prefix = new_prefix;
xfree (parent_prefix); retval = determine_class_name (parent, cu);
return retval; processing_current_prefix = old_prefix;
xfree (new_prefix);
return retval;
}
}
default:
return determine_prefix (parent, cu);
}
} }
} }
@ -6386,28 +6374,6 @@ typename_concat (const char *prefix, const char *suffix)
} }
} }
/* Return a newly-allocated string giving the name of the class given
by DIE. */
static char *
class_name (struct die_info *die, struct dwarf2_cu *cu)
{
struct die_info *child;
const char *name;
for (child = die->child; child != NULL; child = sibling_die (child))
{
if (child->tag == DW_TAG_subprogram)
return class_name_from_physname (dwarf2_linkage_name (child, cu));
}
name = dwarf2_name (die, cu);
if (name != NULL)
return xstrdup (name);
else
return xstrdup ("");
}
static struct type * static struct type *
dwarf_base_type (int encoding, int size, struct dwarf2_cu *cu) dwarf_base_type (int encoding, int size, struct dwarf2_cu *cu)
{ {