X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ff-typeprint.c;h=32989d41a55a2dd628fde9f9a8adeadcaa3c72e5;hb=a14d1f4dfc08edc8fe92b17b36a55d89203fb89f;hp=419a8831c0fdca36ca14fca82524331a17904c18;hpb=0fb0cc7590113e9b459dfcc48dc71c9d419d9580;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/f-typeprint.c b/gdb/f-typeprint.c index 419a8831c0..32989d41a5 100644 --- a/gdb/f-typeprint.c +++ b/gdb/f-typeprint.c @@ -1,7 +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 Free Software Foundation, Inc. + Copyright (C) 1986-2016 Free Software Foundation, Inc. Contributed by Motorola. Adapted from the C version by Farooq Butt (fmbutt@engage.sps.mot.com). @@ -31,15 +30,13 @@ #include "gdbcore.h" #include "target.h" #include "f-lang.h" +#include "typeprint.h" -#include "gdb_string.h" -#include - -#if 0 /* Currently unused */ +#if 0 /* Currently unused. */ static void f_type_print_args (struct type *, struct ui_file *); #endif -static void f_type_print_varspec_suffix (struct type *, struct ui_file *, +static void f_type_print_varspec_suffix (struct type *, struct ui_file *, int, int, int, int); void f_type_print_varspec_prefix (struct type *, struct ui_file *, @@ -51,24 +48,34 @@ void f_type_print_base (struct type *, struct ui_file *, int, int); /* LEVEL is the depth to indent lines by. */ void -f_print_type (struct type *type, char *varstring, struct ui_file *stream, - int show, int level) +f_print_type (struct type *type, const char *varstring, struct ui_file *stream, + 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); if ((varstring != NULL && *varstring != '\0') - || /* Need a space if going to print stars or brackets; but not if we will print just a type name. */ - ((show > 0 || TYPE_NAME (type) == 0) - && - (code == TYPE_CODE_PTR || code == TYPE_CODE_FUNC - || code == TYPE_CODE_METHOD - || code == TYPE_CODE_ARRAY - || code == TYPE_CODE_REF))) + || ((show > 0 || TYPE_NAME (type) == 0) + && (code == TYPE_CODE_PTR || code == TYPE_CODE_FUNC + || code == TYPE_CODE_METHOD + || code == TYPE_CODE_ARRAY + || code == TYPE_CODE_REF))) fputs_filtered (" ", stream); f_type_print_varspec_prefix (type, stream, show, 0); @@ -77,10 +84,10 @@ f_print_type (struct type *type, char *varstring, struct ui_file *stream, 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 */ + so don't print an additional pair of ()'s. */ demangled_args = varstring[strlen (varstring) - 1] == ')'; - f_type_print_varspec_suffix (type, stream, show, 0, demangled_args); + f_type_print_varspec_suffix (type, stream, show, 0, demangled_args, 0); } } @@ -133,7 +140,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: @@ -150,11 +156,13 @@ f_type_print_varspec_prefix (struct type *type, struct ui_file *stream, static void f_type_print_varspec_suffix (struct type *type, struct ui_file *stream, - int show, int passed_a_ptr, int demangled_args) + int show, int passed_a_ptr, int demangled_args, + int arrayprint_recurse_level) { int upper_bound, lower_bound; - static int arrayprint_recurse_level = 0; - int retcode; + + /* No static variables are permitted as an error call may occur during + execution of this function. */ if (type == 0) return; @@ -172,26 +180,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); - - 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); + { + 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 @@ -201,13 +218,14 @@ f_type_print_varspec_suffix (struct type *type, struct ui_file *stream, case TYPE_CODE_PTR: case TYPE_CODE_REF: - f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 1, 0); + f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 1, 0, + arrayprint_recurse_level); fprintf_filtered (stream, ")"); break; case TYPE_CODE_FUNC: f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, - passed_a_ptr, 0); + passed_a_ptr, 0, arrayprint_recurse_level); if (passed_a_ptr) fprintf_filtered (stream, ")"); @@ -227,7 +245,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: @@ -254,9 +271,7 @@ void f_type_print_base (struct type *type, struct ui_file *stream, int show, int level) { - int retcode; int upper_bound; - int index; QUIT; @@ -269,7 +284,7 @@ f_type_print_base (struct type *type, struct ui_file *stream, int show, } /* 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 ((show <= 0) && (TYPE_NAME (type) != NULL)) { @@ -278,7 +293,7 @@ f_type_print_base (struct type *type, struct ui_file *stream, int show, } if (TYPE_CODE (type) != TYPE_CODE_TYPEDEF) - CHECK_TYPEDEF (type); + type = check_typedef (type); switch (TYPE_CODE (type)) { @@ -310,19 +325,15 @@ f_type_print_base (struct type *type, struct ui_file *stream, int show, break; case TYPE_CODE_ERROR: - fprintfi_filtered (level, stream, ""); + fprintfi_filtered (level, stream, "%s", TYPE_ERROR_NAME (type)); break; case TYPE_CODE_RANGE: - /* This should not occur */ + /* This should not occur. */ fprintfi_filtered (level, stream, ""); 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 @@ -335,7 +346,7 @@ f_type_print_base (struct type *type, struct ui_file *stream, int show, break; case TYPE_CODE_STRING: - /* Strings may have dynamic upperbounds (lengths) like arrays. */ + /* Strings may have dynamic upperbounds (lengths) like arrays. */ if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type)) fprintfi_filtered (level, stream, "character*(*)"); @@ -359,22 +370,25 @@ f_type_print_base (struct type *type, struct ui_file *stream, int show, f_type_print_base (TYPE_FIELD_TYPE (type, index), stream, show, level + 4); fputs_filtered (" :: ", stream); - fprintfi_filtered (level, stream, "%s", - TYPE_FIELD_NAME (type, index)); + fputs_filtered (TYPE_FIELD_NAME (type, index), stream); f_type_print_varspec_suffix (TYPE_FIELD_TYPE (type, index), - stream, 0, 0, 0); + stream, 0, 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: + fprintfi_filtered (level, stream, "module %s", TYPE_TAG_NAME (type)); + break; + default_case: default: /* Handle types not explicitly handled by the other cases, such as fundamental types. For these, just print whatever the type name is, as recorded in the type itself. If there - is no type name, then complain. */ + is no type name, then complain. */ if (TYPE_NAME (type) != NULL) fprintfi_filtered (level, stream, "%s", TYPE_NAME (type)); else