1 /* Support for printing Fortran types for GDB, the GNU debugger.
3 Copyright (C) 1986-2021 Free Software Foundation, Inc.
5 Contributed by Motorola. Adapted from the C version by Farooq Butt
6 (fmbutt@engage.sps.mot.com).
8 This file is part of GDB.
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.
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.
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/>. */
24 #include "gdb_obstack.h"
28 #include "expression.h"
33 #include "typeprint.h"
34 #include "cli/cli-style.h"
39 f_language::print_typedef (struct type
*type
, struct symbol
*new_symbol
,
40 struct ui_file
*stream
) const
42 type
= check_typedef (type
);
43 print_type (type
, "", stream
, 0, 0, &type_print_raw_options
);
49 f_language::print_type (struct type
*type
, const char *varstring
,
50 struct ui_file
*stream
, int show
, int level
,
51 const struct type_print_options
*flags
) const
55 f_type_print_base (type
, stream
, show
, level
);
57 if ((varstring
!= NULL
&& *varstring
!= '\0')
58 /* Need a space if going to print stars or brackets; but not if we
59 will print just a type name. */
61 || type
->name () == 0)
62 && (code
== TYPE_CODE_FUNC
63 || code
== TYPE_CODE_METHOD
64 || code
== TYPE_CODE_ARRAY
65 || ((code
== TYPE_CODE_PTR
66 || code
== TYPE_CODE_REF
)
67 && (TYPE_TARGET_TYPE (type
)->code () == TYPE_CODE_FUNC
68 || (TYPE_TARGET_TYPE (type
)->code ()
70 || (TYPE_TARGET_TYPE (type
)->code ()
71 == TYPE_CODE_ARRAY
))))))
72 fputs_filtered (" ", stream
);
73 f_type_print_varspec_prefix (type
, stream
, show
, 0);
75 if (varstring
!= NULL
)
79 fputs_filtered (varstring
, stream
);
81 /* For demangled function names, we have the arglist as part of the name,
82 so don't print an additional pair of ()'s. */
84 demangled_args
= (*varstring
!= '\0'
85 && varstring
[strlen (varstring
) - 1] == ')');
86 f_type_print_varspec_suffix (type
, stream
, show
, 0, demangled_args
, 0, false);
93 f_language::f_type_print_varspec_prefix (struct type
*type
,
94 struct ui_file
*stream
,
95 int show
, int passed_a_ptr
) const
100 if (type
->name () && show
<= 0)
105 switch (type
->code ())
108 f_type_print_varspec_prefix (TYPE_TARGET_TYPE (type
), stream
, 0, 1);
112 f_type_print_varspec_prefix (TYPE_TARGET_TYPE (type
), stream
, 0, 0);
114 fprintf_filtered (stream
, "(");
117 case TYPE_CODE_ARRAY
:
118 f_type_print_varspec_prefix (TYPE_TARGET_TYPE (type
), stream
, 0, 0);
121 case TYPE_CODE_UNDEF
:
122 case TYPE_CODE_STRUCT
:
123 case TYPE_CODE_UNION
:
128 case TYPE_CODE_ERROR
:
132 case TYPE_CODE_RANGE
:
133 case TYPE_CODE_STRING
:
134 case TYPE_CODE_METHOD
:
136 case TYPE_CODE_COMPLEX
:
137 case TYPE_CODE_TYPEDEF
:
138 /* These types need no prefix. They are listed here so that
139 gcc -Wall will reveal any types that haven't been handled. */
147 f_language::f_type_print_varspec_suffix (struct type
*type
,
148 struct ui_file
*stream
,
149 int show
, int passed_a_ptr
,
151 int arrayprint_recurse_level
,
152 bool print_rank_only
) const
154 /* No static variables are permitted as an error call may occur during
155 execution of this function. */
160 if (type
->name () && show
<= 0)
165 switch (type
->code ())
167 case TYPE_CODE_ARRAY
:
168 arrayprint_recurse_level
++;
170 if (arrayprint_recurse_level
== 1)
171 fprintf_filtered (stream
, "(");
173 if (type_not_associated (type
))
174 print_rank_only
= true;
175 else if (type_not_allocated (type
))
176 print_rank_only
= true;
177 else if ((TYPE_ASSOCIATED_PROP (type
)
178 && PROP_CONST
!= TYPE_ASSOCIATED_PROP (type
)->kind ())
179 || (TYPE_ALLOCATED_PROP (type
)
180 && PROP_CONST
!= TYPE_ALLOCATED_PROP (type
)->kind ())
181 || (TYPE_DATA_LOCATION (type
)
182 && PROP_CONST
!= TYPE_DATA_LOCATION (type
)->kind ()))
184 /* This case exist when we ptype a typename which has the dynamic
185 properties but cannot be resolved as there is no object. */
186 print_rank_only
= true;
189 if (TYPE_TARGET_TYPE (type
)->code () == TYPE_CODE_ARRAY
)
190 f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type
), stream
, 0,
191 0, 0, arrayprint_recurse_level
,
195 fprintf_filtered (stream
, ":");
198 LONGEST lower_bound
= f77_get_lowerbound (type
);
199 if (lower_bound
!= 1) /* Not the default. */
200 fprintf_filtered (stream
, "%s:", plongest (lower_bound
));
202 /* Make sure that, if we have an assumed size array, we
203 print out a warning and print the upperbound as '*'. */
205 if (type
->bounds ()->high
.kind () == PROP_UNDEFINED
)
206 fprintf_filtered (stream
, "*");
209 LONGEST upper_bound
= f77_get_upperbound (type
);
211 fputs_filtered (plongest (upper_bound
), stream
);
215 if (TYPE_TARGET_TYPE (type
)->code () != TYPE_CODE_ARRAY
)
216 f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type
), stream
, 0,
217 0, 0, arrayprint_recurse_level
,
220 if (arrayprint_recurse_level
== 1)
221 fprintf_filtered (stream
, ")");
223 fprintf_filtered (stream
, ",");
224 arrayprint_recurse_level
--;
229 f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type
), stream
, 0, 1, 0,
230 arrayprint_recurse_level
, false);
231 fprintf_filtered (stream
, " )");
236 int i
, nfields
= type
->num_fields ();
238 f_type_print_varspec_suffix (TYPE_TARGET_TYPE (type
), stream
, 0,
240 arrayprint_recurse_level
, false);
242 fprintf_filtered (stream
, ") ");
243 fprintf_filtered (stream
, "(");
244 if (nfields
== 0 && type
->is_prototyped ())
245 print_type (builtin_f_type (get_type_arch (type
))->builtin_void
,
246 "", stream
, -1, 0, 0);
248 for (i
= 0; i
< nfields
; i
++)
252 fputs_filtered (", ", stream
);
255 print_type (type
->field (i
).type (), "", stream
, -1, 0, 0);
257 fprintf_filtered (stream
, ")");
261 case TYPE_CODE_UNDEF
:
262 case TYPE_CODE_STRUCT
:
263 case TYPE_CODE_UNION
:
268 case TYPE_CODE_ERROR
:
272 case TYPE_CODE_RANGE
:
273 case TYPE_CODE_STRING
:
274 case TYPE_CODE_METHOD
:
275 case TYPE_CODE_COMPLEX
:
276 case TYPE_CODE_TYPEDEF
:
277 /* These types do not need a suffix. They are listed so that
278 gcc -Wall will report types that may not have been considered. */
286 f_language::f_type_print_base (struct type
*type
, struct ui_file
*stream
,
287 int show
, int level
) const
296 fputs_styled ("<type unknown>", metadata_style
.style (), stream
);
300 /* When SHOW is zero or less, and there is a valid type name, then always
301 just print the type name directly from the type. */
303 if ((show
<= 0) && (type
->name () != NULL
))
305 const char *prefix
= "";
306 if (type
->code () == TYPE_CODE_UNION
)
307 prefix
= "Type, C_Union :: ";
308 else if (type
->code () == TYPE_CODE_STRUCT
)
310 fprintf_filtered (stream
, "%*s%s%s", level
, "", prefix
, type
->name ());
314 if (type
->code () != TYPE_CODE_TYPEDEF
)
315 type
= check_typedef (type
);
317 switch (type
->code ())
319 case TYPE_CODE_TYPEDEF
:
320 f_type_print_base (TYPE_TARGET_TYPE (type
), stream
, 0, level
);
323 case TYPE_CODE_ARRAY
:
324 f_type_print_base (TYPE_TARGET_TYPE (type
), stream
, show
, level
);
327 if (TYPE_TARGET_TYPE (type
) == NULL
)
328 type_print_unknown_return_type (stream
);
330 f_type_print_base (TYPE_TARGET_TYPE (type
), stream
, show
, level
);
334 fprintf_filtered (stream
, "%*sPTR TO -> ( ", level
, "");
335 f_type_print_base (TYPE_TARGET_TYPE (type
), stream
, show
, 0);
339 fprintf_filtered (stream
, "%*sREF TO -> ( ", level
, "");
340 f_type_print_base (TYPE_TARGET_TYPE (type
), stream
, show
, 0);
345 gdbarch
*gdbarch
= get_type_arch (type
);
346 struct type
*void_type
= builtin_f_type (gdbarch
)->builtin_void
;
347 fprintf_filtered (stream
, "%*s%s", level
, "", void_type
->name ());
351 case TYPE_CODE_UNDEF
:
352 fprintf_filtered (stream
, "%*sstruct <unknown>", level
, "");
355 case TYPE_CODE_ERROR
:
356 fprintf_filtered (stream
, "%*s%s", level
, "", TYPE_ERROR_NAME (type
));
359 case TYPE_CODE_RANGE
:
360 /* This should not occur. */
361 fprintf_filtered (stream
, "%*s<range type>", level
, "");
366 /* There may be some character types that attempt to come
367 through as TYPE_CODE_INT since dbxstclass.h is so
368 C-oriented, we must change these to "character" from "char". */
370 if (strcmp (type
->name (), "char") == 0)
371 fprintf_filtered (stream
, "%*scharacter", level
, "");
376 case TYPE_CODE_STRING
:
377 /* Strings may have dynamic upperbounds (lengths) like arrays. We
378 check specifically for the PROP_CONST case to indicate that the
379 dynamic type has been resolved. If we arrive here having been
380 asked to print the type of a value with a dynamic type then the
381 bounds will not have been resolved. */
383 if (type
->bounds ()->high
.kind () == PROP_CONST
)
385 LONGEST upper_bound
= f77_get_upperbound (type
);
387 fprintf_filtered (stream
, "character*%s", pulongest (upper_bound
));
390 fprintf_filtered (stream
, "%*scharacter*(*)", level
, "");
393 case TYPE_CODE_STRUCT
:
394 case TYPE_CODE_UNION
:
395 if (type
->code () == TYPE_CODE_UNION
)
396 fprintf_filtered (stream
, "%*sType, C_Union :: ", level
, "");
398 fprintf_filtered (stream
, "%*sType ", level
, "");
399 fputs_filtered (type
->name (), stream
);
400 /* According to the definition,
401 we only print structure elements in case show > 0. */
404 fputs_filtered ("\n", stream
);
405 for (index
= 0; index
< type
->num_fields (); index
++)
407 f_type_print_base (type
->field (index
).type (), stream
,
408 show
- 1, level
+ 4);
409 fputs_filtered (" :: ", stream
);
410 fputs_styled (TYPE_FIELD_NAME (type
, index
),
411 variable_name_style
.style (), stream
);
412 f_type_print_varspec_suffix (type
->field (index
).type (),
413 stream
, show
- 1, 0, 0, 0, false);
414 fputs_filtered ("\n", stream
);
416 fprintf_filtered (stream
, "%*sEnd Type ", level
, "");
417 fputs_filtered (type
->name (), stream
);
421 case TYPE_CODE_MODULE
:
422 fprintf_filtered (stream
, "%*smodule %s", level
, "", type
->name ());
427 /* Handle types not explicitly handled by the other cases,
428 such as fundamental types. For these, just print whatever
429 the type name is, as recorded in the type itself. If there
430 is no type name, then complain. */
431 if (type
->name () != NULL
)
432 fprintf_filtered (stream
, "%*s%s", level
, "", type
->name ());
434 error (_("Invalid type code (%d) in symbol table."), type
->code ());
438 if (TYPE_IS_ALLOCATABLE (type
))
439 fprintf_filtered (stream
, ", allocatable");