mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-10-14 19:38:01 +08:00
* gdbtypes.h (struct type): Add field tag_name.
* gdbtypes.c (type_name_no_tag), c-typeprint.c (c_type_print_base): Use it. * {coff,dwarf,mips,stabs}read.c: Set it.
This commit is contained in:
@ -455,7 +455,6 @@ c_type_print_base (type, stream, show, level)
|
||||
int show;
|
||||
int level;
|
||||
{
|
||||
char *name;
|
||||
register int i;
|
||||
register int len;
|
||||
register int lastval;
|
||||
@ -473,8 +472,12 @@ c_type_print_base (type, stream, show, level)
|
||||
|
||||
/* When SHOW is zero or less, and there is a valid type name, then always
|
||||
just print the type name directly from the type. */
|
||||
/* If we have "typedef struct foo {. . .} bar;" do we want to print it
|
||||
as "struct foo" or as "bar"? Pick the latter, because C++ folk tend
|
||||
to expect things like "class5 *foo" rather than "struct class5 *foo". */
|
||||
|
||||
if ((show <= 0) && (TYPE_NAME (type) != NULL))
|
||||
if (show <= 0
|
||||
&& TYPE_NAME (type) != NULL)
|
||||
{
|
||||
fputs_filtered (TYPE_NAME (type), stream);
|
||||
return;
|
||||
@ -494,67 +497,32 @@ c_type_print_base (type, stream, show, level)
|
||||
case TYPE_CODE_STRUCT:
|
||||
if (HAVE_CPLUS_STRUCT (type))
|
||||
{
|
||||
/* Always print it as "class foo" even if foo is a typedef'd
|
||||
name, not a tag. */
|
||||
fprintf_filtered (stream, "class ");
|
||||
name = type_name_no_tag (type);
|
||||
if (name != NULL)
|
||||
{
|
||||
fputs_filtered (name, stream);
|
||||
fputs_filtered (" ", stream);
|
||||
wrap_here (" ");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf_filtered (stream, "struct ");
|
||||
name = TYPE_NAME (type);
|
||||
/* If the name does not start with "struct " it means that the
|
||||
type was defined without a tag, so don't print a tag. It is
|
||||
possible that we should have a better way of distinguising
|
||||
tag names from typedef'd names. (e.g. a new tagname field in
|
||||
the struct type). */
|
||||
if (name != NULL && strncmp (name, "struct ", 7) == 0)
|
||||
{
|
||||
fputs_filtered (name + 7, stream);
|
||||
fputs_filtered (" ", stream);
|
||||
}
|
||||
}
|
||||
goto struct_union;
|
||||
|
||||
case TYPE_CODE_UNION:
|
||||
fprintf_filtered (stream, "union ");
|
||||
if (HAVE_CPLUS_STRUCT (type))
|
||||
{
|
||||
/* Always print it as "union foo" even if foo is a typedef'd
|
||||
name, not a tag. */
|
||||
name = type_name_no_tag (type);
|
||||
if (name != NULL)
|
||||
{
|
||||
fputs_filtered (name, stream);
|
||||
fputs_filtered (" ", stream);
|
||||
wrap_here (" ");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
name = TYPE_NAME (type);
|
||||
/* If the name does not start with "union " it means that the
|
||||
type was defined without a tag, so don't print a tag. It is
|
||||
possible that we should have a better way of distinguising
|
||||
tag names from typedef'd names. (e.g. a new tagname field in
|
||||
the struct type). */
|
||||
if (name != NULL && strncmp (name, "union ", 6) == 0)
|
||||
{
|
||||
fputs_filtered (name + 6, stream);
|
||||
fputs_filtered (" ", stream);
|
||||
}
|
||||
}
|
||||
|
||||
struct_union:
|
||||
if (TYPE_TAG_NAME (type) != NULL)
|
||||
{
|
||||
fputs_filtered (TYPE_TAG_NAME (type), stream);
|
||||
if (show > 0)
|
||||
fputs_filtered (" ", stream);
|
||||
}
|
||||
wrap_here (" ");
|
||||
if (show < 0)
|
||||
{
|
||||
/* If we just printed a tag name, no need to print anything else. */
|
||||
if (TYPE_TAG_NAME (type) == NULL)
|
||||
fprintf_filtered (stream, "{...}");
|
||||
else
|
||||
}
|
||||
else if (show > 0)
|
||||
{
|
||||
check_stub_type (type);
|
||||
|
||||
@ -653,6 +621,7 @@ c_type_print_base (type, stream, show, level)
|
||||
struct fn_field *f = TYPE_FN_FIELDLIST1 (type, i);
|
||||
int j, len2 = TYPE_FN_FIELDLIST_LENGTH (type, i);
|
||||
char *method_name = TYPE_FN_FIELDLIST_NAME (type, i);
|
||||
char *name = type_name_no_tag (type);
|
||||
int is_constructor = name && STREQ(method_name, name);
|
||||
for (j = 0; j < len2; j++)
|
||||
{
|
||||
@ -739,23 +708,21 @@ c_type_print_base (type, stream, show, level)
|
||||
|
||||
case TYPE_CODE_ENUM:
|
||||
fprintf_filtered (stream, "enum ");
|
||||
name = TYPE_NAME (type);
|
||||
|
||||
/* If the name does not start with "enum " it means that the
|
||||
type was defined without a tag, so don't print a tag. It is
|
||||
possible that we should have a better way of distinguising
|
||||
tag names from typedef'd names. (e.g. a new tagname field in
|
||||
the struct type). */
|
||||
if (name != NULL && strncmp (name, "enum ", 5) == 0)
|
||||
if (TYPE_TAG_NAME (type) != NULL)
|
||||
{
|
||||
fputs_filtered (name + 5, stream);
|
||||
fputs_filtered (TYPE_TAG_NAME (type), stream);
|
||||
if (show > 0)
|
||||
fputs_filtered (" ", stream);
|
||||
}
|
||||
|
||||
wrap_here (" ");
|
||||
if (show < 0)
|
||||
{
|
||||
/* If we just printed a tag name, no need to print anything else. */
|
||||
if (TYPE_TAG_NAME (type) == NULL)
|
||||
fprintf_filtered (stream, "{...}");
|
||||
else
|
||||
}
|
||||
else if (show > 0)
|
||||
{
|
||||
fprintf_filtered (stream, "{");
|
||||
len = TYPE_NFIELDS (type);
|
||||
|
@ -1026,7 +1026,6 @@ struct_type (dip, thisdie, enddie, objfile)
|
||||
struct nextfield *new;
|
||||
int nfields = 0;
|
||||
int n;
|
||||
char *tpart1;
|
||||
struct dieinfo mbr;
|
||||
char *nextdie;
|
||||
#if !BITS_BIG_ENDIAN
|
||||
@ -1043,20 +1042,16 @@ struct_type (dip, thisdie, enddie, objfile)
|
||||
{
|
||||
case TAG_class_type:
|
||||
TYPE_CODE (type) = TYPE_CODE_CLASS;
|
||||
tpart1 = "class";
|
||||
break;
|
||||
case TAG_structure_type:
|
||||
TYPE_CODE (type) = TYPE_CODE_STRUCT;
|
||||
tpart1 = "struct";
|
||||
break;
|
||||
case TAG_union_type:
|
||||
TYPE_CODE (type) = TYPE_CODE_UNION;
|
||||
tpart1 = "union";
|
||||
break;
|
||||
default:
|
||||
/* Should never happen */
|
||||
TYPE_CODE (type) = TYPE_CODE_UNDEF;
|
||||
tpart1 = "???";
|
||||
complain (&missing_tag, DIE_ID, DIE_NAME);
|
||||
break;
|
||||
}
|
||||
@ -1067,8 +1062,8 @@ struct_type (dip, thisdie, enddie, objfile)
|
||||
&& *dip -> at_name != '~'
|
||||
&& *dip -> at_name != '.')
|
||||
{
|
||||
TYPE_NAME (type) = obconcat (&objfile -> type_obstack,
|
||||
tpart1, " ", dip -> at_name);
|
||||
TYPE_TAG_NAME (type) = obconcat (&objfile -> type_obstack,
|
||||
"", "", dip -> at_name);
|
||||
}
|
||||
/* Use whatever size is known. Zero is a valid size. We might however
|
||||
wish to check has_at_byte_size to make sure that some byte size was
|
||||
@ -1756,8 +1751,8 @@ enum_type (dip, objfile)
|
||||
&& *dip -> at_name != '~'
|
||||
&& *dip -> at_name != '.')
|
||||
{
|
||||
TYPE_NAME (type) = obconcat (&objfile -> type_obstack, "enum",
|
||||
" ", dip -> at_name);
|
||||
TYPE_TAG_NAME (type) = obconcat (&objfile -> type_obstack,
|
||||
"", "", dip -> at_name);
|
||||
}
|
||||
if (dip -> at_byte_size != 0)
|
||||
{
|
||||
|
@ -472,43 +472,20 @@ smash_to_method_type (type, domain, to_type, args)
|
||||
TYPE_CODE (type) = TYPE_CODE_METHOD;
|
||||
}
|
||||
|
||||
/* Return a typename for a struct/union/enum type
|
||||
without the tag qualifier. If the type has a NULL name,
|
||||
NULL is returned. */
|
||||
/* Return a typename for a struct/union/enum type without "struct ",
|
||||
"union ", or "enum ". If the type has a NULL name, return NULL. */
|
||||
|
||||
char *
|
||||
type_name_no_tag (type)
|
||||
register const struct type *type;
|
||||
{
|
||||
register char *name;
|
||||
if (TYPE_TAG_NAME (type) != NULL)
|
||||
return TYPE_TAG_NAME (type);
|
||||
|
||||
if ((name = TYPE_NAME (type)) != NULL)
|
||||
{
|
||||
switch (TYPE_CODE (type))
|
||||
{
|
||||
case TYPE_CODE_STRUCT:
|
||||
if(!strncmp (name, "struct ", 7))
|
||||
{
|
||||
name += 7;
|
||||
}
|
||||
break;
|
||||
case TYPE_CODE_UNION:
|
||||
if(!strncmp (name, "union ", 6))
|
||||
{
|
||||
name += 6;
|
||||
}
|
||||
break;
|
||||
case TYPE_CODE_ENUM:
|
||||
if(!strncmp (name, "enum ", 5))
|
||||
{
|
||||
name += 5;
|
||||
}
|
||||
break;
|
||||
default: /* To avoid -Wall warnings */
|
||||
break;
|
||||
}
|
||||
}
|
||||
return (name);
|
||||
/* Is there code which expects this to return the name if there is no
|
||||
tag name? My guess is that this is mainly used for C++ in cases where
|
||||
the two will always be the same. */
|
||||
return TYPE_NAME (type);
|
||||
}
|
||||
|
||||
/* Lookup a primitive type named NAME.
|
||||
|
@ -142,6 +142,12 @@ struct type
|
||||
|
||||
char *name;
|
||||
|
||||
/* Tag name for this type, or NULL if none. This is a feature which is
|
||||
specific to C/C++ for structs, unions, or enums.
|
||||
This is used for printing only, except by poorly designed C++ code. */
|
||||
|
||||
char *tag_name;
|
||||
|
||||
/* Length, in units of TARGET_CHAR_BIT bits,
|
||||
of storage for a value of this type */
|
||||
|
||||
@ -399,6 +405,7 @@ allocate_cplus_struct_type PARAMS ((struct type *));
|
||||
(TYPE_CPLUS_SPECIFIC(type) != &cplus_struct_default)
|
||||
|
||||
#define TYPE_NAME(thistype) (thistype)->name
|
||||
#define TYPE_TAG_NAME(type) ((type)->tag_name)
|
||||
#define TYPE_TARGET_TYPE(thistype) (thistype)->target_type
|
||||
#define TYPE_POINTER_TYPE(thistype) (thistype)->pointer_type
|
||||
#define TYPE_REFERENCE_TYPE(thistype) (thistype)->reference_type
|
||||
|
@ -1086,14 +1086,9 @@ define_symbol (valu, string, desc, type, objfile)
|
||||
SYMBOL_CLASS (sym) = LOC_TYPEDEF;
|
||||
SYMBOL_VALUE (sym) = valu;
|
||||
SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
|
||||
if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0)
|
||||
TYPE_NAME (SYMBOL_TYPE (sym))
|
||||
= obconcat (&objfile -> type_obstack, "",
|
||||
(TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_ENUM
|
||||
? "enum "
|
||||
: (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT
|
||||
? "struct " : "union ")),
|
||||
SYMBOL_NAME (sym));
|
||||
if (TYPE_TAG_NAME (SYMBOL_TYPE (sym)) == 0)
|
||||
TYPE_TAG_NAME (SYMBOL_TYPE (sym))
|
||||
= obconcat (&objfile -> type_obstack, "", "", SYMBOL_NAME (sym));
|
||||
add_symbol_to_list (sym, &file_symbols);
|
||||
|
||||
if (synonym)
|
||||
@ -1105,6 +1100,9 @@ define_symbol (valu, string, desc, type, objfile)
|
||||
SYMBOL_CLASS (typedef_sym) = LOC_TYPEDEF;
|
||||
SYMBOL_VALUE (typedef_sym) = valu;
|
||||
SYMBOL_NAMESPACE (typedef_sym) = VAR_NAMESPACE;
|
||||
if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0)
|
||||
TYPE_NAME (SYMBOL_TYPE (sym))
|
||||
= obconcat (&objfile -> type_obstack, "", "", SYMBOL_NAME (sym));
|
||||
add_symbol_to_list (typedef_sym, &file_symbols);
|
||||
}
|
||||
break;
|
||||
@ -1317,15 +1315,12 @@ read_type (pp, objfile)
|
||||
{
|
||||
case 's':
|
||||
code = TYPE_CODE_STRUCT;
|
||||
prefix = "struct ";
|
||||
break;
|
||||
case 'u':
|
||||
code = TYPE_CODE_UNION;
|
||||
prefix = "union ";
|
||||
break;
|
||||
case 'e':
|
||||
code = TYPE_CODE_ENUM;
|
||||
prefix = "enum ";
|
||||
break;
|
||||
default:
|
||||
return error_type (pp);
|
||||
@ -1333,16 +1328,7 @@ read_type (pp, objfile)
|
||||
|
||||
to = type_name = (char *)
|
||||
obstack_alloc (&objfile -> type_obstack,
|
||||
(strlen (prefix) +
|
||||
((char *) strchr (*pp, ':') - (*pp)) + 1));
|
||||
|
||||
/* Copy the prefix. */
|
||||
from = prefix;
|
||||
while ((*to++ = *from++) != '\0')
|
||||
;
|
||||
to--;
|
||||
|
||||
type_name_only = to;
|
||||
(((char *) strchr (*pp, ':') - (*pp)) + 1));
|
||||
|
||||
/* Copy the name. */
|
||||
from = *pp + 1;
|
||||
@ -1352,23 +1338,6 @@ read_type (pp, objfile)
|
||||
|
||||
/* Set the pointer ahead of the name which we just read. */
|
||||
*pp = from;
|
||||
|
||||
#if 0
|
||||
/* The following hack is clearly wrong, because it doesn't
|
||||
check whether we are in a baseclass. I tried to reproduce
|
||||
the case that it is trying to fix, but I couldn't get
|
||||
g++ to put out a cross reference to a basetype. Perhaps
|
||||
it doesn't do it anymore. */
|
||||
/* Note: for C++, the cross reference may be to a base type which
|
||||
has not yet been seen. In this case, we skip to the comma,
|
||||
which will mark the end of the base class name. (The ':'
|
||||
at the end of the base class name will be skipped as well.)
|
||||
But sometimes (ie. when the cross ref is the last thing on
|
||||
the line) there will be no ','. */
|
||||
from = (char *) strchr (*pp, ',');
|
||||
if (from)
|
||||
*pp = from;
|
||||
#endif /* 0 */
|
||||
}
|
||||
|
||||
/* Now check to see whether the type has already been declared. */
|
||||
@ -1386,7 +1355,7 @@ read_type (pp, objfile)
|
||||
if (SYMBOL_CLASS (sym) == LOC_TYPEDEF
|
||||
&& SYMBOL_NAMESPACE (sym) == STRUCT_NAMESPACE
|
||||
&& (TYPE_CODE (SYMBOL_TYPE (sym)) == code)
|
||||
&& STREQ (SYMBOL_NAME (sym), type_name_only))
|
||||
&& STREQ (SYMBOL_NAME (sym), type_name))
|
||||
{
|
||||
obstack_free (&objfile -> type_obstack, type_name);
|
||||
type = SYMBOL_TYPE (sym);
|
||||
@ -1401,7 +1370,7 @@ read_type (pp, objfile)
|
||||
type. */
|
||||
type = dbx_alloc_type (typenums, objfile);
|
||||
TYPE_CODE (type) = code;
|
||||
TYPE_NAME (type) = type_name;
|
||||
TYPE_TAG_NAME (type) = type_name;
|
||||
INIT_CPLUS_SPECIFIC(type);
|
||||
TYPE_FLAGS (type) |= TYPE_FLAG_STUB;
|
||||
|
||||
@ -3482,7 +3451,7 @@ cleanup_undefined_types ()
|
||||
struct pending *ppt;
|
||||
int i;
|
||||
/* Name of the type, without "struct" or "union" */
|
||||
char *typename = type_name_no_tag (*type);
|
||||
char *typename = TYPE_TAG_NAME (*type);
|
||||
|
||||
if (typename == NULL)
|
||||
{
|
||||
|
Reference in New Issue
Block a user