X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Ff-typeprint.c;h=027bcdde0f91254dc577afe25b082c69a502e20c;hb=2480b6fa946bb2d2dc993b1c4a83a8e1258a75e8;hp=09bb3ebd09592cff58da26690aa9a541704cb260;hpb=8b0b198558d0fc981f129e2e3dcbe00a0f308449;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/f-typeprint.c b/gdb/f-typeprint.c index 09bb3ebd09..027bcdde0f 100644 --- a/gdb/f-typeprint.c +++ b/gdb/f-typeprint.c @@ -1,26 +1,27 @@ /* Support for printing Fortran types for GDB, the GNU debugger. - Copyright 1986, 1988, 1989, 1991, 1993, 1994 Free Software Foundation, Inc. + + Copyright (C) 1986-2019 Free Software Foundation, Inc. + Contributed by Motorola. Adapted from the C version by Farooq Butt (fmbutt@engage.sps.mot.com). -This file is part of GDB. + This file is part of GDB. -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include "defs.h" -#include "obstack.h" +#include "gdb_obstack.h" #include "bfd.h" #include "symtab.h" #include "gdbtypes.h" @@ -28,69 +29,74 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "value.h" #include "gdbcore.h" #include "target.h" -#include "command.h" -#include "gdbcmd.h" -#include "language.h" -#include "demangle.h" #include "f-lang.h" #include "typeprint.h" -#include "frame.h" /* ??? */ - -#include "gdb_string.h" -#include +#include "cli/cli-style.h" -#if 0 /* Currently unused */ -static void f_type_print_args PARAMS ((struct type *, GDB_FILE *)); +#if 0 /* Currently unused. */ +static void f_type_print_args (struct type *, struct ui_file *); #endif -static void print_equivalent_f77_float_type PARAMS ((struct type *, - GDB_FILE *)); +static void f_type_print_varspec_suffix (struct type *, struct ui_file *, int, + int, int, int, bool); -static void f_type_print_varspec_suffix PARAMS ((struct type *, GDB_FILE *, - int, int, int)); +void f_type_print_varspec_prefix (struct type *, struct ui_file *, + int, int); -void f_type_print_varspec_prefix PARAMS ((struct type *, GDB_FILE *, - int, int)); +void f_type_print_base (struct type *, struct ui_file *, int, int); + -void f_type_print_base PARAMS ((struct type *, GDB_FILE *, int, int)); +/* See documentation in f-lang.h. */ + +void +f_print_typedef (struct type *type, struct symbol *new_symbol, + struct ui_file *stream) +{ + type = check_typedef (type); + f_print_type (type, "", stream, 0, 0, &type_print_raw_options); +} - /* LEVEL is the depth to indent lines by. */ void -f_print_type (type, varstring, stream, show, level) - struct type *type; - char *varstring; - GDB_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) { - register enum type_code code; - int demangled_args; + enum type_code code; 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_MEMBER - || code == TYPE_CODE_REF))) + /* 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_FUNC + || code == TYPE_CODE_METHOD + || code == TYPE_CODE_ARRAY + || ((code == TYPE_CODE_PTR + || code == TYPE_CODE_REF) + && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC + || (TYPE_CODE (TYPE_TARGET_TYPE (type)) + == TYPE_CODE_METHOD) + || (TYPE_CODE (TYPE_TARGET_TYPE (type)) + == TYPE_CODE_ARRAY)))))) fputs_filtered (" ", stream); f_type_print_varspec_prefix (type, stream, show, 0); - fputs_filtered (varstring, 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 */ + /* 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] == ')'; - f_type_print_varspec_suffix (type, stream, show, 0, demangled_args); + demangled_args = (*varstring != '\0' + && varstring[strlen (varstring) - 1] == ')'); + f_type_print_varspec_suffix (type, stream, show, 0, demangled_args, 0, false); + } } /* Print any asterisks or open-parentheses needed before the @@ -102,11 +108,8 @@ f_print_type (type, varstring, stream, show, level) SHOW is always zero on recursive calls. */ void -f_type_print_varspec_prefix (type, stream, show, passed_a_ptr) - struct type *type; - GDB_FILE *stream; - int show; - int passed_a_ptr; +f_type_print_varspec_prefix (struct type *type, struct ui_file *stream, + int show, int passed_a_ptr) { if (type == 0) return; @@ -145,72 +148,32 @@ f_type_print_varspec_prefix (type, stream, show, passed_a_ptr) case TYPE_CODE_SET: case TYPE_CODE_RANGE: case TYPE_CODE_STRING: - case TYPE_CODE_BITSTRING: case TYPE_CODE_METHOD: - case TYPE_CODE_MEMBER: case TYPE_CODE_REF: case TYPE_CODE_COMPLEX: case TYPE_CODE_TYPEDEF: /* These types need no prefix. They are listed here so that - gcc -Wall will reveal any types that haven't been handled. */ + gcc -Wall will reveal any types that haven't been handled. */ break; } } -#if 0 /* Currently unused */ - -static void -f_type_print_args (type, stream) - struct type *type; - GDB_FILE *stream; -{ - int i; - struct type **args; - - fprintf_filtered (stream, "("); - args = TYPE_ARG_TYPES (type); - if (args != NULL) - { - if (args[1] == NULL) - { - fprintf_filtered (stream, "..."); - } - else - { - for (i = 1; args[i] != NULL && args[i]->code != TYPE_CODE_VOID; i++) - { - f_print_type (args[i], "", stream, -1, 0); - if (args[i+1] == NULL) - fprintf_filtered (stream, "..."); - else if (args[i+1]->code != TYPE_CODE_VOID) - { - fprintf_filtered (stream, ","); - wrap_here (" "); - } - } - } - } - fprintf_filtered (stream, ")"); -} - -#endif /* 0 */ - /* Print any array sizes, function arguments or close parentheses needed after the variable name (to describe its type). - Args work like c_type_print_varspec_prefix. */ + Args work like c_type_print_varspec_prefix. + + PRINT_RANK_ONLY is true when TYPE is an array which should be printed + without the upper and lower bounds being specified, this will occur + when the array is not allocated or not associated and so there are no + known upper or lower bounds. */ static void -f_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args) - struct type *type; - GDB_FILE *stream; - int show; - int passed_a_ptr; - int demangled_args; +f_type_print_varspec_suffix (struct type *type, struct ui_file *stream, + int show, int passed_a_ptr, int demangled_args, + int arrayprint_recurse_level, bool print_rank_only) { - int upper_bound, lower_bound; - int lower_bound_was_default = 0; - 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; @@ -226,65 +189,94 @@ f_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args) arrayprint_recurse_level++; 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); - - retcode = f77_get_dynamic_lowerbound (type,&lower_bound); + fprintf_filtered (stream, "("); - lower_bound_was_default = 0; + if (type_not_associated (type)) + print_rank_only = true; + else if (type_not_allocated (type)) + print_rank_only = true; + else if ((TYPE_ASSOCIATED_PROP (type) + && PROP_CONST != TYPE_DYN_PROP_KIND (TYPE_ASSOCIATED_PROP (type))) + || (TYPE_ALLOCATED_PROP (type) + && PROP_CONST != TYPE_DYN_PROP_KIND (TYPE_ALLOCATED_PROP (type))) + || (TYPE_DATA_LOCATION (type) + && PROP_CONST != TYPE_DYN_PROP_KIND (TYPE_DATA_LOCATION (type)))) + { + /* This case exist when we ptype a typename which has the dynamic + properties but cannot be resolved as there is no object. */ + print_rank_only = true; + } - if (retcode == BOUND_FETCH_ERROR) - fprintf_filtered (stream,"???"); - else - if (lower_bound == 1) /* The default */ - lower_bound_was_default = 1; - else - fprintf_filtered (stream,"%d",lower_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, + print_rank_only); - if (lower_bound_was_default) - lower_bound_was_default = 0; + if (print_rank_only) + fprintf_filtered (stream, ":"); else - fprintf_filtered(stream,":"); + { + LONGEST lower_bound = f77_get_lowerbound (type); + if (lower_bound != 1) /* Not the default. */ + fprintf_filtered (stream, "%s:", plongest (lower_bound)); - /* Make sure that, if we have an assumed size array, we - print out a warning and print the upperbound as '*' */ + /* 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_TYPE(type) == BOUND_CANNOT_BE_DETERMINED) - fprintf_filtered (stream, "*"); - else - { - retcode = f77_get_dynamic_upperbound(type,&upper_bound); + if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type)) + fprintf_filtered (stream, "*"); + else + { + LONGEST upper_bound = f77_get_upperbound (type); - if (retcode == BOUND_FETCH_ERROR) - fprintf_filtered(stream,"???"); - else - fprintf_filtered(stream,"%d",upper_bound); - } + fputs_filtered (plongest (upper_bound), stream); + } + } if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_ARRAY) - f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 0, 0); + f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, + 0, 0, arrayprint_recurse_level, + print_rank_only); + if (arrayprint_recurse_level == 1) fprintf_filtered (stream, ")"); else - fprintf_filtered(stream,","); + fprintf_filtered (stream, ","); arrayprint_recurse_level--; break; case TYPE_CODE_PTR: case TYPE_CODE_REF: - f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 1, 0); - fprintf_filtered(stream,")"); + f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 1, 0, + arrayprint_recurse_level, false); + fprintf_filtered (stream, " )"); break; case TYPE_CODE_FUNC: - f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, - passed_a_ptr, 0); - if (passed_a_ptr) + { + int i, nfields = TYPE_NFIELDS (type); + + f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, + passed_a_ptr, 0, + arrayprint_recurse_level, false); + if (passed_a_ptr) + fprintf_filtered (stream, ") "); + fprintf_filtered (stream, "("); + if (nfields == 0 && TYPE_PROTOTYPED (type)) + f_print_type (builtin_f_type (get_type_arch (type))->builtin_void, + "", stream, -1, 0, 0); + else + for (i = 0; i < nfields; i++) + { + if (i > 0) + { + fputs_filtered (", ", stream); + wrap_here (" "); + } + f_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0, 0); + } fprintf_filtered (stream, ")"); - - fprintf_filtered (stream, "()"); + } break; case TYPE_CODE_UNDEF: @@ -300,29 +292,15 @@ f_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args) case TYPE_CODE_SET: case TYPE_CODE_RANGE: case TYPE_CODE_STRING: - case TYPE_CODE_BITSTRING: case TYPE_CODE_METHOD: - case TYPE_CODE_MEMBER: case TYPE_CODE_COMPLEX: case TYPE_CODE_TYPEDEF: /* These types do not need a suffix. They are listed so that - gcc -Wall will report types that may not have been considered. */ + gcc -Wall will report types that may not have been considered. */ break; } } -static void -print_equivalent_f77_float_type (type, stream) - struct type *type; - GDB_FILE *stream; -{ - /* Override type name "float" and make it the - appropriate real. XLC stupidly outputs -12 as a type - for real when it really should be outputting -18 */ - - fprintf_filtered (stream, "real*%d", TYPE_LENGTH (type)); -} - /* Print the name of the type (or the ultimate pointer target, function value or array element), or the description of a structure or union. @@ -337,38 +315,36 @@ print_equivalent_f77_float_type (type, stream) We increase it for some recursive calls. */ void -f_type_print_base (type, stream, show, level) - struct type *type; - GDB_FILE *stream; - int show; - int level; +f_type_print_base (struct type *type, struct ui_file *stream, int show, + int level) { - int retcode; - int upper_bound; + int index; QUIT; wrap_here (" "); if (type == NULL) { - fputs_filtered ("", stream); + fputs_styled ("", metadata_style.style (), stream); return; } /* 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)) { - if (TYPE_CODE (type) == TYPE_CODE_FLT) - print_equivalent_f77_float_type (type, stream); - else - fputs_filtered (TYPE_NAME (type), stream); + const char *prefix = ""; + if (TYPE_CODE (type) == TYPE_CODE_UNION) + prefix = "Type, C_Union :: "; + else if (TYPE_CODE (type) == TYPE_CODE_STRUCT) + prefix = "Type "; + fprintfi_filtered (level, stream, "%s%s", prefix, TYPE_NAME (type)); return; } if (TYPE_CODE (type) != TYPE_CODE_TYPEDEF) - CHECK_TYPEDEF (type); + type = check_typedef (type); switch (TYPE_CODE (type)) { @@ -377,82 +353,115 @@ f_type_print_base (type, stream, show, level) 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); + case TYPE_CODE_PTR: + fprintfi_filtered (level, stream, "PTR TO -> ( "); + f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0); + break; + + case TYPE_CODE_REF: + fprintfi_filtered (level, stream, "REF TO -> ( "); + f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0); break; case TYPE_CODE_VOID: - fprintf_filtered (stream, "VOID"); + { + gdbarch *gdbarch = get_type_arch (type); + struct type *void_type = builtin_f_type (gdbarch)->builtin_void; + fprintfi_filtered (level, stream, "%s", TYPE_NAME (void_type)); + } break; case TYPE_CODE_UNDEF: - fprintf_filtered (stream, "struct "); + fprintfi_filtered (level, stream, "struct "); break; case TYPE_CODE_ERROR: - fprintf_filtered (stream, ""); + fprintfi_filtered (level, stream, "%s", TYPE_ERROR_NAME (type)); break; case TYPE_CODE_RANGE: - /* This should not occur */ - fprintf_filtered (stream, ""); + /* This should not occur. */ + fprintfi_filtered (level, stream, ""); break; case TYPE_CODE_CHAR: - /* Override name "char" and make it "character" */ - fprintf_filtered (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 C-oriented, we must change these to "character" from "char". */ - if (STREQ (TYPE_NAME (type), "char")) - fprintf_filtered (stream, "character"); + if (strcmp (TYPE_NAME (type), "char") == 0) + fprintfi_filtered (level, stream, "character"); else goto default_case; break; - case TYPE_CODE_COMPLEX: - fprintf_filtered (stream, "complex*%d", TYPE_LENGTH (type)); - break; - - case TYPE_CODE_FLT: - print_equivalent_f77_float_type (type, stream); - 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_TYPE (type) == BOUND_CANNOT_BE_DETERMINED) - fprintf_filtered (stream, "character*(*)"); + if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type)) + fprintfi_filtered (level, stream, "character*(*)"); else { - retcode = f77_get_dynamic_upperbound (type, &upper_bound); + LONGEST upper_bound = f77_get_upperbound (type); - if (retcode == BOUND_FETCH_ERROR) - fprintf_filtered (stream, "character*???"); - else - fprintf_filtered (stream, "character*%d", upper_bound); + fprintf_filtered (stream, "character*%s", pulongest (upper_bound)); + } + break; + + case TYPE_CODE_STRUCT: + case TYPE_CODE_UNION: + if (TYPE_CODE (type) == TYPE_CODE_UNION) + fprintfi_filtered (level, stream, "Type, C_Union :: "); + else + fprintfi_filtered (level, stream, "Type "); + fputs_filtered (TYPE_NAME (type), stream); + /* According to the definition, + we only print structure elements in case show > 0. */ + if (show > 0) + { + fputs_filtered ("\n", 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, false); + fputs_filtered ("\n", stream); + } + fprintfi_filtered (level, stream, "End Type "); + fputs_filtered (TYPE_NAME (type), stream); } break; + case TYPE_CODE_MODULE: + fprintfi_filtered (level, stream, "module %s", TYPE_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. */ + 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. */ if (TYPE_NAME (type) != NULL) - fputs_filtered (TYPE_NAME (type), stream); + fprintfi_filtered (level, stream, "%s", TYPE_NAME (type)); else - error ("Invalid type code (%d) in symbol table.", TYPE_CODE (type)); + error (_("Invalid type code (%d) in symbol table."), TYPE_CODE (type)); break; } + + if (TYPE_IS_ALLOCATABLE (type)) + fprintf_filtered (stream, ", allocatable"); }