/* Support for printing C and C++ types for GDB, the GNU debugger.
- Copyright 1986, 1988, 1989, 1991 Free Software Foundation, Inc.
+ Copyright 1986, 1988, 1989, 1991, 1993, 1994
+ Free Software Foundation, Inc.
This file is part of GDB.
#include <string.h>
#include <errno.h>
-
-extern int demangle; /* whether to print C++ syms raw or source-form */
+#include <ctype.h>
static void
-c_type_print_args PARAMS ((struct type *, FILE *));
+c_type_print_args PARAMS ((struct type *, GDB_FILE *));
static void
-c_type_print_varspec_suffix PARAMS ((struct type *, FILE *, int, int, int));
+c_type_print_varspec_suffix PARAMS ((struct type *, GDB_FILE *, int, int, int));
static void
-cp_type_print_derivation_info PARAMS ((FILE *, struct type *));
+cp_type_print_derivation_info PARAMS ((GDB_FILE *, struct type *));
void
-c_type_print_varspec_prefix PARAMS ((struct type *, FILE *, int, int));
+c_type_print_varspec_prefix PARAMS ((struct type *, GDB_FILE *, int, int));
void
-c_type_print_base PARAMS ((struct type *, FILE *, int, int));
+c_type_print_base PARAMS ((struct type *, GDB_FILE *, int, int));
\f
/* Print a description of a type in the format of a
c_typedef_print (type, new, stream)
struct type *type;
struct symbol *new;
- FILE *stream;
+ GDB_FILE *stream;
{
switch (current_language->la_language)
{
#endif
#ifdef _LANG_chill
case language_chill:
- error ("Missing Chill support in function c_typedef_print."); /*FIXME*/
+ fprintf_filtered(stream, "SYNMODE ");
+ if(!TYPE_NAME(SYMBOL_TYPE(new)) ||
+ !STREQ (TYPE_NAME(SYMBOL_TYPE(new)), SYMBOL_NAME(new)))
+ fprintf_filtered(stream, "%s = ", SYMBOL_SOURCE_NAME(new));
+ else
+ fprintf_filtered(stream, "<builtin> = ");
+ type_print(type,"",stream,0);
+ break;
#endif
default:
error("Language not supported.");
c_print_type (type, varstring, stream, show, level)
struct type *type;
char *varstring;
- FILE *stream;
+ GDB_FILE *stream;
int show;
int level;
{
/* For demangled function names, we have the arglist as part of the name,
so don't print an additional pair of ()'s */
- demangled_args = varstring[strlen(varstring) - 1] == ')';
+ demangled_args = strchr(varstring, '(') != NULL;
c_type_print_varspec_suffix (type, stream, show, 0, demangled_args);
}
char *prefix;
char *varstring;
int staticp;
- FILE *stream;
+ GDB_FILE *stream;
{
int i;
static void
cp_type_print_derivation_info (stream, type)
- FILE *stream;
+ GDB_FILE *stream;
struct type *type;
{
char *name;
void
c_type_print_varspec_prefix (type, stream, show, passed_a_ptr)
struct type *type;
- FILE *stream;
+ GDB_FILE *stream;
int show;
int passed_a_ptr;
{
case TYPE_CODE_METHOD:
if (passed_a_ptr)
- fprintf (stream, "(");
+ fprintf_unfiltered (stream, "(");
c_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
if (passed_a_ptr)
{
case TYPE_CODE_SET:
case TYPE_CODE_RANGE:
case TYPE_CODE_STRING:
+ case TYPE_CODE_BITSTRING:
+ case TYPE_CODE_COMPLEX:
/* These types need no prefix. They are listed here so that
gcc -Wall will reveal any types that haven't been handled. */
break;
static void
c_type_print_args (type, stream)
struct type *type;
- FILE *stream;
+ GDB_FILE *stream;
{
int i;
struct type **args;
static void
c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args)
struct type *type;
- FILE *stream;
+ GDB_FILE *stream;
int show;
int passed_a_ptr;
int demangled_args;
fprintf_filtered (stream, ")");
fprintf_filtered (stream, "[");
- if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
+ if (TYPE_LENGTH (type) >= 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
+ && TYPE_ARRAY_UPPER_BOUND_TYPE(type) != BOUND_CANNOT_BE_DETERMINED)
fprintf_filtered (stream, "%d",
(TYPE_LENGTH (type)
/ TYPE_LENGTH (TYPE_TARGET_TYPE (type))));
break;
case TYPE_CODE_FUNC:
- c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
- passed_a_ptr, 0);
if (passed_a_ptr)
fprintf_filtered (stream, ")");
if (!demangled_args)
- fprintf_filtered (stream, "()");
+ { int i, len = TYPE_NFIELDS (type);
+ fprintf_filtered (stream, "(");
+ for (i = 0; i < len; i++)
+ {
+ if (i > 0)
+ {
+ fputs_filtered (", ", stream);
+ wrap_here (" ");
+ }
+ c_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0);
+ }
+ fprintf_filtered (stream, ")");
+ }
+ c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
+ passed_a_ptr, 0);
break;
case TYPE_CODE_UNDEF:
case TYPE_CODE_SET:
case TYPE_CODE_RANGE:
case TYPE_CODE_STRING:
+ case TYPE_CODE_BITSTRING:
+ case TYPE_CODE_COMPLEX:
/* These types do not need a suffix. They are listed so that
gcc -Wall will report types that may not have been considered. */
break;
function value or array element), or the description of a
structure or union.
- SHOW nonzero means don't print this type as just its name;
- show its real definition even if it has a name.
- SHOW zero means print just typename or struct tag if there is one
- SHOW negative means abbreviate structure elements.
- SHOW is decremented for printing of structure elements.
+ SHOW positive means print details about the type (e.g. enum values),
+ and print structure elements passing SHOW - 1 for show.
+ SHOW negative means just print the type name or struct tag if there is one.
+ If there is no name, print something sensible but concise like
+ "struct {...}".
+ SHOW zero means just print the type name or struct tag if there is one.
+ If there is no name, print something sensible but not as concise like
+ "struct {int x; int y;}".
- LEVEL is the depth to indent by.
+ LEVEL is the number of spaces to indent by.
We increase it for some recursive calls. */
void
c_type_print_base (type, stream, show, level)
struct type *type;
- FILE *stream;
+ GDB_FILE *stream;
int show;
int level;
{
- char *name;
register int i;
register int len;
register int lastval;
}
/* When SHOW is zero or less, and there is a valid type name, then always
- just print the type name directly from the type. */
+ 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;
}
+ check_stub_type (type);
+
switch (TYPE_CODE (type))
{
case TYPE_CODE_ARRAY:
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 (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
+
+ struct_union:
+ if (TYPE_TAG_NAME (type) != NULL)
{
- 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 (strncmp (name, "union ", 6) == 0)
- {
- fputs_filtered (name + 6, stream);
- fputs_filtered (" ", stream);
- }
+ fputs_filtered (TYPE_TAG_NAME (type), stream);
+ if (show > 0)
+ fputs_filtered (" ", stream);
}
- struct_union:
wrap_here (" ");
if (show < 0)
- fprintf_filtered (stream, "{...}");
- else
{
- check_stub_type (type);
-
+ /* If we just printed a tag name, no need to print anything else. */
+ if (TYPE_TAG_NAME (type) == NULL)
+ fprintf_filtered (stream, "{...}");
+ }
+ else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
+ {
cp_type_print_derivation_info (stream, type);
fprintf_filtered (stream, "{\n");
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++)
{
+ char *physname = TYPE_FN_FIELD_PHYSNAME (f, j);
+ int is_full_physname_constructor =
+ ((physname[0]=='_' && physname[1]=='_' &&
+ (isdigit(physname[2])
+ || physname[2]=='Q'
+ || physname[2]=='t'))
+ || (strncmp(physname, "__ct__", 6) == 0));
+
QUIT;
if (TYPE_FN_FIELD_PROTECTED (f, j))
{
if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) == 0)
{
/* Keep GDB from crashing here. */
- fprintf (stream, "<undefined type> %s;\n",
+ fprintf_unfiltered (stream, "<undefined type> %s;\n",
TYPE_FN_FIELD_PHYSNAME (f, j));
break;
}
- else if (!is_constructor)
+ else if (!is_constructor && !is_full_physname_constructor)
{
type_print (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)),
- "", stream, 0);
+ "", stream, -1);
fputs_filtered (" ", stream);
}
if (TYPE_FN_FIELD_STUB (f, j))
/* Build something we can demangle. */
mangled_name = gdb_mangle_name (type, i, j);
demangled_name =
- cplus_demangle (mangled_name,
- DMGL_ANSI | DMGL_PARAMS);
+ cplus_demangle (mangled_name,
+ DMGL_ANSI | DMGL_PARAMS);
if (demangled_name == NULL)
fprintf_filtered (stream, "<badly mangled name %s>",
- mangled_name);
- else
+ mangled_name);
+ else
{
- fprintf_filtered (stream, "%s",
- strchr (demangled_name, ':') + 2);
+ char *demangled_no_class =
+ strchr (demangled_name, ':');
+
+ if (demangled_no_class == NULL)
+ demangled_no_class = demangled_name;
+ else
+ {
+ if (*++demangled_no_class == ':')
+ ++demangled_no_class;
+ }
+ fputs_filtered (demangled_no_class, stream);
free (demangled_name);
}
free (mangled_name);
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 (" ", stream);
+ fputs_filtered (TYPE_TAG_NAME (type), stream);
+ if (show > 0)
+ fputs_filtered (" ", stream);
}
wrap_here (" ");
if (show < 0)
- fprintf_filtered (stream, "{...}");
- else
+ {
+ /* If we just printed a tag name, no need to print anything else. */
+ if (TYPE_TAG_NAME (type) == NULL)
+ fprintf_filtered (stream, "{...}");
+ }
+ else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
{
fprintf_filtered (stream, "{");
len = TYPE_NFIELDS (type);
}
else
{
- error ("Invalid type code (%d) in symbol table.", TYPE_CODE (type));
+ /* At least for dump_symtab, it is important that this not be
+ an error (). */
+ fprintf_filtered (stream, "<invalid type code %d>",
+ TYPE_CODE (type));
}
break;
}