f-typeprint.c revision 1.1.1.6
1/* Support for printing Fortran types for GDB, the GNU debugger.
2
3   Copyright (C) 1986-2017 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      fprintfi_filtered (level, stream, "%s", TYPE_NAME (type));
294      return;
295    }
296
297  if (TYPE_CODE (type) != TYPE_CODE_TYPEDEF)
298    type = check_typedef (type);
299
300  switch (TYPE_CODE (type))
301    {
302    case TYPE_CODE_TYPEDEF:
303      f_type_print_base (TYPE_TARGET_TYPE (type), stream, 0, level);
304      break;
305
306    case TYPE_CODE_ARRAY:
307    case TYPE_CODE_FUNC:
308      f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
309      break;
310
311    case TYPE_CODE_PTR:
312      fprintf_filtered (stream, "PTR TO -> ( ");
313      f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
314      break;
315
316    case TYPE_CODE_REF:
317      fprintf_filtered (stream, "REF TO -> ( ");
318      f_type_print_base (TYPE_TARGET_TYPE (type), stream, show, level);
319      break;
320
321    case TYPE_CODE_VOID:
322      fprintfi_filtered (level, stream, "VOID");
323      break;
324
325    case TYPE_CODE_UNDEF:
326      fprintfi_filtered (level, stream, "struct <unknown>");
327      break;
328
329    case TYPE_CODE_ERROR:
330      fprintfi_filtered (level, stream, "%s", TYPE_ERROR_NAME (type));
331      break;
332
333    case TYPE_CODE_RANGE:
334      /* This should not occur.  */
335      fprintfi_filtered (level, stream, "<range type>");
336      break;
337
338    case TYPE_CODE_CHAR:
339    case TYPE_CODE_INT:
340      /* There may be some character types that attempt to come
341         through as TYPE_CODE_INT since dbxstclass.h is so
342         C-oriented, we must change these to "character" from "char".  */
343
344      if (strcmp (TYPE_NAME (type), "char") == 0)
345	fprintfi_filtered (level, stream, "character");
346      else
347	goto default_case;
348      break;
349
350    case TYPE_CODE_STRING:
351      /* Strings may have dynamic upperbounds (lengths) like arrays.  */
352
353      if (TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED (type))
354	fprintfi_filtered (level, stream, "character*(*)");
355      else
356	{
357	  upper_bound = f77_get_upperbound (type);
358	  fprintf_filtered (stream, "character*%d", upper_bound);
359	}
360      break;
361
362    case TYPE_CODE_STRUCT:
363    case TYPE_CODE_UNION:
364      if (TYPE_CODE (type) == TYPE_CODE_UNION)
365	fprintfi_filtered (level, stream, "Type, C_Union :: ");
366      else
367	fprintfi_filtered (level, stream, "Type ");
368      fputs_filtered (TYPE_TAG_NAME (type), stream);
369      /* According to the definition,
370         we only print structure elements in case show > 0.  */
371      if (show > 0)
372	{
373	  fputs_filtered ("\n", stream);
374	  for (index = 0; index < TYPE_NFIELDS (type); index++)
375	    {
376	      f_type_print_base (TYPE_FIELD_TYPE (type, index), stream,
377				 show - 1, level + 4);
378	      fputs_filtered (" :: ", stream);
379	      fputs_filtered (TYPE_FIELD_NAME (type, index), stream);
380	      f_type_print_varspec_suffix (TYPE_FIELD_TYPE (type, index),
381					   stream, show - 1, 0, 0, 0);
382	      fputs_filtered ("\n", stream);
383	    }
384	  fprintfi_filtered (level, stream, "End Type ");
385	  fputs_filtered (TYPE_TAG_NAME (type), stream);
386	}
387      break;
388
389    case TYPE_CODE_MODULE:
390      fprintfi_filtered (level, stream, "module %s", TYPE_TAG_NAME (type));
391      break;
392
393    default_case:
394    default:
395      /* Handle types not explicitly handled by the other cases,
396         such as fundamental types.  For these, just print whatever
397         the type name is, as recorded in the type itself.  If there
398         is no type name, then complain.  */
399      if (TYPE_NAME (type) != NULL)
400	fprintfi_filtered (level, stream, "%s", TYPE_NAME (type));
401      else
402	error (_("Invalid type code (%d) in symbol table."), TYPE_CODE (type));
403      break;
404    }
405}
406