X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ff-typeprint.c;h=9d9a1f30b9fa9a19feed68563b8b9d7082695ee6;hb=981a3fb3594dddae266b7a5014c3001727200d7b;hp=ad988d23dd20081d8ff782c7405cc9440be31f38;hpb=0963b4bd458eab010b3b19c9ffd8eb790f2cd06c;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/f-typeprint.c b/gdb/f-typeprint.c index ad988d23dd..9d9a1f30b9 100644 --- a/gdb/f-typeprint.c +++ b/gdb/f-typeprint.c @@ -1,8 +1,6 @@ /* Support for printing Fortran types for GDB, the GNU debugger. - Copyright (C) 1986, 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1998, 2000, - 2001, 2002, 2003, 2006, 2007, 2008, 2009, 2010, 2011 - Free Software Foundation, Inc. + Copyright (C) 1986-2017 Free Software Foundation, Inc. Contributed by Motorola. Adapted from the C version by Farooq Butt (fmbutt@engage.sps.mot.com). @@ -32,9 +30,7 @@ #include "gdbcore.h" #include "target.h" #include "f-lang.h" - -#include "gdb_string.h" -#include +#include "typeprint.h" #if 0 /* Currently unused. */ static void f_type_print_args (struct type *, struct ui_file *); @@ -53,10 +49,21 @@ void f_type_print_base (struct type *, struct ui_file *, int, int); void f_print_type (struct type *type, const char *varstring, struct ui_file *stream, - int show, int level) + int show, int level, const struct type_print_options *flags) { enum type_code code; - int demangled_args; + + if (type_not_associated (type)) + { + val_print_not_associated (stream); + return; + } + + if (type_not_allocated (type)) + { + val_print_not_allocated (stream); + return; + } f_type_print_base (type, stream, show, level); code = TYPE_CODE (type); @@ -73,12 +80,15 @@ f_print_type (struct type *type, const char *varstring, struct ui_file *stream, if (varstring != NULL) { + int demangled_args; + fputs_filtered (varstring, stream); /* 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 = (*varstring != '\0' + && varstring[strlen (varstring) - 1] == ')'); f_type_print_varspec_suffix (type, stream, show, 0, demangled_args, 0); } } @@ -132,7 +142,6 @@ f_type_print_varspec_prefix (struct type *type, struct ui_file *stream, case TYPE_CODE_SET: case TYPE_CODE_RANGE: case TYPE_CODE_STRING: - case TYPE_CODE_BITSTRING: case TYPE_CODE_METHOD: case TYPE_CODE_REF: case TYPE_CODE_COMPLEX: @@ -173,28 +182,35 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream, if (arrayprint_recurse_level == 1) fprintf_filtered (stream, "("); - if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_ARRAY) - f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0, - arrayprint_recurse_level); - - lower_bound = f77_get_lowerbound (type); - if (lower_bound != 1) /* Not the default. */ - fprintf_filtered (stream, "%d:", lower_bound); - - /* Make sure that, if we have an assumed size array, we - print out a warning and print the upperbound as '*'. */ - - if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type)) - fprintf_filtered (stream, "*"); + if (type_not_associated (type)) + val_print_not_associated (stream); + else if (type_not_allocated (type)) + val_print_not_allocated (stream); else - { - upper_bound = f77_get_upperbound (type); - fprintf_filtered (stream, "%d", upper_bound); - } - - if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_ARRAY) - f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0, - arrayprint_recurse_level); + { + if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_ARRAY) + f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, + 0, 0, arrayprint_recurse_level); + + lower_bound = f77_get_lowerbound (type); + if (lower_bound != 1) /* Not the default. */ + fprintf_filtered (stream, "%d:", lower_bound); + + /* Make sure that, if we have an assumed size array, we + print out a warning and print the upperbound as '*'. */ + + if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type)) + fprintf_filtered (stream, "*"); + else + { + upper_bound = f77_get_upperbound (type); + fprintf_filtered (stream, "%d", upper_bound); + } + + if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_ARRAY) + f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, + 0, 0, arrayprint_recurse_level); + } if (arrayprint_recurse_level == 1) fprintf_filtered (stream, ")"); else @@ -231,7 +247,6 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream, case TYPE_CODE_SET: case TYPE_CODE_RANGE: case TYPE_CODE_STRING: - case TYPE_CODE_BITSTRING: case TYPE_CODE_METHOD: case TYPE_CODE_COMPLEX: case TYPE_CODE_TYPEDEF: @@ -275,12 +290,12 @@ f_type_print_base (struct type *type, struct ui_file *stream, int show, if ((show <= 0) && (TYPE_NAME (type) != NULL)) { - fputs_filtered (TYPE_NAME (type), stream); + fprintfi_filtered (level, stream, "%s", TYPE_NAME (type)); return; } if (TYPE_CODE (type) != TYPE_CODE_TYPEDEF) - CHECK_TYPEDEF (type); + type = check_typedef (type); switch (TYPE_CODE (type)) { @@ -289,18 +304,23 @@ f_type_print_base (struct type *type, struct ui_file *stream, int show, break; case TYPE_CODE_ARRAY: - case TYPE_CODE_FUNC: f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level); break; + case TYPE_CODE_FUNC: + if (TYPE_TARGET_TYPE (type) == NULL) + type_print_unknown_return_type (stream); + else + f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level); + break; case TYPE_CODE_PTR: - fprintf_filtered (stream, "PTR TO -> ( "); - f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level); + fprintfi_filtered (level, stream, "PTR TO -> ( "); + f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0); break; case TYPE_CODE_REF: - fprintf_filtered (stream, "REF TO -> ( "); - f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level); + fprintfi_filtered (level, stream, "REF TO -> ( "); + f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0); break; case TYPE_CODE_VOID: @@ -321,10 +341,6 @@ f_type_print_base (struct type *type, struct ui_file *stream, int show, break; case TYPE_CODE_CHAR: - /* Override name "char" and make it "character". */ - fprintfi_filtered (level, stream, "character"); - break; - case TYPE_CODE_INT: /* There may be some character types that attempt to come through as TYPE_CODE_INT since dbxstclass.h is so @@ -355,19 +371,24 @@ f_type_print_base (struct type *type, struct ui_file *stream, int show, else fprintfi_filtered (level, stream, "Type "); fputs_filtered (TYPE_TAG_NAME (type), stream); - fputs_filtered ("\n", stream); - for (index = 0; index < TYPE_NFIELDS (type); index++) + /* According to the definition, + we only print structure elements in case show > 0. */ + if (show > 0) { - f_type_print_base (TYPE_FIELD_TYPE (type, index), stream, show, - level + 4); - fputs_filtered (" :: ", stream); - fputs_filtered (TYPE_FIELD_NAME (type, index), stream); - f_type_print_varspec_suffix (TYPE_FIELD_TYPE (type, index), - stream, 0, 0, 0, 0); fputs_filtered ("\n", stream); - } - fprintfi_filtered (level, stream, "End Type "); - fputs_filtered (TYPE_TAG_NAME (type), stream); + for (index = 0; index < TYPE_NFIELDS (type); index++) + { + f_type_print_base (TYPE_FIELD_TYPE (type, index), stream, + show - 1, level + 4); + fputs_filtered (" :: ", stream); + fputs_filtered (TYPE_FIELD_NAME (type, index), stream); + f_type_print_varspec_suffix (TYPE_FIELD_TYPE (type, index), + stream, show - 1, 0, 0, 0); + fputs_filtered ("\n", stream); + } + fprintfi_filtered (level, stream, "End Type "); + fputs_filtered (TYPE_TAG_NAME (type), stream); + } break; case TYPE_CODE_MODULE: