gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / ada-typeprint.c
CommitLineData
14f9c5c9 1/* Support for printing Ada types for GDB, the GNU debugger.
b811d2c2 2 Copyright (C) 1986-2020 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
PH
200 /* STABS decodes all range types which bounds are 0 .. -1 as
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.
7c964f07
UW
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,
4c4b4cd2
PH
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 342/* Print representation of Ada fixed-point type TYPE on STREAM. */
14f9c5c9
AS
343
344static void
b2188a06 345print_gnat_encoded_fixed_point_type (struct type *type, struct ui_file *stream)
14f9c5c9 346{
b2188a06 347 struct value *delta = gnat_encoded_fixed_point_delta (type);
50eff16b 348 struct value *small = ada_scaling_factor (type);
14f9c5c9 349
50eff16b 350 if (delta == nullptr)
14f9c5c9
AS
351 fprintf_filtered (stream, "delta ??");
352 else
353 {
50eff16b
UW
354 std::string str;
355 str = target_float_to_string (value_contents (delta),
356 value_type (delta), "%g");
357 fprintf_filtered (stream, "delta %s", str.c_str());
358 if (!value_equal (delta, small))
359 {
360 str = target_float_to_string (value_contents (small),
361 value_type (small), "%g");
362 fprintf_filtered (stream, " <'small = %s>", str.c_str());
363 }
14f9c5c9
AS
364 }
365}
366
4c4b4cd2
PH
367/* Print simple (constrained) array type TYPE on STREAM. LEVEL is the
368 recursion (indentation) level, in case the element type itself has
14f9c5c9 369 nested structure, and SHOW is the number of levels of internal
4c4b4cd2 370 structure to show (see ada_print_type). */
14f9c5c9
AS
371
372static void
d2e4a39e 373print_array_type (struct type *type, struct ui_file *stream, int show,
79d43c61 374 int level, const struct type_print_options *flags)
14f9c5c9
AS
375{
376 int bitsize;
377 int n_indices;
bfca584f 378 struct type *elt_type = NULL;
14f9c5c9 379
ad82864c 380 if (ada_is_constrained_packed_array_type (type))
727e3d2e
JB
381 type = ada_coerce_to_simple_array_type (type);
382
14f9c5c9
AS
383 bitsize = 0;
384 fprintf_filtered (stream, "array (");
385
cb249c71
TT
386 if (type == NULL)
387 {
7f6aba03
TT
388 fprintf_styled (stream, metadata_style.style (),
389 _("<undecipherable array type>"));
cb249c71
TT
390 return;
391 }
392
14f9c5c9 393 n_indices = -1;
54ae186f 394 if (ada_is_simple_array_type (type))
14f9c5c9 395 {
54ae186f
JB
396 struct type *range_desc_type;
397 struct type *arr_type;
14f9c5c9 398
54ae186f
JB
399 range_desc_type = ada_find_parallel_type (type, "___XA");
400 ada_fixup_array_indexes_type (range_desc_type);
28c85d6c 401
54ae186f
JB
402 bitsize = 0;
403 if (range_desc_type == NULL)
404 {
78134374 405 for (arr_type = type; arr_type->code () == TYPE_CODE_ARRAY;
54ae186f 406 arr_type = TYPE_TARGET_TYPE (arr_type))
14f9c5c9 407 {
54ae186f
JB
408 if (arr_type != type)
409 fprintf_filtered (stream, ", ");
fb151210
JB
410 print_range (TYPE_INDEX_TYPE (arr_type), stream,
411 0 /* bounds_prefered_p */);
54ae186f
JB
412 if (TYPE_FIELD_BITSIZE (arr_type, 0) > 0)
413 bitsize = TYPE_FIELD_BITSIZE (arr_type, 0);
14f9c5c9
AS
414 }
415 }
d2e4a39e 416 else
14f9c5c9 417 {
54ae186f 418 int k;
5b4ee69b 419
1f704f76 420 n_indices = range_desc_type->num_fields ();
54ae186f
JB
421 for (k = 0, arr_type = type;
422 k < n_indices;
423 k += 1, arr_type = TYPE_TARGET_TYPE (arr_type))
424 {
425 if (k > 0)
426 fprintf_filtered (stream, ", ");
427 print_range_type (TYPE_FIELD_TYPE (range_desc_type, k),
fb151210 428 stream, 0 /* bounds_prefered_p */);
54ae186f
JB
429 if (TYPE_FIELD_BITSIZE (arr_type, 0) > 0)
430 bitsize = TYPE_FIELD_BITSIZE (arr_type, 0);
431 }
14f9c5c9
AS
432 }
433 }
54ae186f
JB
434 else
435 {
436 int i, i0;
437
438 for (i = i0 = ada_array_arity (type); i > 0; i -= 1)
439 fprintf_filtered (stream, "%s<>", i == i0 ? "" : ", ");
440 }
14f9c5c9 441
bfca584f 442 elt_type = ada_array_element_type (type, n_indices);
14f9c5c9
AS
443 fprintf_filtered (stream, ") of ");
444 wrap_here ("");
bfca584f
PMR
445 ada_print_type (elt_type, "", stream, show == 0 ? 0 : show - 1, level + 1,
446 flags);
447 /* Arrays with variable-length elements are never bit-packed in practice but
448 compilers have to describe their stride so that we can properly fetch
449 individual elements. Do not say the array is packed in this case. */
450 if (bitsize > 0 && !is_dynamic_type (elt_type))
14f9c5c9
AS
451 fprintf_filtered (stream, " <packed: %d-bit elements>", bitsize);
452}
453
454/* Print the choices encoded by field FIELD_NUM of variant-part TYPE on
83e3a93c 455 STREAM, assuming that VAL_TYPE (if non-NULL) is the type of the
feb864b7 456 values. Return non-zero if the field is an encoding of
83e3a93c
PH
457 discriminant values, as in a standard variant record, and 0 if the
458 field is not so encoded (as happens with single-component variants
e7a82140 459 in types annotated with pragma Unchecked_Union). */
14f9c5c9 460
83e3a93c 461static int
d2e4a39e
AS
462print_choices (struct type *type, int field_num, struct ui_file *stream,
463 struct type *val_type)
14f9c5c9
AS
464{
465 int have_output;
466 int p;
d2e4a39e 467 const char *name = TYPE_FIELD_NAME (type, field_num);
14f9c5c9
AS
468
469 have_output = 0;
470
4c4b4cd2 471 /* Skip over leading 'V': NOTE soon to be obsolete. */
14f9c5c9
AS
472 if (name[0] == 'V')
473 {
d2e4a39e 474 if (!ada_scan_number (name, 1, NULL, &p))
14f9c5c9
AS
475 goto Huh;
476 }
477 else
478 p = 0;
479
480 while (1)
481 {
d2e4a39e 482 switch (name[p])
14f9c5c9
AS
483 {
484 default:
83e3a93c
PH
485 goto Huh;
486 case '_':
487 case '\0':
488 fprintf_filtered (stream, " =>");
489 return 1;
14f9c5c9
AS
490 case 'S':
491 case 'R':
492 case 'O':
d2e4a39e 493 if (have_output)
14f9c5c9
AS
494 fprintf_filtered (stream, " | ");
495 have_output = 1;
496 break;
497 }
498
d2e4a39e 499 switch (name[p])
14f9c5c9
AS
500 {
501 case 'S':
502 {
503 LONGEST W;
5b4ee69b 504
d2e4a39e 505 if (!ada_scan_number (name, p + 1, &W, &p))
14f9c5c9
AS
506 goto Huh;
507 ada_print_scalar (val_type, W, stream);
508 break;
509 }
510 case 'R':
511 {
512 LONGEST L, U;
5b4ee69b 513
d2e4a39e
AS
514 if (!ada_scan_number (name, p + 1, &L, &p)
515 || name[p] != 'T' || !ada_scan_number (name, p + 1, &U, &p))
14f9c5c9
AS
516 goto Huh;
517 ada_print_scalar (val_type, L, stream);
518 fprintf_filtered (stream, " .. ");
519 ada_print_scalar (val_type, U, stream);
520 break;
521 }
522 case 'O':
523 fprintf_filtered (stream, "others");
524 p += 1;
525 break;
526 }
527 }
528
529Huh:
6c71eb7d 530 fprintf_filtered (stream, "? =>");
83e3a93c 531 return 0;
14f9c5c9
AS
532}
533
83e3a93c
PH
534/* Assuming that field FIELD_NUM of TYPE represents variants whose
535 discriminant is contained in OUTER_TYPE, print its components on STREAM.
536 LEVEL is the recursion (indentation) level, in case any of the fields
537 themselves have nested structure, and SHOW is the number of levels of
538 internal structure to show (see ada_print_type). For this purpose,
539 fields nested in a variant part are taken to be at the same level as
540 the fields immediately outside the variant part. */
14f9c5c9
AS
541
542static void
ebf56fd3
AS
543print_variant_clauses (struct type *type, int field_num,
544 struct type *outer_type, struct ui_file *stream,
79d43c61
TT
545 int show, int level,
546 const struct type_print_options *flags)
14f9c5c9
AS
547{
548 int i;
4c4b4cd2 549 struct type *var_type, *par_type;
14f9c5c9
AS
550 struct type *discr_type;
551
552 var_type = TYPE_FIELD_TYPE (type, field_num);
553 discr_type = ada_variant_discrim_type (var_type, outer_type);
554
78134374 555 if (var_type->code () == TYPE_CODE_PTR)
14f9c5c9
AS
556 {
557 var_type = TYPE_TARGET_TYPE (var_type);
78134374 558 if (var_type == NULL || var_type->code () != TYPE_CODE_UNION)
4c4b4cd2 559 return;
14f9c5c9
AS
560 }
561
4c4b4cd2
PH
562 par_type = ada_find_parallel_type (var_type, "___XVU");
563 if (par_type != NULL)
564 var_type = par_type;
565
1f704f76 566 for (i = 0; i < var_type->num_fields (); i += 1)
14f9c5c9
AS
567 {
568 fprintf_filtered (stream, "\n%*swhen ", level + 4, "");
83e3a93c
PH
569 if (print_choices (var_type, i, stream, discr_type))
570 {
571 if (print_record_field_types (TYPE_FIELD_TYPE (var_type, i),
79d43c61
TT
572 outer_type, stream, show, level + 4,
573 flags)
83e3a93c
PH
574 <= 0)
575 fprintf_filtered (stream, " null;");
576 }
577 else
578 print_selected_record_field_types (var_type, outer_type, i, i,
79d43c61 579 stream, show, level + 4, flags);
14f9c5c9
AS
580 }
581}
582
4c4b4cd2 583/* Assuming that field FIELD_NUM of TYPE is a variant part whose
14f9c5c9 584 discriminants are contained in OUTER_TYPE, print a description of it
4c4b4cd2
PH
585 on STREAM. LEVEL is the recursion (indentation) level, in case any of
586 the fields themselves have nested structure, and SHOW is the number of
587 levels of internal structure to show (see ada_print_type). For this
588 purpose, fields nested in a variant part are taken to be at the same
589 level as the fields immediately outside the variant part. */
14f9c5c9
AS
590
591static void
ebf56fd3 592print_variant_part (struct type *type, int field_num, struct type *outer_type,
79d43c61
TT
593 struct ui_file *stream, int show, int level,
594 const struct type_print_options *flags)
14f9c5c9 595{
6c71eb7d
TT
596 const char *variant
597 = ada_variant_discrim_name (TYPE_FIELD_TYPE (type, field_num));
598 if (*variant == '\0')
599 variant = "?";
600
601 fprintf_filtered (stream, "\n%*scase %s is", level + 4, "", variant);
d2e4a39e 602 print_variant_clauses (type, field_num, outer_type, stream, show,
79d43c61 603 level + 4, flags);
14f9c5c9
AS
604 fprintf_filtered (stream, "\n%*send case;", level + 4, "");
605}
606
83e3a93c
PH
607/* Print a description on STREAM of the fields FLD0 through FLD1 in
608 record or union type TYPE, whose discriminants are in OUTER_TYPE.
609 LEVEL is the recursion (indentation) level, in case any of the
610 fields themselves have nested structure, and SHOW is the number of
611 levels of internal structure to show (see ada_print_type). Does
feb864b7 612 not print parent type information of TYPE. Returns 0 if no fields
83e3a93c
PH
613 printed, -1 for an incomplete type, else > 0. Prints each field
614 beginning on a new line, but does not put a new line at end. */
14f9c5c9
AS
615
616static int
83e3a93c
PH
617print_selected_record_field_types (struct type *type, struct type *outer_type,
618 int fld0, int fld1,
79d43c61
TT
619 struct ui_file *stream, int show, int level,
620 const struct type_print_options *flags)
14f9c5c9 621{
83e3a93c 622 int i, flds;
14f9c5c9
AS
623
624 flds = 0;
14f9c5c9 625
83e3a93c 626 if (fld0 > fld1 && TYPE_STUB (type))
14f9c5c9
AS
627 return -1;
628
83e3a93c 629 for (i = fld0; i <= fld1; i += 1)
14f9c5c9
AS
630 {
631 QUIT;
632
d2e4a39e 633 if (ada_is_parent_field (type, i) || ada_is_ignored_field (type, i))
14f9c5c9
AS
634 ;
635 else if (ada_is_wrapper_field (type, i))
636 flds += print_record_field_types (TYPE_FIELD_TYPE (type, i), type,
79d43c61 637 stream, show, level, flags);
d2e4a39e 638 else if (ada_is_variant_part (type, i))
14f9c5c9 639 {
79d43c61 640 print_variant_part (type, i, outer_type, stream, show, level, flags);
14f9c5c9
AS
641 flds = 1;
642 }
643 else
644 {
645 flds += 1;
646 fprintf_filtered (stream, "\n%*s", level + 4, "");
647 ada_print_type (TYPE_FIELD_TYPE (type, i),
648 TYPE_FIELD_NAME (type, i),
79d43c61 649 stream, show - 1, level + 4, flags);
14f9c5c9
AS
650 fprintf_filtered (stream, ";");
651 }
652 }
653
654 return flds;
655}
656
d656f129
TT
657static void print_record_field_types_dynamic
658 (const gdb::array_view<variant_part> &parts,
659 int from, int to, struct type *type, struct ui_file *stream,
660 int show, int level, const struct type_print_options *flags);
661
662/* Print the choices encoded by VARIANT on STREAM. LEVEL is the
663 indentation level. The type of the discriminant for VARIANT is
664 given by DISR_TYPE. */
665
666static void
667print_choices (struct type *discr_type, const variant &variant,
668 struct ui_file *stream, int level)
669{
670 fprintf_filtered (stream, "\n%*swhen ", level, "");
671 if (variant.is_default ())
672 fprintf_filtered (stream, "others");
673 else
674 {
675 bool first = true;
676 for (const discriminant_range &range : variant.discriminants)
677 {
678 if (!first)
679 fprintf_filtered (stream, " | ");
680 first = false;
681
682 ada_print_scalar (discr_type, range.low, stream);
683 if (range.low != range.high)
684 ada_print_scalar (discr_type, range.high, stream);
685 }
686 }
687
688 fprintf_filtered (stream, " =>");
689}
690
691/* Print a single variant part, PART, on STREAM. TYPE is the
692 enclosing type. SHOW, LEVEL, and FLAGS are the usual type-printing
693 settings. This prints information about PART and the fields it
694 controls. It returns the index of the next field that should be
695 shown -- that is, one after the last field printed by this
696 call. */
697
698static int
699print_variant_part (const variant_part &part,
700 struct type *type, struct ui_file *stream,
701 int show, int level,
702 const struct type_print_options *flags)
703{
704 struct type *discr_type = nullptr;
705 const char *name;
706 if (part.discriminant_index == -1)
707 name = "?";
708 else
709 {
710 name = TYPE_FIELD_NAME (type, part.discriminant_index);
711 discr_type = TYPE_FIELD_TYPE (type, part.discriminant_index);
712 }
713
714 fprintf_filtered (stream, "\n%*scase %s is", level + 4, "", name);
715
716 int last_field = -1;
717 for (const variant &variant : part.variants)
718 {
719 print_choices (discr_type, variant, stream, level + 8);
720
721 if (variant.first_field == variant.last_field)
722 fprintf_filtered (stream, " null;");
723 else
724 {
725 print_record_field_types_dynamic (variant.parts,
726 variant.first_field,
727 variant.last_field, type, stream,
728 show, level + 8, flags);
729 last_field = variant.last_field;
730 }
731 }
732
733 fprintf_filtered (stream, "\n%*send case;", level + 4, "");
734
735 return last_field;
736}
737
738/* Print some fields of TYPE to STREAM. SHOW, LEVEL, and FLAGS are
739 the usual type-printing settings. PARTS is the array of variant
740 parts that correspond to the range of fields to be printed. FROM
741 and TO are the range of fields to print. */
742
743static void
744print_record_field_types_dynamic (const gdb::array_view<variant_part> &parts,
745 int from, int to,
746 struct type *type, struct ui_file *stream,
747 int show, int level,
748 const struct type_print_options *flags)
749{
750 int field = from;
751
752 for (const variant_part &part : parts)
753 {
754 if (part.variants.empty ())
755 continue;
756
757 /* Print any non-varying fields. */
758 int first_varying = part.variants[0].first_field;
759 print_selected_record_field_types (type, type, field,
760 first_varying - 1, stream,
761 show, level, flags);
762
763 field = print_variant_part (part, type, stream, show, level, flags);
764 }
765
766 /* Print any trailing fields that we were asked to print. */
767 print_selected_record_field_types (type, type, field, to - 1, stream, show,
768 level, flags);
769}
770
83e3a93c
PH
771/* Print a description on STREAM of all fields of record or union type
772 TYPE, as for print_selected_record_field_types, above. */
773
774static int
775print_record_field_types (struct type *type, struct type *outer_type,
79d43c61
TT
776 struct ui_file *stream, int show, int level,
777 const struct type_print_options *flags)
83e3a93c 778{
24e99c6c 779 struct dynamic_prop *prop = type->dyn_prop (DYN_PROP_VARIANT_PARTS);
d656f129
TT
780 if (prop != nullptr)
781 {
782 if (prop->kind == PROP_TYPE)
783 {
784 type = prop->data.original_type;
24e99c6c 785 prop = type->dyn_prop (DYN_PROP_VARIANT_PARTS);
d656f129
TT
786 }
787 gdb_assert (prop->kind == PROP_VARIANT_PARTS);
788 print_record_field_types_dynamic (*prop->data.variant_parts,
1f704f76 789 0, type->num_fields (),
d656f129 790 type, stream, show, level, flags);
1f704f76 791 return type->num_fields ();
d656f129
TT
792 }
793
83e3a93c 794 return print_selected_record_field_types (type, outer_type,
1f704f76 795 0, type->num_fields () - 1,
79d43c61 796 stream, show, level, flags);
83e3a93c
PH
797}
798
799
4c4b4cd2
PH
800/* Print record type TYPE on STREAM. LEVEL is the recursion (indentation)
801 level, in case the element type itself has nested structure, and SHOW is
802 the number of levels of internal structure to show (see ada_print_type). */
14f9c5c9
AS
803
804static void
d2e4a39e 805print_record_type (struct type *type0, struct ui_file *stream, int show,
79d43c61 806 int level, const struct type_print_options *flags)
14f9c5c9 807{
d2e4a39e
AS
808 struct type *parent_type;
809 struct type *type;
810
4c4b4cd2
PH
811 type = ada_find_parallel_type (type0, "___XVE");
812 if (type == NULL)
813 type = type0;
14f9c5c9
AS
814
815 parent_type = ada_parent_type (type);
d2e4a39e 816 if (ada_type_name (parent_type) != NULL)
25552254
JB
817 {
818 const char *parent_name = decoded_type_name (parent_type);
819
820 /* If we fail to decode the parent type name, then use the parent
821 type name as is. Not pretty, but should never happen except
822 when the debugging info is incomplete or incorrect. This
823 prevents a crash trying to print a NULL pointer. */
824 if (parent_name == NULL)
825 parent_name = ada_type_name (parent_type);
826 fprintf_filtered (stream, "new %s with record", parent_name);
827 }
4c4b4cd2 828 else if (parent_type == NULL && ada_is_tagged_type (type, 0))
0b48a291
PH
829 fprintf_filtered (stream, "tagged record");
830 else
831 fprintf_filtered (stream, "record");
14f9c5c9
AS
832
833 if (show < 0)
0b48a291 834 fprintf_filtered (stream, " ... end record");
14f9c5c9
AS
835 else
836 {
837 int flds;
838
839 flds = 0;
840 if (parent_type != NULL && ada_type_name (parent_type) == NULL)
d2e4a39e 841 flds += print_record_field_types (parent_type, parent_type,
79d43c61
TT
842 stream, show, level, flags);
843 flds += print_record_field_types (type, type, stream, show, level,
844 flags);
d2e4a39e 845
14f9c5c9 846 if (flds > 0)
0b48a291 847 fprintf_filtered (stream, "\n%*send record", level, "");
d2e4a39e 848 else if (flds < 0)
323e0a4a 849 fprintf_filtered (stream, _(" <incomplete type> end record"));
d2e4a39e 850 else
0b48a291 851 fprintf_filtered (stream, " null; end record");
14f9c5c9
AS
852 }
853}
854
855/* Print the unchecked union type TYPE in something resembling Ada
4c4b4cd2 856 format on STREAM. LEVEL is the recursion (indentation) level
14f9c5c9 857 in case the element type itself has nested structure, and SHOW is the
4c4b4cd2 858 number of levels of internal structure to show (see ada_print_type). */
14f9c5c9 859static void
d2e4a39e 860print_unchecked_union_type (struct type *type, struct ui_file *stream,
79d43c61
TT
861 int show, int level,
862 const struct type_print_options *flags)
14f9c5c9 863{
14f9c5c9 864 if (show < 0)
0b48a291 865 fprintf_filtered (stream, "record (?) is ... end record");
1f704f76 866 else if (type->num_fields () == 0)
0b48a291 867 fprintf_filtered (stream, "record (?) is null; end record");
14f9c5c9
AS
868 else
869 {
870 int i;
871
0b48a291 872 fprintf_filtered (stream, "record (?) is\n%*scase ? is", level + 4, "");
14f9c5c9 873
1f704f76 874 for (i = 0; i < type->num_fields (); i += 1)
14f9c5c9 875 {
0b48a291 876 fprintf_filtered (stream, "\n%*swhen ? =>\n%*s", level + 8, "",
d2e4a39e 877 level + 12, "");
14f9c5c9
AS
878 ada_print_type (TYPE_FIELD_TYPE (type, i),
879 TYPE_FIELD_NAME (type, i),
79d43c61 880 stream, show - 1, level + 12, flags);
14f9c5c9
AS
881 fprintf_filtered (stream, ";");
882 }
883
0b48a291 884 fprintf_filtered (stream, "\n%*send case;\n%*send record",
d2e4a39e 885 level + 4, "", level, "");
14f9c5c9
AS
886 }
887}
d2e4a39e 888
14f9c5c9
AS
889
890
891/* Print function or procedure type TYPE on STREAM. Make it a header
4c4b4cd2 892 for function or procedure NAME if NAME is not null. */
14f9c5c9
AS
893
894static void
79d43c61
TT
895print_func_type (struct type *type, struct ui_file *stream, const char *name,
896 const struct type_print_options *flags)
14f9c5c9 897{
1f704f76 898 int i, len = type->num_fields ();
14f9c5c9 899
7022349d 900 if (TYPE_TARGET_TYPE (type) != NULL
78134374 901 && TYPE_TARGET_TYPE (type)->code () == TYPE_CODE_VOID)
14f9c5c9
AS
902 fprintf_filtered (stream, "procedure");
903 else
904 fprintf_filtered (stream, "function");
905
d2e4a39e 906 if (name != NULL && name[0] != '\0')
ac8c53cc
PW
907 {
908 fputs_filtered (" ", stream);
909 fputs_styled (name, function_name_style.style (), stream);
910 }
14f9c5c9 911
d2e4a39e 912 if (len > 0)
14f9c5c9
AS
913 {
914 fprintf_filtered (stream, " (");
915 for (i = 0; i < len; i += 1)
916 {
917 if (i > 0)
918 {
919 fputs_filtered ("; ", stream);
920 wrap_here (" ");
921 }
d2e4a39e 922 fprintf_filtered (stream, "a%d: ", i + 1);
79d43c61
TT
923 ada_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0,
924 flags);
14f9c5c9
AS
925 }
926 fprintf_filtered (stream, ")");
d2e4a39e 927 }
14f9c5c9 928
7022349d
PA
929 if (TYPE_TARGET_TYPE (type) == NULL)
930 fprintf_filtered (stream, " return <unknown return type>");
78134374 931 else if (TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID)
14f9c5c9
AS
932 {
933 fprintf_filtered (stream, " return ");
79d43c61 934 ada_print_type (TYPE_TARGET_TYPE (type), "", stream, 0, 0, flags);
14f9c5c9
AS
935 }
936}
937
938
939/* Print a description of a type TYPE0.
940 Output goes to STREAM (via stdio).
941 If VARSTRING is a non-empty string, print as an Ada variable/field
942 declaration.
4c4b4cd2 943 SHOW+1 is the maximum number of levels of internal type structure
14f9c5c9
AS
944 to show (this applies to record types, enumerated types, and
945 array types).
946 SHOW is the number of levels of internal type structure to show
4c4b4cd2 947 when there is a type name for the SHOWth deepest level (0th is
14f9c5c9
AS
948 outer level).
949 When SHOW<0, no inner structure is shown.
4c4b4cd2 950 LEVEL indicates level of recursion (for nested definitions). */
14f9c5c9
AS
951
952void
25b524e8 953ada_print_type (struct type *type0, const char *varstring,
79d43c61
TT
954 struct ui_file *stream, int show, int level,
955 const struct type_print_options *flags)
14f9c5c9 956{
61ee279c 957 struct type *type = ada_check_typedef (ada_get_base_type (type0));
f192137b 958 char *type_name = decoded_type_name (type0);
14f9c5c9
AS
959 int is_var_decl = (varstring != NULL && varstring[0] != '\0');
960
961 if (type == NULL)
962 {
963 if (is_var_decl)
964 fprintf_filtered (stream, "%.*s: ",
d2e4a39e 965 ada_name_prefix_len (varstring), varstring);
7f6aba03 966 fprintf_styled (stream, metadata_style.style (), "<null type?>");
14f9c5c9
AS
967 return;
968 }
969
970 if (show > 0)
61ee279c 971 type = ada_check_typedef (type);
14f9c5c9 972
78134374 973 if (is_var_decl && type->code () != TYPE_CODE_FUNC)
d2e4a39e
AS
974 fprintf_filtered (stream, "%.*s: ",
975 ada_name_prefix_len (varstring), varstring);
14f9c5c9 976
d2d43431 977 if (type_name != NULL && show <= 0 && !ada_is_aligner_type (type))
14f9c5c9 978 {
d2e4a39e 979 fprintf_filtered (stream, "%.*s",
14f9c5c9
AS
980 ada_name_prefix_len (type_name), type_name);
981 return;
982 }
983
984 if (ada_is_aligner_type (type))
79d43c61 985 ada_print_type (ada_aligned_type (type), "", stream, show, level, flags);
d2d43431 986 else if (ada_is_constrained_packed_array_type (type)
78134374 987 && type->code () != TYPE_CODE_PTR)
79d43c61 988 print_array_type (type, stream, show, level, flags);
14f9c5c9 989 else
78134374 990 switch (type->code ())
d2e4a39e
AS
991 {
992 default:
993 fprintf_filtered (stream, "<");
79d43c61 994 c_print_type (type, "", stream, show, level, flags);
d2e4a39e
AS
995 fprintf_filtered (stream, ">");
996 break;
997 case TYPE_CODE_PTR:
720d1a40 998 case TYPE_CODE_TYPEDEF:
d2e4a39e 999 fprintf_filtered (stream, "access ");
79d43c61
TT
1000 ada_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level,
1001 flags);
d2e4a39e
AS
1002 break;
1003 case TYPE_CODE_REF:
1004 fprintf_filtered (stream, "<ref> ");
79d43c61
TT
1005 ada_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level,
1006 flags);
d2e4a39e
AS
1007 break;
1008 case TYPE_CODE_ARRAY:
79d43c61 1009 print_array_type (type, stream, show, level, flags);
d2e4a39e 1010 break;
690cc4eb
PH
1011 case TYPE_CODE_BOOL:
1012 fprintf_filtered (stream, "(false, true)");
1013 break;
d2e4a39e 1014 case TYPE_CODE_INT:
b2188a06
JB
1015 if (ada_is_gnat_encoded_fixed_point_type (type))
1016 print_gnat_encoded_fixed_point_type (type, stream);
d2e4a39e
AS
1017 else
1018 {
0d5cff50 1019 const char *name = ada_type_name (type);
5b4ee69b 1020
d2e4a39e 1021 if (!ada_is_range_type_name (name))
7f6aba03
TT
1022 fprintf_styled (stream, metadata_style.style (),
1023 _("<%s-byte integer>"),
1024 pulongest (TYPE_LENGTH (type)));
d2e4a39e
AS
1025 else
1026 {
1027 fprintf_filtered (stream, "range ");
fb151210 1028 print_range_type (type, stream, 1 /* bounds_prefered_p */);
d2e4a39e
AS
1029 }
1030 }
1031 break;
1032 case TYPE_CODE_RANGE:
b2188a06
JB
1033 if (ada_is_gnat_encoded_fixed_point_type (type))
1034 print_gnat_encoded_fixed_point_type (type, stream);
d2e4a39e 1035 else if (ada_is_modular_type (type))
529cad9c
PH
1036 fprintf_filtered (stream, "mod %s",
1037 int_string (ada_modulus (type), 10, 0, 0, 1));
d2e4a39e
AS
1038 else
1039 {
1040 fprintf_filtered (stream, "range ");
fb151210 1041 print_range (type, stream, 1 /* bounds_prefered_p */);
d2e4a39e
AS
1042 }
1043 break;
1044 case TYPE_CODE_FLT:
7f6aba03
TT
1045 fprintf_styled (stream, metadata_style.style (),
1046 _("<%s-byte float>"),
1047 pulongest (TYPE_LENGTH (type)));
d2e4a39e
AS
1048 break;
1049 case TYPE_CODE_ENUM:
1050 if (show < 0)
1051 fprintf_filtered (stream, "(...)");
1052 else
1053 print_enum_type (type, stream);
1054 break;
1055 case TYPE_CODE_STRUCT:
4c4b4cd2 1056 if (ada_is_array_descriptor_type (type))
79d43c61 1057 print_array_type (type, stream, show, level, flags);
d2e4a39e
AS
1058 else if (ada_is_bogus_array_descriptor (type))
1059 fprintf_filtered (stream,
e1d5a0d2 1060 _("array (?) of ? (<mal-formed descriptor>)"));
d2e4a39e 1061 else
79d43c61 1062 print_record_type (type, stream, show, level, flags);
d2e4a39e
AS
1063 break;
1064 case TYPE_CODE_UNION:
79d43c61 1065 print_unchecked_union_type (type, stream, show, level, flags);
d2e4a39e
AS
1066 break;
1067 case TYPE_CODE_FUNC:
79d43c61 1068 print_func_type (type, stream, varstring, flags);
d2e4a39e
AS
1069 break;
1070 }
14f9c5c9 1071}
be942545
JB
1072
1073/* Implement the la_print_typedef language method for Ada. */
1074
1075void
1076ada_print_typedef (struct type *type, struct symbol *new_symbol,
1077 struct ui_file *stream)
1078{
1079 type = ada_check_typedef (type);
79d43c61 1080 ada_print_type (type, "", stream, 0, 0, &type_print_raw_options);
be942545 1081}
This page took 1.088983 seconds and 4 git commands to generate.