Automatic date update in version.in
[deliverable/binutils-gdb.git] / gdb / ada-typeprint.c
CommitLineData
14f9c5c9 1/* Support for printing Ada types for GDB, the GNU debugger.
3666a048 2 Copyright (C) 1986-2021 Free Software Foundation, Inc.
14f9c5c9 3
a9762ec7 4 This file is part of GDB.
14f9c5c9 5
a9762ec7
JB
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
14f9c5c9 10
a9762ec7
JB
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
14f9c5c9 15
a9762ec7
JB
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
14f9c5c9
AS
18
19#include "defs.h"
4de283e4 20#include "bfd.h" /* Binary File Description */
4de283e4 21#include "gdbtypes.h"
4de283e4 22#include "value.h"
4de283e4
TT
23#include "c-lang.h"
24#include "cli/cli-style.h"
d55e5aa6 25#include "typeprint.h"
4de283e4
TT
26#include "target-float.h"
27#include "ada-lang.h"
28#include <ctype.h>
14f9c5c9 29
83e3a93c
PH
30static int print_selected_record_field_types (struct type *, struct type *,
31 int, int,
79d43c61
TT
32 struct ui_file *, int, int,
33 const struct type_print_options *);
aba02109 34
d2e4a39e 35static int print_record_field_types (struct type *, struct type *,
79d43c61
TT
36 struct ui_file *, int, int,
37 const struct type_print_options *);
14f9c5c9
AS
38\f
39
d2e4a39e
AS
40
41static char *name_buffer;
14f9c5c9
AS
42static int name_buffer_len;
43
4c4b4cd2
PH
44/* The (decoded) Ada name of TYPE. This value persists until the
45 next call. */
14f9c5c9 46
d2e4a39e 47static char *
4c4b4cd2 48decoded_type_name (struct type *type)
14f9c5c9
AS
49{
50 if (ada_type_name (type) == NULL)
51 return NULL;
d2e4a39e 52 else
14f9c5c9 53 {
0d5cff50 54 const char *raw_name = ada_type_name (type);
d2e4a39e 55 char *s, *q;
14f9c5c9
AS
56
57 if (name_buffer == NULL || name_buffer_len <= strlen (raw_name))
58 {
59 name_buffer_len = 16 + 2 * strlen (raw_name);
224c3ddb 60 name_buffer = (char *) xrealloc (name_buffer, name_buffer_len);
14f9c5c9
AS
61 }
62 strcpy (name_buffer, raw_name);
63
d2e4a39e 64 s = (char *) strstr (name_buffer, "___");
14f9c5c9
AS
65 if (s != NULL)
66 *s = '\0';
67
68 s = name_buffer + strlen (name_buffer) - 1;
69 while (s > name_buffer && (s[0] != '_' || s[-1] != '_'))
70 s -= 1;
71
72 if (s == name_buffer)
73 return name_buffer;
74
d2e4a39e 75 if (!islower (s[1]))
14f9c5c9
AS
76 return NULL;
77
78 for (s = q = name_buffer; *s != '\0'; q += 1)
79 {
80 if (s[0] == '_' && s[1] == '_')
81 {
d2e4a39e
AS
82 *q = '.';
83 s += 2;
14f9c5c9
AS
84 }
85 else
86 {
d2e4a39e
AS
87 *q = *s;
88 s += 1;
14f9c5c9
AS
89 }
90 }
91 *q = '\0';
92 return name_buffer;
93 }
94}
95
fb151210
JB
96/* Return nonzero if TYPE is a subrange type, and its bounds
97 are identical to the bounds of its subtype. */
98
99static int
100type_is_full_subrange_of_target_type (struct type *type)
101{
102 struct type *subtype;
103
78134374 104 if (type->code () != TYPE_CODE_RANGE)
fb151210
JB
105 return 0;
106
107 subtype = TYPE_TARGET_TYPE (type);
108 if (subtype == NULL)
109 return 0;
110
950c97d8
JB
111 if (is_dynamic_type (type))
112 return 0;
113
fb151210
JB
114 if (ada_discrete_type_low_bound (type)
115 != ada_discrete_type_low_bound (subtype))
116 return 0;
117
118 if (ada_discrete_type_high_bound (type)
119 != ada_discrete_type_high_bound (subtype))
120 return 0;
121
122 return 1;
123}
124
125/* Print TYPE on STREAM, preferably as a range if BOUNDS_PREFERED_P
126 is nonzero. */
14f9c5c9
AS
127
128static void
fb151210
JB
129print_range (struct type *type, struct ui_file *stream,
130 int bounds_prefered_p)
14f9c5c9 131{
fb151210
JB
132 if (!bounds_prefered_p)
133 {
134 /* Try stripping all TYPE_CODE_RANGE layers whose bounds
135 are identical to the bounds of their subtype. When
136 the bounds of both types match, it can allow us to
137 print a range using the name of its base type, which
138 is easier to read. For instance, we would print...
139
140 array (character) of ...
141
142 ... instead of...
143
144 array ('["00"]' .. '["ff"]') of ... */
145 while (type_is_full_subrange_of_target_type (type))
146 type = TYPE_TARGET_TYPE (type);
147 }
148
78134374 149 switch (type->code ())
14f9c5c9
AS
150 {
151 case TYPE_CODE_RANGE:
14f9c5c9 152 case TYPE_CODE_ENUM:
43bbcdc2 153 {
ded4fc8f 154 LONGEST lo = 0, hi = 0; /* init for gcc -Wall */
492d29ea 155 int got_error = 0;
e62e21fd 156
a70b8144 157 try
950c97d8
JB
158 {
159 lo = ada_discrete_type_low_bound (type);
160 hi = ada_discrete_type_high_bound (type);
161 }
230d2906 162 catch (const gdb_exception_error &e)
950c97d8
JB
163 {
164 /* This can happen when the range is dynamic. Sometimes,
165 resolving dynamic property values requires us to have
166 access to an actual object, which is not available
167 when the user is using the "ptype" command on a type.
168 Print the range as an unbounded range. */
169 fprintf_filtered (stream, "<>");
492d29ea 170 got_error = 1;
950c97d8 171 }
492d29ea
PA
172
173 if (!got_error)
950c97d8 174 {
16b9eb7b 175 ada_print_scalar (type, lo, stream);
950c97d8 176 fprintf_filtered (stream, " .. ");
16b9eb7b 177 ada_print_scalar (type, hi, stream);
950c97d8 178 }
43bbcdc2 179 }
14f9c5c9
AS
180 break;
181 default:
14f9c5c9 182 fprintf_filtered (stream, "%.*s",
7d93a1e0
SM
183 ada_name_prefix_len (type->name ()),
184 type->name ());
43bbcdc2 185 break;
14f9c5c9
AS
186 }
187}
188
189/* Print the number or discriminant bound at BOUNDS+*N on STREAM, and
4c4b4cd2 190 set *N past the bound and its delimiter, if any. */
14f9c5c9
AS
191
192static void
e6a959d6 193print_range_bound (struct type *type, const char *bounds, int *n,
d2e4a39e 194 struct ui_file *stream)
14f9c5c9
AS
195{
196 LONGEST B;
5b4ee69b 197
14f9c5c9
AS
198 if (ada_scan_number (bounds, *n, &B, n))
199 {
4c4b4cd2 200 /* STABS decodes all range types which bounds are 0 .. -1 as
dda83cd7
SM
201 unsigned integers (ie. the type code is TYPE_CODE_INT, not
202 TYPE_CODE_RANGE). Unfortunately, ada_print_scalar() relies
203 on the unsigned flag to determine whether the bound should
204 be printed as a signed or an unsigned value. This causes
205 the upper bound of the 0 .. -1 range types to be printed as
206 a very large unsigned number instead of -1.
207 To workaround this stabs deficiency, we replace the TYPE by NULL
208 to indicate default output when we detect that the bound is negative,
209 and the type is a TYPE_CODE_INT. The bound is negative when
210 'm' is the last character of the number scanned in BOUNDS. */
78134374 211 if (bounds[*n - 1] == 'm' && type->code () == TYPE_CODE_INT)
7c964f07 212 type = NULL;
14f9c5c9
AS
213 ada_print_scalar (type, B, stream);
214 if (bounds[*n] == '_')
215 *n += 2;
216 }
217 else
218 {
219 int bound_len;
e6a959d6
PA
220 const char *bound = bounds + *n;
221 const char *pend;
14f9c5c9
AS
222
223 pend = strstr (bound, "__");
224 if (pend == NULL)
225 *n += bound_len = strlen (bound);
d2e4a39e 226 else
14f9c5c9
AS
227 {
228 bound_len = pend - bound;
229 *n += bound_len + 2;
230 }
231 fprintf_filtered (stream, "%.*s", bound_len, bound);
232 }
233}
234
235/* Assuming NAME[0 .. NAME_LEN-1] is the name of a range type, print
236 the value (if found) of the bound indicated by SUFFIX ("___L" or
4c4b4cd2 237 "___U") according to the ___XD conventions. */
14f9c5c9
AS
238
239static void
d2e4a39e
AS
240print_dynamic_range_bound (struct type *type, const char *name, int name_len,
241 const char *suffix, struct ui_file *stream)
14f9c5c9 242{
14f9c5c9 243 LONGEST B;
3ec5942f
SM
244 std::string name_buf (name, name_len);
245 name_buf += suffix;
14f9c5c9 246
3ec5942f 247 if (get_int_var_value (name_buf.c_str (), B))
14f9c5c9
AS
248 ada_print_scalar (type, B, stream);
249 else
250 fprintf_filtered (stream, "?");
251}
252
28c85d6c 253/* Print RAW_TYPE as a range type, using any bound information
fb151210
JB
254 following the GNAT encoding (if available).
255
256 If BOUNDS_PREFERED_P is nonzero, force the printing of the range
257 using its bounds. Otherwise, try printing the range without
258 printing the value of the bounds, if possible (this is only
259 considered a hint, not a guaranty). */
14f9c5c9
AS
260
261static void
fb151210
JB
262print_range_type (struct type *raw_type, struct ui_file *stream,
263 int bounds_prefered_p)
14f9c5c9 264{
0d5cff50 265 const char *name;
14f9c5c9 266 struct type *base_type;
0d5cff50 267 const char *subtype_info;
14f9c5c9 268
28c85d6c 269 gdb_assert (raw_type != NULL);
7d93a1e0 270 name = raw_type->name ();
28c85d6c 271 gdb_assert (name != NULL);
1ce677a4 272
78134374 273 if (raw_type->code () == TYPE_CODE_RANGE)
14f9c5c9
AS
274 base_type = TYPE_TARGET_TYPE (raw_type);
275 else
276 base_type = raw_type;
277
278 subtype_info = strstr (name, "___XD");
1ce677a4 279 if (subtype_info == NULL)
fb151210 280 print_range (raw_type, stream, bounds_prefered_p);
14f9c5c9
AS
281 else
282 {
283 int prefix_len = subtype_info - name;
e6a959d6 284 const char *bounds_str;
14f9c5c9
AS
285 int n;
286
287 subtype_info += 5;
288 bounds_str = strchr (subtype_info, '_');
289 n = 1;
290
d2e4a39e 291 if (*subtype_info == 'L')
14f9c5c9 292 {
4c4b4cd2 293 print_range_bound (base_type, bounds_str, &n, stream);
14f9c5c9
AS
294 subtype_info += 1;
295 }
296 else
4c4b4cd2 297 print_dynamic_range_bound (base_type, name, prefix_len, "___L",
d2e4a39e 298 stream);
14f9c5c9
AS
299
300 fprintf_filtered (stream, " .. ");
301
d2e4a39e 302 if (*subtype_info == 'U')
4c4b4cd2 303 print_range_bound (base_type, bounds_str, &n, stream);
14f9c5c9 304 else
4c4b4cd2 305 print_dynamic_range_bound (base_type, name, prefix_len, "___U",
d2e4a39e 306 stream);
14f9c5c9 307 }
d2e4a39e 308}
14f9c5c9 309
4c4b4cd2 310/* Print enumerated type TYPE on STREAM. */
14f9c5c9
AS
311
312static void
ebf56fd3 313print_enum_type (struct type *type, struct ui_file *stream)
14f9c5c9 314{
1f704f76 315 int len = type->num_fields ();
14e75d8e
JK
316 int i;
317 LONGEST lastval;
14f9c5c9
AS
318
319 fprintf_filtered (stream, "(");
320 wrap_here (" ");
321
322 lastval = 0;
323 for (i = 0; i < len; i++)
324 {
325 QUIT;
d2e4a39e
AS
326 if (i)
327 fprintf_filtered (stream, ", ");
14f9c5c9 328 wrap_here (" ");
3f0cbb04
TT
329 fputs_styled (ada_enum_name (TYPE_FIELD_NAME (type, i)),
330 variable_name_style.style (), stream);
14e75d8e 331 if (lastval != TYPE_FIELD_ENUMVAL (type, i))
14f9c5c9 332 {
14e75d8e
JK
333 fprintf_filtered (stream, " => %s",
334 plongest (TYPE_FIELD_ENUMVAL (type, i)));
335 lastval = TYPE_FIELD_ENUMVAL (type, i);
14f9c5c9
AS
336 }
337 lastval += 1;
338 }
339 fprintf_filtered (stream, ")");
340}
341
4c4b4cd2
PH
342/* Print simple (constrained) array type TYPE on STREAM. LEVEL is the
343 recursion (indentation) level, in case the element type itself has
14f9c5c9 344 nested structure, and SHOW is the number of levels of internal
4c4b4cd2 345 structure to show (see ada_print_type). */
14f9c5c9
AS
346
347static void
d2e4a39e 348print_array_type (struct type *type, struct ui_file *stream, int show,
79d43c61 349 int level, const struct type_print_options *flags)
14f9c5c9
AS
350{
351 int bitsize;
352 int n_indices;
bfca584f 353 struct type *elt_type = NULL;
14f9c5c9 354
ad82864c 355 if (ada_is_constrained_packed_array_type (type))
727e3d2e
JB
356 type = ada_coerce_to_simple_array_type (type);
357
14f9c5c9
AS
358 bitsize = 0;
359 fprintf_filtered (stream, "array (");
360
cb249c71
TT
361 if (type == NULL)
362 {
7f6aba03
TT
363 fprintf_styled (stream, metadata_style.style (),
364 _("<undecipherable array type>"));
cb249c71
TT
365 return;
366 }
367
14f9c5c9 368 n_indices = -1;
54ae186f 369 if (ada_is_simple_array_type (type))
14f9c5c9 370 {
54ae186f
JB
371 struct type *range_desc_type;
372 struct type *arr_type;
14f9c5c9 373
54ae186f
JB
374 range_desc_type = ada_find_parallel_type (type, "___XA");
375 ada_fixup_array_indexes_type (range_desc_type);
28c85d6c 376
54ae186f
JB
377 bitsize = 0;
378 if (range_desc_type == NULL)
379 {
78134374 380 for (arr_type = type; arr_type->code () == TYPE_CODE_ARRAY;
54ae186f 381 arr_type = TYPE_TARGET_TYPE (arr_type))
14f9c5c9 382 {
54ae186f
JB
383 if (arr_type != type)
384 fprintf_filtered (stream, ", ");
3d967001 385 print_range (arr_type->index_type (), stream,
fb151210 386 0 /* bounds_prefered_p */);
54ae186f
JB
387 if (TYPE_FIELD_BITSIZE (arr_type, 0) > 0)
388 bitsize = TYPE_FIELD_BITSIZE (arr_type, 0);
14f9c5c9
AS
389 }
390 }
d2e4a39e 391 else
14f9c5c9 392 {
54ae186f 393 int k;
5b4ee69b 394
1f704f76 395 n_indices = range_desc_type->num_fields ();
54ae186f
JB
396 for (k = 0, arr_type = type;
397 k < n_indices;
398 k += 1, arr_type = TYPE_TARGET_TYPE (arr_type))
399 {
400 if (k > 0)
401 fprintf_filtered (stream, ", ");
940da03e 402 print_range_type (range_desc_type->field (k).type (),
fb151210 403 stream, 0 /* bounds_prefered_p */);
54ae186f
JB
404 if (TYPE_FIELD_BITSIZE (arr_type, 0) > 0)
405 bitsize = TYPE_FIELD_BITSIZE (arr_type, 0);
406 }
14f9c5c9
AS
407 }
408 }
54ae186f
JB
409 else
410 {
411 int i, i0;
412
413 for (i = i0 = ada_array_arity (type); i > 0; i -= 1)
414 fprintf_filtered (stream, "%s<>", i == i0 ? "" : ", ");
415 }
14f9c5c9 416
bfca584f 417 elt_type = ada_array_element_type (type, n_indices);
14f9c5c9
AS
418 fprintf_filtered (stream, ") of ");
419 wrap_here ("");
bfca584f
PMR
420 ada_print_type (elt_type, "", stream, show == 0 ? 0 : show - 1, level + 1,
421 flags);
422 /* Arrays with variable-length elements are never bit-packed in practice but
423 compilers have to describe their stride so that we can properly fetch
424 individual elements. Do not say the array is packed in this case. */
425 if (bitsize > 0 && !is_dynamic_type (elt_type))
14f9c5c9
AS
426 fprintf_filtered (stream, " <packed: %d-bit elements>", bitsize);
427}
428
429/* Print the choices encoded by field FIELD_NUM of variant-part TYPE on
83e3a93c 430 STREAM, assuming that VAL_TYPE (if non-NULL) is the type of the
feb864b7 431 values. Return non-zero if the field is an encoding of
83e3a93c
PH
432 discriminant values, as in a standard variant record, and 0 if the
433 field is not so encoded (as happens with single-component variants
e7a82140 434 in types annotated with pragma Unchecked_Union). */
14f9c5c9 435
83e3a93c 436static int
d2e4a39e
AS
437print_choices (struct type *type, int field_num, struct ui_file *stream,
438 struct type *val_type)
14f9c5c9
AS
439{
440 int have_output;
441 int p;
d2e4a39e 442 const char *name = TYPE_FIELD_NAME (type, field_num);
14f9c5c9
AS
443
444 have_output = 0;
445
4c4b4cd2 446 /* Skip over leading 'V': NOTE soon to be obsolete. */
14f9c5c9
AS
447 if (name[0] == 'V')
448 {
d2e4a39e 449 if (!ada_scan_number (name, 1, NULL, &p))
14f9c5c9
AS
450 goto Huh;
451 }
452 else
453 p = 0;
454
455 while (1)
456 {
d2e4a39e 457 switch (name[p])
14f9c5c9
AS
458 {
459 default:
83e3a93c
PH
460 goto Huh;
461 case '_':
462 case '\0':
463 fprintf_filtered (stream, " =>");
464 return 1;
14f9c5c9
AS
465 case 'S':
466 case 'R':
467 case 'O':
d2e4a39e 468 if (have_output)
14f9c5c9
AS
469 fprintf_filtered (stream, " | ");
470 have_output = 1;
471 break;
472 }
473
d2e4a39e 474 switch (name[p])
14f9c5c9
AS
475 {
476 case 'S':
477 {
478 LONGEST W;
5b4ee69b 479
d2e4a39e 480 if (!ada_scan_number (name, p + 1, &W, &p))
14f9c5c9
AS
481 goto Huh;
482 ada_print_scalar (val_type, W, stream);
483 break;
484 }
485 case 'R':
486 {
487 LONGEST L, U;
5b4ee69b 488
d2e4a39e
AS
489 if (!ada_scan_number (name, p + 1, &L, &p)
490 || name[p] != 'T' || !ada_scan_number (name, p + 1, &U, &p))
14f9c5c9
AS
491 goto Huh;
492 ada_print_scalar (val_type, L, stream);
493 fprintf_filtered (stream, " .. ");
494 ada_print_scalar (val_type, U, stream);
495 break;
496 }
497 case 'O':
498 fprintf_filtered (stream, "others");
499 p += 1;
500 break;
501 }
502 }
503
504Huh:
6c71eb7d 505 fprintf_filtered (stream, "? =>");
83e3a93c 506 return 0;
14f9c5c9
AS
507}
508
83e3a93c
PH
509/* Assuming that field FIELD_NUM of TYPE represents variants whose
510 discriminant is contained in OUTER_TYPE, print its components on STREAM.
511 LEVEL is the recursion (indentation) level, in case any of the fields
512 themselves have nested structure, and SHOW is the number of levels of
513 internal structure to show (see ada_print_type). For this purpose,
514 fields nested in a variant part are taken to be at the same level as
515 the fields immediately outside the variant part. */
14f9c5c9
AS
516
517static void
ebf56fd3
AS
518print_variant_clauses (struct type *type, int field_num,
519 struct type *outer_type, struct ui_file *stream,
79d43c61
TT
520 int show, int level,
521 const struct type_print_options *flags)
14f9c5c9
AS
522{
523 int i;
4c4b4cd2 524 struct type *var_type, *par_type;
14f9c5c9
AS
525 struct type *discr_type;
526
940da03e 527 var_type = type->field (field_num).type ();
14f9c5c9
AS
528 discr_type = ada_variant_discrim_type (var_type, outer_type);
529
78134374 530 if (var_type->code () == TYPE_CODE_PTR)
14f9c5c9
AS
531 {
532 var_type = TYPE_TARGET_TYPE (var_type);
78134374 533 if (var_type == NULL || var_type->code () != TYPE_CODE_UNION)
4c4b4cd2 534 return;
14f9c5c9
AS
535 }
536
4c4b4cd2
PH
537 par_type = ada_find_parallel_type (var_type, "___XVU");
538 if (par_type != NULL)
539 var_type = par_type;
540
1f704f76 541 for (i = 0; i < var_type->num_fields (); i += 1)
14f9c5c9
AS
542 {
543 fprintf_filtered (stream, "\n%*swhen ", level + 4, "");
83e3a93c
PH
544 if (print_choices (var_type, i, stream, discr_type))
545 {
940da03e 546 if (print_record_field_types (var_type->field (i).type (),
79d43c61
TT
547 outer_type, stream, show, level + 4,
548 flags)
83e3a93c
PH
549 <= 0)
550 fprintf_filtered (stream, " null;");
551 }
552 else
553 print_selected_record_field_types (var_type, outer_type, i, i,
79d43c61 554 stream, show, level + 4, flags);
14f9c5c9
AS
555 }
556}
557
4c4b4cd2 558/* Assuming that field FIELD_NUM of TYPE is a variant part whose
14f9c5c9 559 discriminants are contained in OUTER_TYPE, print a description of it
4c4b4cd2
PH
560 on STREAM. LEVEL is the recursion (indentation) level, in case any of
561 the fields themselves have nested structure, and SHOW is the number of
562 levels of internal structure to show (see ada_print_type). For this
563 purpose, fields nested in a variant part are taken to be at the same
564 level as the fields immediately outside the variant part. */
14f9c5c9
AS
565
566static void
ebf56fd3 567print_variant_part (struct type *type, int field_num, struct type *outer_type,
79d43c61
TT
568 struct ui_file *stream, int show, int level,
569 const struct type_print_options *flags)
14f9c5c9 570{
6c71eb7d 571 const char *variant
940da03e 572 = ada_variant_discrim_name (type->field (field_num).type ());
6c71eb7d
TT
573 if (*variant == '\0')
574 variant = "?";
575
576 fprintf_filtered (stream, "\n%*scase %s is", level + 4, "", variant);
d2e4a39e 577 print_variant_clauses (type, field_num, outer_type, stream, show,
79d43c61 578 level + 4, flags);
14f9c5c9
AS
579 fprintf_filtered (stream, "\n%*send case;", level + 4, "");
580}
581
83e3a93c
PH
582/* Print a description on STREAM of the fields FLD0 through FLD1 in
583 record or union type TYPE, whose discriminants are in OUTER_TYPE.
584 LEVEL is the recursion (indentation) level, in case any of the
585 fields themselves have nested structure, and SHOW is the number of
586 levels of internal structure to show (see ada_print_type). Does
feb864b7 587 not print parent type information of TYPE. Returns 0 if no fields
83e3a93c
PH
588 printed, -1 for an incomplete type, else > 0. Prints each field
589 beginning on a new line, but does not put a new line at end. */
14f9c5c9
AS
590
591static int
83e3a93c
PH
592print_selected_record_field_types (struct type *type, struct type *outer_type,
593 int fld0, int fld1,
79d43c61
TT
594 struct ui_file *stream, int show, int level,
595 const struct type_print_options *flags)
14f9c5c9 596{
83e3a93c 597 int i, flds;
14f9c5c9
AS
598
599 flds = 0;
14f9c5c9 600
e46d3488 601 if (fld0 > fld1 && type->is_stub ())
14f9c5c9
AS
602 return -1;
603
83e3a93c 604 for (i = fld0; i <= fld1; i += 1)
14f9c5c9
AS
605 {
606 QUIT;
607
d2e4a39e 608 if (ada_is_parent_field (type, i) || ada_is_ignored_field (type, i))
14f9c5c9
AS
609 ;
610 else if (ada_is_wrapper_field (type, i))
940da03e 611 flds += print_record_field_types (type->field (i).type (), type,
79d43c61 612 stream, show, level, flags);
d2e4a39e 613 else if (ada_is_variant_part (type, i))
14f9c5c9 614 {
79d43c61 615 print_variant_part (type, i, outer_type, stream, show, level, flags);
14f9c5c9
AS
616 flds = 1;
617 }
618 else
619 {
620 flds += 1;
621 fprintf_filtered (stream, "\n%*s", level + 4, "");
940da03e 622 ada_print_type (type->field (i).type (),
14f9c5c9 623 TYPE_FIELD_NAME (type, i),
79d43c61 624 stream, show - 1, level + 4, flags);
14f9c5c9
AS
625 fprintf_filtered (stream, ";");
626 }
627 }
628
629 return flds;
630}
631
d656f129
TT
632static void print_record_field_types_dynamic
633 (const gdb::array_view<variant_part> &parts,
634 int from, int to, struct type *type, struct ui_file *stream,
635 int show, int level, const struct type_print_options *flags);
636
637/* Print the choices encoded by VARIANT on STREAM. LEVEL is the
638 indentation level. The type of the discriminant for VARIANT is
639 given by DISR_TYPE. */
640
641static void
642print_choices (struct type *discr_type, const variant &variant,
643 struct ui_file *stream, int level)
644{
645 fprintf_filtered (stream, "\n%*swhen ", level, "");
646 if (variant.is_default ())
647 fprintf_filtered (stream, "others");
648 else
649 {
650 bool first = true;
651 for (const discriminant_range &range : variant.discriminants)
652 {
653 if (!first)
654 fprintf_filtered (stream, " | ");
655 first = false;
656
657 ada_print_scalar (discr_type, range.low, stream);
658 if (range.low != range.high)
659 ada_print_scalar (discr_type, range.high, stream);
660 }
661 }
662
663 fprintf_filtered (stream, " =>");
664}
665
666/* Print a single variant part, PART, on STREAM. TYPE is the
667 enclosing type. SHOW, LEVEL, and FLAGS are the usual type-printing
668 settings. This prints information about PART and the fields it
669 controls. It returns the index of the next field that should be
670 shown -- that is, one after the last field printed by this
671 call. */
672
673static int
674print_variant_part (const variant_part &part,
675 struct type *type, struct ui_file *stream,
676 int show, int level,
677 const struct type_print_options *flags)
678{
679 struct type *discr_type = nullptr;
680 const char *name;
681 if (part.discriminant_index == -1)
682 name = "?";
683 else
684 {
685 name = TYPE_FIELD_NAME (type, part.discriminant_index);
940da03e 686 discr_type = type->field (part.discriminant_index).type ();
d656f129
TT
687 }
688
689 fprintf_filtered (stream, "\n%*scase %s is", level + 4, "", name);
690
691 int last_field = -1;
692 for (const variant &variant : part.variants)
693 {
694 print_choices (discr_type, variant, stream, level + 8);
695
696 if (variant.first_field == variant.last_field)
697 fprintf_filtered (stream, " null;");
698 else
699 {
700 print_record_field_types_dynamic (variant.parts,
701 variant.first_field,
702 variant.last_field, type, stream,
703 show, level + 8, flags);
704 last_field = variant.last_field;
705 }
706 }
707
708 fprintf_filtered (stream, "\n%*send case;", level + 4, "");
709
710 return last_field;
711}
712
713/* Print some fields of TYPE to STREAM. SHOW, LEVEL, and FLAGS are
714 the usual type-printing settings. PARTS is the array of variant
715 parts that correspond to the range of fields to be printed. FROM
716 and TO are the range of fields to print. */
717
718static void
719print_record_field_types_dynamic (const gdb::array_view<variant_part> &parts,
720 int from, int to,
721 struct type *type, struct ui_file *stream,
722 int show, int level,
723 const struct type_print_options *flags)
724{
725 int field = from;
726
727 for (const variant_part &part : parts)
728 {
729 if (part.variants.empty ())
730 continue;
731
732 /* Print any non-varying fields. */
733 int first_varying = part.variants[0].first_field;
734 print_selected_record_field_types (type, type, field,
735 first_varying - 1, stream,
736 show, level, flags);
737
738 field = print_variant_part (part, type, stream, show, level, flags);
739 }
740
741 /* Print any trailing fields that we were asked to print. */
742 print_selected_record_field_types (type, type, field, to - 1, stream, show,
743 level, flags);
744}
745
83e3a93c
PH
746/* Print a description on STREAM of all fields of record or union type
747 TYPE, as for print_selected_record_field_types, above. */
748
749static int
750print_record_field_types (struct type *type, struct type *outer_type,
79d43c61
TT
751 struct ui_file *stream, int show, int level,
752 const struct type_print_options *flags)
83e3a93c 753{
24e99c6c 754 struct dynamic_prop *prop = type->dyn_prop (DYN_PROP_VARIANT_PARTS);
d656f129
TT
755 if (prop != nullptr)
756 {
8c2e4e06 757 if (prop->kind () == PROP_TYPE)
d656f129 758 {
8c2e4e06 759 type = prop->original_type ();
24e99c6c 760 prop = type->dyn_prop (DYN_PROP_VARIANT_PARTS);
d656f129 761 }
8c2e4e06
SM
762 gdb_assert (prop->kind () == PROP_VARIANT_PARTS);
763 print_record_field_types_dynamic (*prop->variant_parts (),
1f704f76 764 0, type->num_fields (),
d656f129 765 type, stream, show, level, flags);
1f704f76 766 return type->num_fields ();
d656f129
TT
767 }
768
83e3a93c 769 return print_selected_record_field_types (type, outer_type,
1f704f76 770 0, type->num_fields () - 1,
79d43c61 771 stream, show, level, flags);
83e3a93c
PH
772}
773
774
4c4b4cd2
PH
775/* Print record type TYPE on STREAM. LEVEL is the recursion (indentation)
776 level, in case the element type itself has nested structure, and SHOW is
777 the number of levels of internal structure to show (see ada_print_type). */
14f9c5c9
AS
778
779static void
d2e4a39e 780print_record_type (struct type *type0, struct ui_file *stream, int show,
79d43c61 781 int level, const struct type_print_options *flags)
14f9c5c9 782{
d2e4a39e
AS
783 struct type *parent_type;
784 struct type *type;
785
4c4b4cd2
PH
786 type = ada_find_parallel_type (type0, "___XVE");
787 if (type == NULL)
788 type = type0;
14f9c5c9
AS
789
790 parent_type = ada_parent_type (type);
d2e4a39e 791 if (ada_type_name (parent_type) != NULL)
25552254
JB
792 {
793 const char *parent_name = decoded_type_name (parent_type);
794
795 /* If we fail to decode the parent type name, then use the parent
796 type name as is. Not pretty, but should never happen except
797 when the debugging info is incomplete or incorrect. This
798 prevents a crash trying to print a NULL pointer. */
799 if (parent_name == NULL)
800 parent_name = ada_type_name (parent_type);
801 fprintf_filtered (stream, "new %s with record", parent_name);
802 }
4c4b4cd2 803 else if (parent_type == NULL && ada_is_tagged_type (type, 0))
0b48a291
PH
804 fprintf_filtered (stream, "tagged record");
805 else
806 fprintf_filtered (stream, "record");
14f9c5c9
AS
807
808 if (show < 0)
0b48a291 809 fprintf_filtered (stream, " ... end record");
14f9c5c9
AS
810 else
811 {
812 int flds;
813
814 flds = 0;
815 if (parent_type != NULL && ada_type_name (parent_type) == NULL)
d2e4a39e 816 flds += print_record_field_types (parent_type, parent_type,
79d43c61
TT
817 stream, show, level, flags);
818 flds += print_record_field_types (type, type, stream, show, level,
819 flags);
d2e4a39e 820
14f9c5c9 821 if (flds > 0)
0b48a291 822 fprintf_filtered (stream, "\n%*send record", level, "");
d2e4a39e 823 else if (flds < 0)
323e0a4a 824 fprintf_filtered (stream, _(" <incomplete type> end record"));
d2e4a39e 825 else
0b48a291 826 fprintf_filtered (stream, " null; end record");
14f9c5c9
AS
827 }
828}
829
830/* Print the unchecked union type TYPE in something resembling Ada
4c4b4cd2 831 format on STREAM. LEVEL is the recursion (indentation) level
14f9c5c9 832 in case the element type itself has nested structure, and SHOW is the
4c4b4cd2 833 number of levels of internal structure to show (see ada_print_type). */
14f9c5c9 834static void
d2e4a39e 835print_unchecked_union_type (struct type *type, struct ui_file *stream,
79d43c61
TT
836 int show, int level,
837 const struct type_print_options *flags)
14f9c5c9 838{
14f9c5c9 839 if (show < 0)
0b48a291 840 fprintf_filtered (stream, "record (?) is ... end record");
1f704f76 841 else if (type->num_fields () == 0)
0b48a291 842 fprintf_filtered (stream, "record (?) is null; end record");
14f9c5c9
AS
843 else
844 {
845 int i;
846
0b48a291 847 fprintf_filtered (stream, "record (?) is\n%*scase ? is", level + 4, "");
14f9c5c9 848
1f704f76 849 for (i = 0; i < type->num_fields (); i += 1)
14f9c5c9 850 {
0b48a291 851 fprintf_filtered (stream, "\n%*swhen ? =>\n%*s", level + 8, "",
d2e4a39e 852 level + 12, "");
940da03e 853 ada_print_type (type->field (i).type (),
14f9c5c9 854 TYPE_FIELD_NAME (type, i),
79d43c61 855 stream, show - 1, level + 12, flags);
14f9c5c9
AS
856 fprintf_filtered (stream, ";");
857 }
858
0b48a291 859 fprintf_filtered (stream, "\n%*send case;\n%*send record",
d2e4a39e 860 level + 4, "", level, "");
14f9c5c9
AS
861 }
862}
d2e4a39e 863
14f9c5c9
AS
864
865
866/* Print function or procedure type TYPE on STREAM. Make it a header
4c4b4cd2 867 for function or procedure NAME if NAME is not null. */
14f9c5c9
AS
868
869static void
79d43c61
TT
870print_func_type (struct type *type, struct ui_file *stream, const char *name,
871 const struct type_print_options *flags)
14f9c5c9 872{
1f704f76 873 int i, len = type->num_fields ();
14f9c5c9 874
7022349d 875 if (TYPE_TARGET_TYPE (type) != NULL
78134374 876 && TYPE_TARGET_TYPE (type)->code () == TYPE_CODE_VOID)
14f9c5c9
AS
877 fprintf_filtered (stream, "procedure");
878 else
879 fprintf_filtered (stream, "function");
880
d2e4a39e 881 if (name != NULL && name[0] != '\0')
ac8c53cc
PW
882 {
883 fputs_filtered (" ", stream);
884 fputs_styled (name, function_name_style.style (), stream);
885 }
14f9c5c9 886
d2e4a39e 887 if (len > 0)
14f9c5c9
AS
888 {
889 fprintf_filtered (stream, " (");
890 for (i = 0; i < len; i += 1)
891 {
892 if (i > 0)
893 {
894 fputs_filtered ("; ", stream);
895 wrap_here (" ");
896 }
d2e4a39e 897 fprintf_filtered (stream, "a%d: ", i + 1);
940da03e 898 ada_print_type (type->field (i).type (), "", stream, -1, 0,
79d43c61 899 flags);
14f9c5c9
AS
900 }
901 fprintf_filtered (stream, ")");
d2e4a39e 902 }
14f9c5c9 903
7022349d
PA
904 if (TYPE_TARGET_TYPE (type) == NULL)
905 fprintf_filtered (stream, " return <unknown return type>");
78134374 906 else if (TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID)
14f9c5c9
AS
907 {
908 fprintf_filtered (stream, " return ");
79d43c61 909 ada_print_type (TYPE_TARGET_TYPE (type), "", stream, 0, 0, flags);
14f9c5c9
AS
910 }
911}
912
913
914/* Print a description of a type TYPE0.
915 Output goes to STREAM (via stdio).
916 If VARSTRING is a non-empty string, print as an Ada variable/field
917 declaration.
4c4b4cd2 918 SHOW+1 is the maximum number of levels of internal type structure
14f9c5c9
AS
919 to show (this applies to record types, enumerated types, and
920 array types).
921 SHOW is the number of levels of internal type structure to show
4c4b4cd2 922 when there is a type name for the SHOWth deepest level (0th is
14f9c5c9
AS
923 outer level).
924 When SHOW<0, no inner structure is shown.
4c4b4cd2 925 LEVEL indicates level of recursion (for nested definitions). */
14f9c5c9
AS
926
927void
25b524e8 928ada_print_type (struct type *type0, const char *varstring,
79d43c61
TT
929 struct ui_file *stream, int show, int level,
930 const struct type_print_options *flags)
14f9c5c9 931{
61ee279c 932 struct type *type = ada_check_typedef (ada_get_base_type (type0));
8d9fd3a1
TT
933 /* If we can decode the original type name, use it. However, there
934 are cases where the original type is an internally-generated type
935 with a name that can't be decoded (and whose encoded name might
936 not actually bear any relation to the type actually declared in
937 the sources). In that case, try using the name of the base type
938 in its place.
939
940 Note that we looked at the possibility of always using the name
941 of the base type. This does not always work, unfortunately, as
942 there are situations where it's the base type which has an
943 internally-generated name. */
944 const char *type_name = decoded_type_name (type0);
945 if (type_name == nullptr)
946 type_name = decoded_type_name (type);
14f9c5c9
AS
947 int is_var_decl = (varstring != NULL && varstring[0] != '\0');
948
949 if (type == NULL)
950 {
951 if (is_var_decl)
952 fprintf_filtered (stream, "%.*s: ",
d2e4a39e 953 ada_name_prefix_len (varstring), varstring);
7f6aba03 954 fprintf_styled (stream, metadata_style.style (), "<null type?>");
14f9c5c9
AS
955 return;
956 }
957
78134374 958 if (is_var_decl && type->code () != TYPE_CODE_FUNC)
d2e4a39e
AS
959 fprintf_filtered (stream, "%.*s: ",
960 ada_name_prefix_len (varstring), varstring);
14f9c5c9 961
d2d43431 962 if (type_name != NULL && show <= 0 && !ada_is_aligner_type (type))
14f9c5c9 963 {
d2e4a39e 964 fprintf_filtered (stream, "%.*s",
14f9c5c9
AS
965 ada_name_prefix_len (type_name), type_name);
966 return;
967 }
968
969 if (ada_is_aligner_type (type))
79d43c61 970 ada_print_type (ada_aligned_type (type), "", stream, show, level, flags);
d2d43431 971 else if (ada_is_constrained_packed_array_type (type)
78134374 972 && type->code () != TYPE_CODE_PTR)
79d43c61 973 print_array_type (type, stream, show, level, flags);
14f9c5c9 974 else
78134374 975 switch (type->code ())
d2e4a39e
AS
976 {
977 default:
978 fprintf_filtered (stream, "<");
79d43c61 979 c_print_type (type, "", stream, show, level, flags);
d2e4a39e
AS
980 fprintf_filtered (stream, ">");
981 break;
982 case TYPE_CODE_PTR:
720d1a40 983 case TYPE_CODE_TYPEDEF:
9c91c725
TT
984 /* An __XVL field is not truly a pointer, so don't print
985 "access" in this case. */
986 if (type->code () != TYPE_CODE_PTR
987 || strstr (varstring, "___XVL") == nullptr)
988 fprintf_filtered (stream, "access ");
79d43c61
TT
989 ada_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level,
990 flags);
d2e4a39e
AS
991 break;
992 case TYPE_CODE_REF:
993 fprintf_filtered (stream, "<ref> ");
79d43c61
TT
994 ada_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level,
995 flags);
d2e4a39e
AS
996 break;
997 case TYPE_CODE_ARRAY:
79d43c61 998 print_array_type (type, stream, show, level, flags);
d2e4a39e 999 break;
690cc4eb
PH
1000 case TYPE_CODE_BOOL:
1001 fprintf_filtered (stream, "(false, true)");
1002 break;
d2e4a39e 1003 case TYPE_CODE_INT:
bbcdf9ab
TT
1004 {
1005 const char *name = ada_type_name (type);
1006
1007 if (!ada_is_range_type_name (name))
1008 fprintf_styled (stream, metadata_style.style (),
1009 _("<%s-byte integer>"),
1010 pulongest (TYPE_LENGTH (type)));
1011 else
1012 {
1013 fprintf_filtered (stream, "range ");
1014 print_range_type (type, stream, 1 /* bounds_prefered_p */);
1015 }
1016 }
d2e4a39e
AS
1017 break;
1018 case TYPE_CODE_RANGE:
bbcdf9ab 1019 if (is_fixed_point_type (type))
0c9150e4
JB
1020 {
1021 fprintf_filtered (stream, "<");
1022 print_type_fixed_point (type, stream);
1023 fprintf_filtered (stream, ">");
1024 }
d2e4a39e 1025 else if (ada_is_modular_type (type))
529cad9c
PH
1026 fprintf_filtered (stream, "mod %s",
1027 int_string (ada_modulus (type), 10, 0, 0, 1));
d2e4a39e
AS
1028 else
1029 {
1030 fprintf_filtered (stream, "range ");
fb151210 1031 print_range (type, stream, 1 /* bounds_prefered_p */);
d2e4a39e
AS
1032 }
1033 break;
1034 case TYPE_CODE_FLT:
7f6aba03
TT
1035 fprintf_styled (stream, metadata_style.style (),
1036 _("<%s-byte float>"),
1037 pulongest (TYPE_LENGTH (type)));
d2e4a39e
AS
1038 break;
1039 case TYPE_CODE_ENUM:
1040 if (show < 0)
1041 fprintf_filtered (stream, "(...)");
1042 else
1043 print_enum_type (type, stream);
1044 break;
1045 case TYPE_CODE_STRUCT:
4c4b4cd2 1046 if (ada_is_array_descriptor_type (type))
79d43c61 1047 print_array_type (type, stream, show, level, flags);
d2e4a39e
AS
1048 else if (ada_is_bogus_array_descriptor (type))
1049 fprintf_filtered (stream,
e1d5a0d2 1050 _("array (?) of ? (<mal-formed descriptor>)"));
d2e4a39e 1051 else
79d43c61 1052 print_record_type (type, stream, show, level, flags);
d2e4a39e
AS
1053 break;
1054 case TYPE_CODE_UNION:
79d43c61 1055 print_unchecked_union_type (type, stream, show, level, flags);
d2e4a39e
AS
1056 break;
1057 case TYPE_CODE_FUNC:
79d43c61 1058 print_func_type (type, stream, varstring, flags);
d2e4a39e
AS
1059 break;
1060 }
14f9c5c9 1061}
be942545
JB
1062
1063/* Implement the la_print_typedef language method for Ada. */
1064
1065void
1066ada_print_typedef (struct type *type, struct symbol *new_symbol,
dda83cd7 1067 struct ui_file *stream)
be942545
JB
1068{
1069 type = ada_check_typedef (type);
79d43c61 1070 ada_print_type (type, "", stream, 0, 0, &type_print_raw_options);
be942545 1071}
This page took 1.269045 seconds and 4 git commands to generate.