X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Ff-typeprint.c;h=70da8f9a516ca86f9dde8d81bdff0b1b0844ced2;hb=b6ba6518e9254bc25f88088228e93ac966ebccd1;hp=8b1e9fe88e5893522cf4662c5e38c5d223b38621;hpb=6b14af2bc66a11a8af36de4e2fa308bcf6685e88;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/f-typeprint.c b/gdb/f-typeprint.c index 8b1e9fe88e..70da8f9a51 100644 --- a/gdb/f-typeprint.c +++ b/gdb/f-typeprint.c @@ -1,23 +1,25 @@ /* Support for printing Fortran types for GDB, the GNU debugger. - Copyright 1986, 1988, 1989, 1991, 1993, 1994 Free Software Foundation, Inc. + Copyright 1986, 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1998, 2000 + 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 2 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ + 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. */ #include "defs.h" #include "obstack.h" @@ -34,32 +36,32 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "demangle.h" #include "f-lang.h" #include "typeprint.h" -#include "frame.h" /* ??? */ +#include "frame.h" /* ??? */ -#include +#include "gdb_string.h" #include -#if 0 /* Currently unused */ -static void f_type_print_args PARAMS ((struct type *, FILE *)); +#if 0 /* Currently unused */ +static void f_type_print_args (struct type *, struct ui_file *); #endif -static void f_type_print_varspec_suffix PARAMS ((struct type *, FILE *, - int, int, int)); +static void print_equivalent_f77_float_type (struct type *, + struct ui_file *); -void f_type_print_varspec_prefix PARAMS ((struct type *, FILE *, int, int)); +static void f_type_print_varspec_suffix (struct type *, struct ui_file *, + int, int, int); -void f_type_print_base PARAMS ((struct type *, FILE *, int, int)); +void f_type_print_varspec_prefix (struct type *, struct ui_file *, + int, int); +void f_type_print_base (struct type *, struct ui_file *, int, int); + /* LEVEL is the depth to indent lines by. */ void -f_print_type (type, varstring, stream, show, level) - struct type *type; - char *varstring; - FILE *stream; - int show; - int level; +f_print_type (struct type *type, char *varstring, struct ui_file *stream, + int show, int level) { register enum type_code code; int demangled_args; @@ -68,8 +70,8 @@ f_print_type (type, varstring, 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. */ + /* 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 @@ -85,7 +87,7 @@ f_print_type (type, varstring, stream, show, 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 = varstring[strlen (varstring) - 1] == ')'; f_type_print_varspec_suffix (type, stream, show, 0, demangled_args); } @@ -98,11 +100,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; - 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; @@ -146,18 +145,17 @@ f_type_print_varspec_prefix (type, stream, show, passed_a_ptr) 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 */ +#if 0 /* Currently unused */ static void -f_type_print_args (type, stream) - struct type *type; - FILE *stream; +f_type_print_args (struct type *type, struct ui_file *stream) { int i; struct type **args; @@ -175,9 +173,9 @@ f_type_print_args (type, stream) 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) + if (args[i + 1] == NULL) fprintf_filtered (stream, "..."); - else if (args[i+1]->code != TYPE_CODE_VOID) + else if (args[i + 1]->code != TYPE_CODE_VOID) { fprintf_filtered (stream, ","); wrap_here (" "); @@ -188,19 +186,15 @@ f_type_print_args (type, stream) fprintf_filtered (stream, ")"); } -#endif /* 0 */ +#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. */ static void -f_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args) - struct type *type; - 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 upper_bound, lower_bound; int lower_bound_was_default = 0; @@ -221,61 +215,60 @@ f_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args) arrayprint_recurse_level++; if (arrayprint_recurse_level == 1) - fprintf_filtered(stream,"("); + 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); + retcode = f77_get_dynamic_lowerbound (type, &lower_bound); lower_bound_was_default = 0; if (retcode == BOUND_FETCH_ERROR) - fprintf_filtered (stream,"???"); + fprintf_filtered (stream, "???"); + else if (lower_bound == 1) /* The default */ + lower_bound_was_default = 1; else - if (lower_bound == 1) /* The default */ - lower_bound_was_default = 1; - else - fprintf_filtered (stream,"%d",lower_bound); + fprintf_filtered (stream, "%d", lower_bound); if (lower_bound_was_default) lower_bound_was_default = 0; else - fprintf_filtered(stream,":"); + fprintf_filtered (stream, ":"); /* Make sure that, if we have an assumed size array, we - print out a warning and print the upperbound as '*' */ + print out a warning and print the upperbound as '*' */ - if (TYPE_ARRAY_UPPER_BOUND_TYPE(type) == BOUND_CANNOT_BE_DETERMINED) + if (TYPE_ARRAY_UPPER_BOUND_TYPE (type) == BOUND_CANNOT_BE_DETERMINED) fprintf_filtered (stream, "*"); - else - { - retcode = f77_get_dynamic_upperbound(type,&upper_bound); + else + { + retcode = f77_get_dynamic_upperbound (type, &upper_bound); - if (retcode == BOUND_FETCH_ERROR) - fprintf_filtered(stream,"???"); - else - fprintf_filtered(stream,"%d",upper_bound); - } + if (retcode == BOUND_FETCH_ERROR) + fprintf_filtered (stream, "???"); + else + 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 (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,")"); + 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); if (passed_a_ptr) fprintf_filtered (stream, ")"); @@ -299,31 +292,21 @@ f_type_print_varspec_suffix (type, stream, show, passed_a_ptr, demangled_args) 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; } } -void -print_equivalent_f77_float_type (type, stream) - struct type *type; - FILE *stream; +static void +print_equivalent_f77_float_type (struct type *type, struct ui_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 */ - switch (TYPE_LENGTH (type)) - { - case 4: - fprintf_filtered (stream, "real*4"); - break; - - case 8: - fprintf_filtered(stream,"real*8"); - break; - } + fprintf_filtered (stream, "real*%d", TYPE_LENGTH (type)); } /* Print the name of the type (or the ultimate pointer target, @@ -340,11 +323,8 @@ 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; - 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; @@ -370,19 +350,23 @@ f_type_print_base (type, stream, show, level) return; } + if (TYPE_CODE (type) != TYPE_CODE_TYPEDEF) + CHECK_TYPEDEF (type); + switch (TYPE_CODE (type)) { - case TYPE_CODE_ARRAY: - f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level); + case TYPE_CODE_TYPEDEF: + f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, 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_PTR: + case TYPE_CODE_PTR: fprintf_filtered (stream, "PTR TO -> ( "); - f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level); + f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level); break; case TYPE_CODE_VOID: @@ -419,8 +403,7 @@ f_type_print_base (type, stream, show, level) break; case TYPE_CODE_COMPLEX: - fprintf_filtered (stream, "complex*"); - fprintf_filtered (stream, "%d", TYPE_LENGTH (type)); + fprintf_filtered (stream, "complex*%d", TYPE_LENGTH (type)); break; case TYPE_CODE_FLT: @@ -446,9 +429,9 @@ f_type_print_base (type, stream, show, level) 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); else