X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/72cd0384f2eb86970fa0b0415571c23867e5940d..9ab10a5bc7798d43f669d405c91ef3a1db8423d6:/gdb/c-typeprint.c diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c index c51e6078b0..9654c47950 100644 --- a/gdb/c-typeprint.c +++ b/gdb/c-typeprint.c @@ -39,19 +39,19 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ extern int demangle; /* whether to print C++ syms raw or source-form */ 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)); /* Print a description of a type in the format of a @@ -62,7 +62,7 @@ void c_typedef_print (type, new, stream) struct type *type; struct symbol *new; - FILE *stream; + GDB_FILE *stream; { switch (current_language->la_language) { @@ -104,7 +104,7 @@ void c_print_type (type, varstring, stream, show, level) struct type *type; char *varstring; - FILE *stream; + GDB_FILE *stream; int show; int level; { @@ -145,7 +145,7 @@ cp_type_print_method_args (args, prefix, varstring, staticp, stream) char *prefix; char *varstring; int staticp; - FILE *stream; + GDB_FILE *stream; { int i; @@ -199,7 +199,7 @@ cp_type_print_method_args (args, prefix, varstring, staticp, stream) static void cp_type_print_derivation_info (stream, type) - FILE *stream; + GDB_FILE *stream; struct type *type; { char *name; @@ -231,7 +231,7 @@ cp_type_print_derivation_info (stream, type) 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; { @@ -266,7 +266,7 @@ c_type_print_varspec_prefix (type, stream, show, 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) { @@ -316,7 +316,7 @@ c_type_print_varspec_prefix (type, stream, show, passed_a_ptr) static void c_type_print_args (type, stream) struct type *type; - FILE *stream; + GDB_FILE *stream; { int i; struct type **args; @@ -358,7 +358,7 @@ c_type_print_args (type, stream) 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; @@ -409,12 +409,12 @@ c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args) 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, "()"); + c_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, + passed_a_ptr, 0); break; case TYPE_CODE_UNDEF: @@ -443,12 +443,12 @@ c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args) SHOW positive means print details about the type (e.g. enum values), and print structure elements passing SHOW - 1 for show. - SHOW zero means just print the type name or struct tag if there is one. + 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 negative means the same things as SHOW zero. The difference is that - zero is used for printing structure elements and -1 is used for the - "whatis" command. But I don't see any need to distinguish. + 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 number of spaces to indent by. We increase it for some recursive calls. */ @@ -456,7 +456,7 @@ c_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args) void c_type_print_base (type, stream, show, level) struct type *type; - FILE *stream; + GDB_FILE *stream; int show; int level; { @@ -488,6 +488,8 @@ c_type_print_base (type, stream, show, level) return; } + check_stub_type (type); + switch (TYPE_CODE (type)) { case TYPE_CODE_ARRAY: @@ -521,16 +523,14 @@ c_type_print_base (type, stream, show, level) fputs_filtered (" ", stream); } wrap_here (" "); - if (show <= 0) + 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 if (show > 0) + else if (show > 0 || TYPE_TAG_NAME (type) == NULL) { - check_stub_type (type); - cp_type_print_derivation_info (stream, type); fprintf_filtered (stream, "{\n"); @@ -665,7 +665,7 @@ c_type_print_base (type, stream, show, level) if (TYPE_TARGET_TYPE (TYPE_FN_FIELD_TYPE (f, j)) == 0) { /* Keep GDB from crashing here. */ - fprintf (stream, " %s;\n", + fprintf_unfiltered (stream, " %s;\n", TYPE_FN_FIELD_PHYSNAME (f, j)); break; } @@ -680,15 +680,24 @@ c_type_print_base (type, stream, show, level) /* 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, "", - 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); @@ -721,13 +730,13 @@ c_type_print_base (type, stream, show, level) } wrap_here (" "); - if (show <= 0) + 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 if (show > 0) + else if (show > 0 || TYPE_TAG_NAME (type) == NULL) { fprintf_filtered (stream, "{"); len = TYPE_NFIELDS (type);