f-typeprint.c revision 1.8
1/* Support for printing Fortran types for GDB, the GNU debugger.
2
3   Copyright (C) 1986-2019 Free Software Foundation, Inc.
4
5   Contributed by Motorola.  Adapted from the C version by Farooq Butt
6   (fmbutt@engage.sps.mot.com).
7
8   This file is part of GDB.
9
10   This program is free software; you can redistribute it and/or modify
11   it under the terms of the GNU General Public License as published by
12   the Free Software Foundation; either version 3 of the License, or
13   (at your option) any later version.
14
15   This program is distributed in the hope that it will be useful,
16   but WITHOUT ANY WARRANTY; without even the implied warranty of
17   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18   GNU General Public License for more details.
19
20   You should have received a copy of the GNU General Public License
21   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
22
23#include "defs.h"
24#include "gdb_obstack.h"
25#include "bfd.h"
26#include "symtab.h"
27#include "gdbtypes.h"
28#include "expression.h"
29#include "value.h"
30#include "gdbcore.h"
31#include "target.h"
32#include "f-lang.h"
33#include "typeprint.h"
34
35#if 0				/* Currently unused.  */
36static void f_type_print_args (struct type *, struct ui_file *);
37#endif
38
39static void f_type_print_varspec_suffix (struct type *, struct ui_file *, int,
40					 int, int, int);
41
42void f_type_print_varspec_prefix (struct type *, struct ui_file *,
43				  int, int);
44
45void f_type_print_base (struct type *, struct ui_file *, int, int);
46
47
48/* LEVEL is the depth to indent lines by.  */
49
50void
51f_print_type (struct type *type, const char *varstring, struct ui_file *stream,
52	      int show, int level, const struct type_print_options *flags)
53{
54  enum type_code code;
55
56  if (type_not_associated (type))
57    {
58      val_print_not_associated (stream);
59      return;
60    }
61
62  if (type_not_allocated (type))
63    {
64      val_print_not_allocated (stream);
65      return;
66    }
67
68  f_type_print_base (type, stream, show, level);
69  code = TYPE_CODE (type);
70  if ((varstring != NULL && *varstring != '\0')
71  /* Need a space if going to print stars or brackets;
72     but not if we will print just a type name.  */
73      || ((show > 0 || TYPE_NAME (type) == 0)
74          && (code == TYPE_CODE_PTR || code == TYPE_CODE_FUNC
75	      || code == TYPE_CODE_METHOD
76	      || code == TYPE_CODE_ARRAY
77	      || code == TYPE_CODE_REF)))
78    fputs_filtered (" ", stream);
79  f_type_print_varspec_prefix (type, stream, show, 0);
80
81  if (varstring != NULL)
82    {
83      int demangled_args;
84
85      fputs_filtered (varstring, stream);
86
87      /* For demangled function names, we have the arglist as part of the name,
88         so don't print an additional pair of ()'s.  */
89
90      demangled_args = (*varstring != '\0'
91			&& varstring[strlen (varstring) - 1] == ')');
92      f_type_print_varspec_suffix (type, stream, show, 0, demangled_args, 0);
93   }
94}
95
96/* Print any asterisks or open-parentheses needed before the
97   variable name (to describe its type).
98
99   On outermost call, pass 0 for PASSED_A_PTR.
100   On outermost call, SHOW > 0 means should ignore
101   any typename for TYPE and show its details.
102   SHOW is always zero on recursive calls.  */
103
104void
105f_type_print_varspec_prefix (struct type *type, struct ui_file *stream,
106			     int show, int passed_a_ptr)
107{
108  if (type == 0)
109    return;
110
111  if (TYPE_NAME (type) && show <= 0)
112    return;
113
114  QUIT;
115
116  switch (TYPE_CODE (type))
117    {
118    case TYPE_CODE_PTR:
119      f_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 1);
120      break;
121
122    case TYPE_CODE_FUNC:
123      f_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
124      if (passed_a_ptr)
125	fprintf_filtered (stream, "(");
126      break;
127
128    case TYPE_CODE_ARRAY:
129      f_type_print_varspec_prefix (TYPE_TARGET_TYPE (type), stream, 0, 0);
130      break;
131
132    case TYPE_CODE_UNDEF:
133    case TYPE_CODE_STRUCT:
134    case TYPE_CODE_UNION:
135    case TYPE_CODE_ENUM:
136    case TYPE_CODE_INT:
137    case TYPE_CODE_FLT:
138    case TYPE_CODE_VOID:
139    case TYPE_CODE_ERROR:
140    case TYPE_CODE_CHAR:
141    case TYPE_CODE_BOOL:
142    case TYPE_CODE_SET:
143    case TYPE_CODE_RANGE:
144    case TYPE_CODE_STRING:
145    case TYPE_CODE_METHOD:
146    case TYPE_CODE_REF:
147    case TYPE_CODE_COMPLEX:
148    case TYPE_CODE_TYPEDEF:
149      /* These types need no prefix.  They are listed here so that
150         gcc -Wall will reveal any types that haven't been handled.  */
151      break;
152    }
153}
154
155/* Print any array sizes, function arguments or close parentheses
156   needed after the variable name (to describe its type).
157   Args work like c_type_print_varspec_prefix.  */
158
159static void
160f_type_print_varspec_suffix (struct type *type, struct ui_file *stream,
161			     int show, int passed_a_ptr, int demangled_args,
162			     int arrayprint_recurse_level)
163{
164  int upper_bound, lower_bound;
165
166  /* No static variables are permitted as an error call may occur during
167     execution of this function.  */
168
169  if (type == 0)
170    return;
171
172  if (TYPE_NAME (type) && show <= 0)
173    return;
174
175  QUIT;
176
177  switch (TYPE_CODE (type))
178    {
179    case TYPE_CODE_ARRAY:
180      arrayprint_recurse_level++;
181
182      if (arrayprint_recurse_level == 1)
183	fprintf_filtered (stream, "(");
184
185      if (type_not_associated (type))
186        val_print_not_associated (stream);
187      else if (type_not_allocated (type))
188        val_print_not_allocated (stream);
189      else
190        {
191          if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_ARRAY)
192            f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
193                                        0, 0, arrayprint_recurse_level);
194
195          lower_bound = f77_get_lowerbound (type);
196          if (lower_bound != 1)	/* Not the default.  */
197            fprintf_filtered (stream, "%d:", lower_bound);
198
199          /* Make sure that, if we have an assumed size array, we
200             print out a warning and print the upperbound as '*'.  */
201
202          if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
203            fprintf_filtered (stream, "*");
204          else
205            {
206              upper_bound = f77_get_upperbound (type);
207              fprintf_filtered (stream, "%d", upper_bound);
208            }
209
210          if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_ARRAY)
211            f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
212                                        0, 0, arrayprint_recurse_level);
213        }
214      if (arrayprint_recurse_level == 1)
215	fprintf_filtered (stream, ")");
216      else
217	fprintf_filtered (stream, ",");
218      arrayprint_recurse_level--;
219      break;
220
221    case TYPE_CODE_PTR:
222    case TYPE_CODE_REF:
223      f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0, 1, 0,
224				   arrayprint_recurse_level);
225      fprintf_filtered (stream, ")");
226      break;
227
228    case TYPE_CODE_FUNC:
229      f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type), stream, 0,
230				   passed_a_ptr, 0, arrayprint_recurse_level);
231      if (passed_a_ptr)
232	fprintf_filtered (stream, ")");
233
234      fprintf_filtered (stream, "()");
235      break;
236
237    case TYPE_CODE_UNDEF:
238    case TYPE_CODE_STRUCT:
239    case TYPE_CODE_UNION:
240    case TYPE_CODE_ENUM:
241    case TYPE_CODE_INT:
242    case TYPE_CODE_FLT:
243    case TYPE_CODE_VOID:
244    case TYPE_CODE_ERROR:
245    case TYPE_CODE_CHAR:
246    case TYPE_CODE_BOOL:
247    case TYPE_CODE_SET:
248    case TYPE_CODE_RANGE:
249    case TYPE_CODE_STRING:
250    case TYPE_CODE_METHOD:
251    case TYPE_CODE_COMPLEX:
252    case TYPE_CODE_TYPEDEF:
253      /* These types do not need a suffix.  They are listed so that
254         gcc -Wall will report types that may not have been considered.  */
255      break;
256    }
257}
258
259/* Print the name of the type (or the ultimate pointer target,
260   function value or array element), or the description of a
261   structure or union.
262
263   SHOW nonzero means don't print this type as just its name;
264   show its real definition even if it has a name.
265   SHOW zero means print just typename or struct tag if there is one
266   SHOW negative means abbreviate structure elements.
267   SHOW is decremented for printing of structure elements.
268
269   LEVEL is the depth to indent by.
270   We increase it for some recursive calls.  */
271
272void
273f_type_print_base (struct type *type, struct ui_file *stream, int show,
274		   int level)
275{
276  int upper_bound;
277  int index;
278
279  QUIT;
280
281  wrap_here ("    ");
282  if (type == NULL)
283    {
284      fputs_filtered ("<type unknown>", stream);
285      return;
286    }
287
288  /* When SHOW is zero or less, and there is a valid type name, then always
289     just print the type name directly from the type.  */
290
291  if ((show <= 0) && (TYPE_NAME (type) != NULL))
292    {
293      const char *prefix = "";
294      if (TYPE_CODE (type) == TYPE_CODE_UNION)
295	prefix = "Type, C_Union :: ";
296      else if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
297	prefix = "Type ";
298      fprintfi_filtered (level, stream, "%s%s", prefix, TYPE_NAME (type));
299      return;
300    }
301
302  if (TYPE_CODE (type) != TYPE_CODE_TYPEDEF)
303    type = check_typedef (type);
304
305  switch (TYPE_CODE (type))
306    {
307    case TYPE_CODE_TYPEDEF:
308      f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level);
309      break;
310
311    case TYPE_CODE_ARRAY:
312      f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
313      break;
314    case TYPE_CODE_FUNC:
315      if (TYPE_TARGET_TYPE (type) == NULL)
316	type_print_unknown_return_type (stream);
317      else
318	f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
319      break;
320
321    case TYPE_CODE_PTR:
322      fprintfi_filtered (level, stream, "PTR TO -> ( ");
323      f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0);
324      break;
325
326    case TYPE_CODE_REF:
327      fprintfi_filtered (level, stream, "REF TO -> ( ");
328      f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, 0);
329      break;
330
331    case TYPE_CODE_VOID:
332      fprintfi_filtered (level, stream, "VOID");
333      break;
334
335    case TYPE_CODE_UNDEF:
336      fprintfi_filtered (level, stream, "struct <unknown>");
337      break;
338
339    case TYPE_CODE_ERROR:
340      fprintfi_filtered (level, stream, "%s", TYPE_ERROR_NAME (type));
341      break;
342
343    case TYPE_CODE_RANGE:
344      /* This should not occur.  */
345      fprintfi_filtered (level, stream, "<range type>");
346      break;
347
348    case TYPE_CODE_CHAR:
349    case TYPE_CODE_INT:
350      /* There may be some character types that attempt to come
351         through as TYPE_CODE_INT since dbxstclass.h is so
352         C-oriented, we must change these to "character" from "char".  */
353
354      if (strcmp (TYPE_NAME (type), "char") == 0)
355	fprintfi_filtered (level, stream, "character");
356      else
357	goto default_case;
358      break;
359
360    case TYPE_CODE_STRING:
361      /* Strings may have dynamic upperbounds (lengths) like arrays.  */
362
363      if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
364	fprintfi_filtered (level, stream, "character*(*)");
365      else
366	{
367	  upper_bound = f77_get_upperbound (type);
368	  fprintf_filtered (stream, "character*%d", upper_bound);
369	}
370      break;
371
372    case TYPE_CODE_STRUCT:
373    case TYPE_CODE_UNION:
374      if (TYPE_CODE (type) == TYPE_CODE_UNION)
375	fprintfi_filtered (level, stream, "Type, C_Union :: ");
376      else
377	fprintfi_filtered (level, stream, "Type ");
378      fputs_filtered (TYPE_NAME (type), stream);
379      /* According to the definition,
380         we only print structure elements in case show > 0.  */
381      if (show > 0)
382	{
383	  fputs_filtered ("\n", stream);
384	  for (index = 0; index < TYPE_NFIELDS (type); index++)
385	    {
386	      f_type_print_base (TYPE_FIELD_TYPE (type, index), stream,
387				 show - 1, level + 4);
388	      fputs_filtered (" :: ", stream);
389	      fputs_filtered (TYPE_FIELD_NAME (type, index), stream);
390	      f_type_print_varspec_suffix (TYPE_FIELD_TYPE (type, index),
391					   stream, show - 1, 0, 0, 0);
392	      fputs_filtered ("\n", stream);
393	    }
394	  fprintfi_filtered (level, stream, "End Type ");
395	  fputs_filtered (TYPE_NAME (type), stream);
396	}
397      break;
398
399    case TYPE_CODE_MODULE:
400      fprintfi_filtered (level, stream, "module %s", TYPE_NAME (type));
401      break;
402
403    default_case:
404    default:
405      /* Handle types not explicitly handled by the other cases,
406         such as fundamental types.  For these, just print whatever
407         the type name is, as recorded in the type itself.  If there
408         is no type name, then complain.  */
409      if (TYPE_NAME (type) != NULL)
410	fprintfi_filtered (level, stream, "%s", TYPE_NAME (type));
411      else
412	error (_("Invalid type code (%d) in symbol table."), TYPE_CODE (type));
413      break;
414    }
415}
416