]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/ada-valprint.c
* ada-lang.c (ada_array_bound, ada_type_match,
[thirdparty/binutils-gdb.git] / gdb / ada-valprint.c
CommitLineData
14f9c5c9
AS
1/* Support for printing Ada values for GDB, the GNU debugger.
2 Copyright 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1997, 2001
3 Free Software Foundation, Inc.
4
5This file is part of GDB.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21#include <ctype.h>
22#include "defs.h"
23#include "symtab.h"
24#include "gdbtypes.h"
25#include "expression.h"
26#include "value.h"
27#include "demangle.h"
28#include "valprint.h"
29#include "language.h"
30#include "annotate.h"
31#include "ada-lang.h"
32#include "c-lang.h"
33
34/* Encapsulates arguments to ada_val_print. */
d2e4a39e
AS
35struct ada_val_print_args
36{
37 struct type *type;
38 char *valaddr0;
14f9c5c9
AS
39 int embedded_offset;
40 CORE_ADDR address;
41 struct ui_file *stream;
42 int format;
43 int deref_ref;
44 int recurse;
45 enum val_prettyprint pretty;
46};
47
48extern int inspect_it;
49extern unsigned int repeat_count_threshold;
50
d2e4a39e 51static void print_record (struct type *, char *, struct ui_file *, int,
14f9c5c9
AS
52 int, enum val_prettyprint);
53
d2e4a39e 54static int print_field_values (struct type *, char *, struct ui_file *,
14f9c5c9 55 int, int, enum val_prettyprint,
d2e4a39e 56 int, struct type *, char *);
14f9c5c9 57
d2e4a39e
AS
58static int print_variant_part (struct type *, int, char *,
59 struct ui_file *, int, int,
60 enum val_prettyprint, int, struct type *,
61 char *);
14f9c5c9 62
d2e4a39e
AS
63static void val_print_packed_array_elements (struct type *, char *valaddr,
64 int, struct ui_file *, int, int,
3b19021e 65 enum val_prettyprint);
14f9c5c9 66
d2e4a39e 67static void adjust_type_signedness (struct type *);
14f9c5c9
AS
68
69static int ada_val_print_stub (PTR args0);
70
d2e4a39e
AS
71static int ada_val_print_1 (struct type *, char *, int, CORE_ADDR,
72 struct ui_file *, int, int, int,
73 enum val_prettyprint);
14f9c5c9
AS
74\f
75
76/* Make TYPE unsigned if its range of values includes no negatives. */
d2e4a39e 77static void
4dc81987 78adjust_type_signedness (struct type *type)
14f9c5c9 79{
d2e4a39e 80 if (type != NULL && TYPE_CODE (type) == TYPE_CODE_RANGE
14f9c5c9
AS
81 && TYPE_LOW_BOUND (type) >= 0)
82 TYPE_FLAGS (type) |= TYPE_FLAG_UNSIGNED;
d2e4a39e 83}
14f9c5c9
AS
84
85/* Assuming TYPE is a simple array type, prints its lower bound on STREAM,
86 if non-standard (i.e., other than 1 for numbers, other than lower bound
87 of index type for enumerated type). Returns 1 if something printed,
88 otherwise 0. */
89
d2e4a39e 90static int
ebf56fd3 91print_optional_low_bound (struct ui_file *stream, struct type *type)
14f9c5c9
AS
92{
93 struct type *index_type;
94 long low_bound;
95
96 index_type = TYPE_INDEX_TYPE (type);
97 low_bound = 0;
98
99 if (index_type == NULL)
100 return 0;
d2e4a39e 101 if (TYPE_CODE (index_type) == TYPE_CODE_RANGE)
14f9c5c9
AS
102 {
103 low_bound = TYPE_LOW_BOUND (index_type);
104 index_type = TYPE_TARGET_TYPE (index_type);
105 }
106 else
107 return 0;
d2e4a39e
AS
108
109 switch (TYPE_CODE (index_type))
110 {
111 case TYPE_CODE_ENUM:
112 if (low_bound == TYPE_FIELD_BITPOS (index_type, 0))
113 return 0;
114 break;
115 case TYPE_CODE_UNDEF:
116 index_type = builtin_type_long;
117 /* FALL THROUGH */
118 default:
119 if (low_bound == 1)
120 return 0;
121 break;
122 }
14f9c5c9
AS
123
124 ada_print_scalar (index_type, (LONGEST) low_bound, stream);
125 fprintf_filtered (stream, " => ");
126 return 1;
127}
128
129/* Version of val_print_array_elements for GNAT-style packed arrays.
130 Prints elements of packed array of type TYPE at bit offset
131 BITOFFSET from VALADDR on STREAM. Formats according to FORMAT and
132 separates with commas. RECURSE is the recursion (nesting) level.
133 If PRETTY, uses "prettier" format. TYPE must have been decoded (as
d2e4a39e 134 by ada_coerce_to_simple_array). */
14f9c5c9
AS
135
136static void
ebf56fd3
AS
137val_print_packed_array_elements (struct type *type, char *valaddr,
138 int bitoffset, struct ui_file *stream,
139 int format, int recurse,
140 enum val_prettyprint pretty)
14f9c5c9
AS
141{
142 unsigned int i;
143 unsigned int things_printed = 0;
144 unsigned len;
145 struct type *elttype;
146 unsigned eltlen;
147 /* Position of the array element we are examining to see
148 whether it is repeated. */
149 unsigned int rep1;
150 /* Number of repetitions we have detected so far. */
151 unsigned int reps;
152 unsigned long bitsize = TYPE_FIELD_BITSIZE (type, 0);
d2e4a39e
AS
153 struct value *mark = value_mark ();
154
14f9c5c9
AS
155 elttype = TYPE_TARGET_TYPE (type);
156 eltlen = TYPE_LENGTH (check_typedef (elttype));
157
158 {
159 LONGEST low, high;
160 if (get_discrete_bounds (TYPE_FIELD_TYPE (type, 0), &low, &high) < 0)
161 len = 1;
162 else
163 len = high - low + 1;
164 }
165
166 i = 0;
167 annotate_array_section_begin (i, elttype);
168
169 while (i < len && things_printed < print_max)
170 {
171 struct value *v0, *v1;
172 int i0;
173
174 if (i != 0)
175 {
176 if (prettyprint_arrays)
177 {
178 fprintf_filtered (stream, ",\n");
179 print_spaces_filtered (2 + 2 * recurse, stream);
180 }
181 else
182 {
183 fprintf_filtered (stream, ", ");
184 }
185 }
186 wrap_here (n_spaces (2 + 2 * recurse));
187
188 i0 = i;
d2e4a39e 189 v0 = ada_value_primitive_packed_val (NULL, valaddr,
14f9c5c9
AS
190 (i0 * bitsize) / HOST_CHAR_BIT,
191 (i0 * bitsize) % HOST_CHAR_BIT,
192 bitsize, elttype);
193 while (1)
194 {
195 i += 1;
196 if (i >= len)
197 break;
d2e4a39e 198 v1 = ada_value_primitive_packed_val (NULL, valaddr,
14f9c5c9
AS
199 (i * bitsize) / HOST_CHAR_BIT,
200 (i * bitsize) % HOST_CHAR_BIT,
201 bitsize, elttype);
d2e4a39e 202 if (memcmp (VALUE_CONTENTS (v0), VALUE_CONTENTS (v1), eltlen) != 0)
14f9c5c9
AS
203 break;
204 }
205
206 if (i - i0 > repeat_count_threshold)
207 {
208 val_print (elttype, VALUE_CONTENTS (v0), 0, 0, stream, format,
209 0, recurse + 1, pretty);
210 annotate_elt_rep (i - i0);
211 fprintf_filtered (stream, " <repeats %u times>", i - i0);
212 annotate_elt_rep_end ();
213
214 }
215 else
216 {
217 int j;
218 for (j = i0; j < i; j += 1)
219 {
d2e4a39e 220 if (j > i0)
14f9c5c9
AS
221 {
222 if (prettyprint_arrays)
223 {
224 fprintf_filtered (stream, ",\n");
225 print_spaces_filtered (2 + 2 * recurse, stream);
226 }
227 else
228 {
229 fprintf_filtered (stream, ", ");
230 }
231 wrap_here (n_spaces (2 + 2 * recurse));
232 }
233 val_print (elttype, VALUE_CONTENTS (v0), 0, 0, stream, format,
234 0, recurse + 1, pretty);
235 annotate_elt ();
236 }
237 }
238 things_printed += i - i0;
239 }
240 annotate_array_section_end ();
241 if (i < len)
242 {
243 fprintf_filtered (stream, "...");
244 }
245
246 value_free_to_mark (mark);
247}
248
d2e4a39e
AS
249static struct type *
250printable_val_type (struct type *type, char *valaddr)
14f9c5c9
AS
251{
252 return ada_to_fixed_type (ada_aligned_type (type), valaddr, 0, NULL);
253}
254
255/* Print the character C on STREAM as part of the contents of a literal
256 string whose delimiter is QUOTER. TYPE_LEN is the length in bytes
257 (1 or 2) of the character. */
258
259void
ebf56fd3 260ada_emit_char (int c, struct ui_file *stream, int quoter, int type_len)
14f9c5c9
AS
261{
262 if (type_len != 2)
263 type_len = 1;
264
265 c &= (1 << (type_len * TARGET_CHAR_BIT)) - 1;
266
267 if (isascii (c) && isprint (c))
268 {
269 if (c == quoter && c == '"')
270 fprintf_filtered (stream, "[\"%c\"]", quoter);
271 else
272 fprintf_filtered (stream, "%c", c);
273 }
274 else
d2e4a39e 275 fprintf_filtered (stream, "[\"%0*x\"]", type_len * 2, c);
14f9c5c9
AS
276}
277
278/* Character #I of STRING, given that TYPE_LEN is the size in bytes (1
279 or 2) of a character. */
280
281static int
d2e4a39e 282char_at (char *string, int i, int type_len)
14f9c5c9
AS
283{
284 if (type_len == 1)
285 return string[i];
d2e4a39e
AS
286 else
287 return (int) extract_unsigned_integer (string + 2 * i, 2);
14f9c5c9
AS
288}
289
290void
ebf56fd3 291ada_printchar (int c, struct ui_file *stream)
14f9c5c9
AS
292{
293 fputs_filtered ("'", stream);
294 ada_emit_char (c, stream, '\'', 1);
295 fputs_filtered ("'", stream);
296}
297
298/* [From print_type_scalar in typeprint.c]. Print VAL on STREAM in a
299 form appropriate for TYPE. */
300
301void
ebf56fd3 302ada_print_scalar (struct type *type, LONGEST val, struct ui_file *stream)
14f9c5c9
AS
303{
304 unsigned int i;
305 unsigned len;
306
307 CHECK_TYPEDEF (type);
308
309 switch (TYPE_CODE (type))
310 {
311
312 case TYPE_CODE_ENUM:
313 len = TYPE_NFIELDS (type);
314 for (i = 0; i < len; i++)
315 {
316 if (TYPE_FIELD_BITPOS (type, i) == val)
317 {
318 break;
319 }
320 }
321 if (i < len)
322 {
323 fputs_filtered (ada_enum_name (TYPE_FIELD_NAME (type, i)), stream);
324 }
325 else
326 {
327 print_longest (stream, 'd', 0, val);
328 }
329 break;
330
331 case TYPE_CODE_INT:
332 print_longest (stream, TYPE_UNSIGNED (type) ? 'u' : 'd', 0, val);
333 break;
334
335 case TYPE_CODE_CHAR:
336 LA_PRINT_CHAR ((unsigned char) val, stream);
337 break;
338
339 case TYPE_CODE_BOOL:
340 fprintf_filtered (stream, val ? "true" : "false");
341 break;
342
343 case TYPE_CODE_RANGE:
344 ada_print_scalar (TYPE_TARGET_TYPE (type), val, stream);
345 return;
346
347 case TYPE_CODE_UNDEF:
348 case TYPE_CODE_PTR:
349 case TYPE_CODE_ARRAY:
350 case TYPE_CODE_STRUCT:
351 case TYPE_CODE_UNION:
352 case TYPE_CODE_FUNC:
353 case TYPE_CODE_FLT:
354 case TYPE_CODE_VOID:
355 case TYPE_CODE_SET:
356 case TYPE_CODE_STRING:
357 case TYPE_CODE_ERROR:
358 case TYPE_CODE_MEMBER:
359 case TYPE_CODE_METHOD:
360 case TYPE_CODE_REF:
361 warning ("internal error: unhandled type in ada_print_scalar");
362 break;
363
364 default:
365 error ("Invalid type code in symbol table.");
366 }
367 gdb_flush (stream);
368}
369
370/* Print the character string STRING, printing at most LENGTH characters.
371 Printing stops early if the number hits print_max; repeat counts
372 are printed as appropriate. Print ellipses at the end if we
373 had to stop before printing LENGTH characters, or if
374 FORCE_ELLIPSES. TYPE_LEN is the length (1 or 2) of the character type.
375 */
376
377static void
ebf56fd3
AS
378printstr (struct ui_file *stream, char *string, unsigned int length,
379 int force_ellipses, int type_len)
14f9c5c9
AS
380{
381 unsigned int i;
382 unsigned int things_printed = 0;
383 int in_quotes = 0;
384 int need_comma = 0;
385
386 if (length == 0)
387 {
388 fputs_filtered ("\"\"", stream);
389 return;
390 }
391
392 for (i = 0; i < length && things_printed < print_max; i += 1)
393 {
394 /* Position of the character we are examining
d2e4a39e 395 to see whether it is repeated. */
14f9c5c9
AS
396 unsigned int rep1;
397 /* Number of repetitions we have detected so far. */
398 unsigned int reps;
399
400 QUIT;
401
402 if (need_comma)
403 {
404 fputs_filtered (", ", stream);
405 need_comma = 0;
406 }
407
408 rep1 = i + 1;
409 reps = 1;
d2e4a39e
AS
410 while (rep1 < length &&
411 char_at (string, rep1, type_len) == char_at (string, i,
412 type_len))
14f9c5c9
AS
413 {
414 rep1 += 1;
415 reps += 1;
416 }
417
418 if (reps > repeat_count_threshold)
419 {
420 if (in_quotes)
421 {
422 if (inspect_it)
423 fputs_filtered ("\\\", ", stream);
424 else
425 fputs_filtered ("\", ", stream);
426 in_quotes = 0;
427 }
428 fputs_filtered ("'", stream);
d2e4a39e
AS
429 ada_emit_char (char_at (string, i, type_len), stream, '\'',
430 type_len);
14f9c5c9
AS
431 fputs_filtered ("'", stream);
432 fprintf_filtered (stream, " <repeats %u times>", reps);
433 i = rep1 - 1;
434 things_printed += repeat_count_threshold;
435 need_comma = 1;
436 }
437 else
438 {
439 if (!in_quotes)
440 {
441 if (inspect_it)
442 fputs_filtered ("\\\"", stream);
443 else
444 fputs_filtered ("\"", stream);
445 in_quotes = 1;
446 }
447 ada_emit_char (char_at (string, i, type_len), stream, '"',
448 type_len);
449 things_printed += 1;
450 }
451 }
452
453 /* Terminate the quotes if necessary. */
454 if (in_quotes)
455 {
456 if (inspect_it)
457 fputs_filtered ("\\\"", stream);
458 else
459 fputs_filtered ("\"", stream);
460 }
461
462 if (force_ellipses || i < length)
463 fputs_filtered ("...", stream);
464}
465
466void
ebf56fd3
AS
467ada_printstr (struct ui_file *stream, char *string, unsigned int length,
468 int force_ellipses, int width)
14f9c5c9
AS
469{
470 printstr (stream, string, length, force_ellipses, width);
471}
472
473
474/* Print data of type TYPE located at VALADDR (within GDB), which came from
475 the inferior at address ADDRESS, onto stdio stream STREAM according to
476 FORMAT (a letter as for the printf % codes or 0 for natural format).
477 The data at VALADDR is in target byte order.
478
479 If the data is printed as a string, returns the number of string characters
480 printed.
481
482 If DEREF_REF is nonzero, then dereference references, otherwise just print
483 them like pointers.
484
485 RECURSE indicates the amount of indentation to supply before
486 continuation lines; this amount is roughly twice the value of RECURSE.
487
488 When PRETTY is non-zero, prints record fields on separate lines.
489 (For some reason, the current version of gdb instead uses a global
490 variable---prettyprint_arrays--- to causes a similar effect on
491 arrays.) */
492
493int
d2e4a39e 494ada_val_print (struct type *type, char *valaddr0, int embedded_offset,
ebf56fd3
AS
495 CORE_ADDR address, struct ui_file *stream, int format,
496 int deref_ref, int recurse, enum val_prettyprint pretty)
14f9c5c9
AS
497{
498 struct ada_val_print_args args;
d2e4a39e
AS
499 args.type = type;
500 args.valaddr0 = valaddr0;
14f9c5c9
AS
501 args.embedded_offset = embedded_offset;
502 args.address = address;
503 args.stream = stream;
504 args.format = format;
505 args.deref_ref = deref_ref;
506 args.recurse = recurse;
507 args.pretty = pretty;
508
509 return catch_errors (ada_val_print_stub, &args, NULL, RETURN_MASK_ALL);
510}
511
512/* Helper for ada_val_print; used as argument to catch_errors to
513 unmarshal the arguments to ada_val_print_1, which does the work. */
514static int
515ada_val_print_stub (PTR args0)
516{
d2e4a39e
AS
517 struct ada_val_print_args *argsp = (struct ada_val_print_args *) args0;
518 return ada_val_print_1 (argsp->type, argsp->valaddr0,
519 argsp->embedded_offset, argsp->address,
520 argsp->stream, argsp->format, argsp->deref_ref,
521 argsp->recurse, argsp->pretty);
14f9c5c9
AS
522}
523
524/* See the comment on ada_val_print. This function differs in that it
525 * does not catch evaluation errors (leaving that to ada_val_print). */
526
527static int
d2e4a39e 528ada_val_print_1 (struct type *type, char *valaddr0, int embedded_offset,
ebf56fd3
AS
529 CORE_ADDR address, struct ui_file *stream, int format,
530 int deref_ref, int recurse, enum val_prettyprint pretty)
14f9c5c9
AS
531{
532 unsigned int len;
533 int i;
534 struct type *elttype;
535 unsigned int eltlen;
536 LONGEST val;
537 CORE_ADDR addr;
d2e4a39e 538 char *valaddr = valaddr0 + embedded_offset;
14f9c5c9
AS
539
540 CHECK_TYPEDEF (type);
541
542 if (ada_is_array_descriptor (type) || ada_is_packed_array_type (type))
543 {
544 int retn;
d2e4a39e
AS
545 struct value *mark = value_mark ();
546 struct value *val;
14f9c5c9
AS
547 val = value_from_contents_and_address (type, valaddr, address);
548 val = ada_coerce_to_simple_array_ptr (val);
549 if (val == NULL)
550 {
551 fprintf_filtered (stream, "(null)");
552 retn = 0;
553 }
554 else
555 retn = ada_val_print_1 (VALUE_TYPE (val), VALUE_CONTENTS (val), 0,
d2e4a39e 556 VALUE_ADDRESS (val), stream, format,
14f9c5c9
AS
557 deref_ref, recurse, pretty);
558 value_free_to_mark (mark);
559 return retn;
560 }
561
562 valaddr = ada_aligned_value_addr (type, valaddr);
563 embedded_offset -= valaddr - valaddr0 - embedded_offset;
564 type = printable_val_type (type, valaddr);
565
566 switch (TYPE_CODE (type))
567 {
568 default:
d2e4a39e 569 return c_val_print (type, valaddr0, embedded_offset, address, stream,
14f9c5c9
AS
570 format, deref_ref, recurse, pretty);
571
572 case TYPE_CODE_INT:
573 case TYPE_CODE_RANGE:
574 if (ada_is_fixed_point_type (type))
575 {
576 LONGEST v = unpack_long (type, valaddr);
577 int len = TYPE_LENGTH (type);
578
579 fprintf_filtered (stream, len < 4 ? "%.11g" : "%.17g",
580 (double) ada_fixed_to_float (type, v));
581 return 0;
582 }
583 else if (ada_is_vax_floating_type (type))
584 {
d2e4a39e 585 struct value *val =
14f9c5c9 586 value_from_contents_and_address (type, valaddr, address);
d2e4a39e 587 struct value *func = ada_vax_float_print_function (type);
14f9c5c9
AS
588 if (func != 0)
589 {
d2e4a39e
AS
590 static struct type *parray_of_char = NULL;
591 struct value *printable_val;
592
593 if (parray_of_char == NULL)
594 parray_of_char =
595 make_pointer_type
596 (create_array_type
597 (NULL, builtin_type_char,
598 create_range_type (NULL, builtin_type_int, 0, 32)), NULL);
599
600 printable_val =
14f9c5c9 601 value_ind (value_cast (parray_of_char,
d2e4a39e
AS
602 call_function_by_hand (func, 1,
603 &val)));
604
14f9c5c9
AS
605 fprintf_filtered (stream, "%s", VALUE_CONTENTS (printable_val));
606 return 0;
607 }
608 /* No special printing function. Do as best we can. */
609 }
610 else if (TYPE_CODE (type) == TYPE_CODE_RANGE)
611 {
d2e4a39e 612 struct type *target_type = TYPE_TARGET_TYPE (type);
14f9c5c9
AS
613 if (TYPE_LENGTH (type) != TYPE_LENGTH (target_type))
614 {
615 /* Obscure case of range type that has different length from
d2e4a39e
AS
616 its base type. Perform a conversion, or we will get a
617 nonsense value. Actually, we could use the same
618 code regardless of lengths; I'm just avoiding a cast. */
619 struct value *v = value_cast (target_type,
620 value_from_contents_and_address
621 (type, valaddr, 0));
14f9c5c9
AS
622 return ada_val_print_1 (target_type, VALUE_CONTENTS (v), 0, 0,
623 stream, format, 0, recurse + 1, pretty);
624 }
625 else
d2e4a39e 626 return ada_val_print_1 (TYPE_TARGET_TYPE (type),
14f9c5c9 627 valaddr0, embedded_offset,
d2e4a39e 628 address, stream, format, deref_ref,
14f9c5c9
AS
629 recurse, pretty);
630 }
d2e4a39e 631 else
14f9c5c9
AS
632 {
633 format = format ? format : output_format;
634 if (format)
635 {
636 print_scalar_formatted (valaddr, type, format, 0, stream);
637 }
638 else
639 {
640 val_print_type_code_int (type, valaddr, stream);
641 if (ada_is_character_type (type))
642 {
643 fputs_filtered (" ", stream);
644 ada_printchar ((unsigned char) unpack_long (type, valaddr),
645 stream);
646 }
647 }
648 return 0;
649 }
650
651 case TYPE_CODE_ENUM:
652 if (format)
653 {
654 print_scalar_formatted (valaddr, type, format, 0, stream);
655 break;
656 }
657 len = TYPE_NFIELDS (type);
658 val = unpack_long (type, valaddr);
659 for (i = 0; i < len; i++)
660 {
661 QUIT;
662 if (val == TYPE_FIELD_BITPOS (type, i))
663 {
664 break;
665 }
666 }
667 if (i < len)
668 {
d2e4a39e
AS
669 const char *name = ada_enum_name (TYPE_FIELD_NAME (type, i));
670 if (name[0] == '\'')
14f9c5c9
AS
671 fprintf_filtered (stream, "%ld %s", (long) val, name);
672 else
673 fputs_filtered (name, stream);
674 }
675 else
676 {
677 print_longest (stream, 'd', 0, val);
678 }
679 break;
d2e4a39e 680
14f9c5c9
AS
681 case TYPE_CODE_UNION:
682 case TYPE_CODE_STRUCT:
683 if (ada_is_bogus_array_descriptor (type))
684 {
685 fprintf_filtered (stream, "(...?)");
686 return 0;
d2e4a39e 687 }
14f9c5c9
AS
688 else
689 {
d2e4a39e 690 print_record (type, valaddr, stream, format, recurse, pretty);
14f9c5c9
AS
691 return 0;
692 }
693
694 case TYPE_CODE_ARRAY:
695 if (TYPE_LENGTH (type) > 0 && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0)
696 {
697 elttype = TYPE_TARGET_TYPE (type);
698 eltlen = TYPE_LENGTH (elttype);
699 len = TYPE_LENGTH (type) / eltlen;
d2e4a39e 700
14f9c5c9 701 /* For an array of chars, print with string syntax. */
d2e4a39e 702 if (ada_is_string_type (type) && (format == 0 || format == 's'))
14f9c5c9
AS
703 {
704 if (prettyprint_arrays)
705 {
706 print_spaces_filtered (2 + 2 * recurse, stream);
707 }
708 /* If requested, look for the first null char and only print
d2e4a39e 709 elements up to it. */
14f9c5c9
AS
710 if (stop_print_at_null)
711 {
712 int temp_len;
d2e4a39e 713
14f9c5c9
AS
714 /* Look for a NULL char. */
715 for (temp_len = 0;
716 temp_len < len && temp_len < print_max
717 && char_at (valaddr, temp_len, eltlen) != 0;
718 temp_len += 1);
719 len = temp_len;
720 }
d2e4a39e 721
14f9c5c9
AS
722 printstr (stream, valaddr, len, 0, eltlen);
723 }
724 else
725 {
726 len = 0;
727 fprintf_filtered (stream, "(");
728 print_optional_low_bound (stream, type);
d2e4a39e 729 if (TYPE_FIELD_BITSIZE (type, 0) > 0)
14f9c5c9 730 val_print_packed_array_elements (type, valaddr, 0, stream,
d2e4a39e 731 format, recurse, pretty);
14f9c5c9
AS
732 else
733 val_print_array_elements (type, valaddr, address, stream,
734 format, deref_ref, recurse,
735 pretty, 0);
736 fprintf_filtered (stream, ")");
737 }
738 gdb_flush (stream);
739 return len;
740 }
741
742 case TYPE_CODE_REF:
743 elttype = check_typedef (TYPE_TARGET_TYPE (type));
744 if (addressprint)
d2e4a39e 745 {
14f9c5c9
AS
746 fprintf_filtered (stream, "@");
747 print_address_numeric
748 (extract_address (valaddr,
749 TARGET_PTR_BIT / HOST_CHAR_BIT), 1, stream);
750 if (deref_ref)
751 fputs_filtered (": ", stream);
d2e4a39e 752 }
14f9c5c9
AS
753 /* De-reference the reference */
754 if (deref_ref)
755 {
756 if (TYPE_CODE (elttype) != TYPE_CODE_UNDEF)
757 {
d2e4a39e
AS
758 LONGEST deref_val_int = (LONGEST)
759 unpack_pointer (lookup_pointer_type (builtin_type_void),
14f9c5c9 760 valaddr);
d2e4a39e 761 if (deref_val_int != 0)
14f9c5c9 762 {
d2e4a39e
AS
763 struct value *deref_val =
764 ada_value_ind (value_from_longest
765 (lookup_pointer_type (elttype),
14f9c5c9
AS
766 deref_val_int));
767 val_print (VALUE_TYPE (deref_val),
768 VALUE_CONTENTS (deref_val), 0,
769 VALUE_ADDRESS (deref_val), stream, format,
770 deref_ref, recurse + 1, pretty);
771 }
772 else
773 fputs_filtered ("(null)", stream);
774 }
775 else
776 fputs_filtered ("???", stream);
777 }
778 break;
779 }
780 return 0;
781}
782
783static int
ebf56fd3
AS
784print_variant_part (struct type *type, int field_num, char *valaddr,
785 struct ui_file *stream, int format, int recurse,
786 enum val_prettyprint pretty, int comma_needed,
787 struct type *outer_type, char *outer_valaddr)
14f9c5c9
AS
788{
789 struct type *var_type = TYPE_FIELD_TYPE (type, field_num);
d2e4a39e 790 int which = ada_which_variant_applies (var_type, outer_type, outer_valaddr);
14f9c5c9
AS
791
792 if (which < 0)
793 return 0;
794 else
d2e4a39e 795 return print_field_values
14f9c5c9
AS
796 (TYPE_FIELD_TYPE (var_type, which),
797 valaddr + TYPE_FIELD_BITPOS (type, field_num) / HOST_CHAR_BIT
798 + TYPE_FIELD_BITPOS (var_type, which) / HOST_CHAR_BIT,
799 stream, format, recurse, pretty,
800 comma_needed, outer_type, outer_valaddr);
801}
802
803int
d2e4a39e 804ada_value_print (struct value *val0, struct ui_file *stream, int format,
ebf56fd3 805 enum val_prettyprint pretty)
14f9c5c9 806{
d2e4a39e 807 char *valaddr = VALUE_CONTENTS (val0);
14f9c5c9 808 CORE_ADDR address = VALUE_ADDRESS (val0) + VALUE_OFFSET (val0);
d2e4a39e 809 struct type *type =
14f9c5c9 810 ada_to_fixed_type (VALUE_TYPE (val0), valaddr, address, NULL);
d2e4a39e
AS
811 struct value *val =
812 value_from_contents_and_address (type, valaddr, address);
14f9c5c9
AS
813
814 /* If it is a pointer, indicate what it points to. */
d2e4a39e 815 if (TYPE_CODE (type) == TYPE_CODE_PTR || TYPE_CODE (type) == TYPE_CODE_REF)
14f9c5c9
AS
816 {
817 /* Hack: remove (char *) for char strings. Their
d2e4a39e 818 type is indicated by the quoted string anyway. */
14f9c5c9 819 if (TYPE_CODE (type) == TYPE_CODE_PTR &&
d2e4a39e 820 TYPE_LENGTH (TYPE_TARGET_TYPE (type)) == sizeof (char) &&
14f9c5c9
AS
821 TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_INT &&
822 !TYPE_UNSIGNED (TYPE_TARGET_TYPE (type)))
823 {
824 /* Print nothing */
825 }
826 else
827 {
828 fprintf_filtered (stream, "(");
829 type_print (type, "", stream, -1);
830 fprintf_filtered (stream, ") ");
831 }
832 }
d2e4a39e 833 else if (ada_is_array_descriptor (type))
14f9c5c9
AS
834 {
835 fprintf_filtered (stream, "(");
836 type_print (type, "", stream, -1);
837 fprintf_filtered (stream, ") ");
838 }
839 else if (ada_is_bogus_array_descriptor (type))
840 {
841 fprintf_filtered (stream, "(");
842 type_print (type, "", stream, -1);
843 fprintf_filtered (stream, ") (...?)");
844 return 0;
845 }
d2e4a39e 846 return (val_print (type, VALUE_CONTENTS (val), 0, address,
14f9c5c9
AS
847 stream, format, 1, 0, pretty));
848}
d2e4a39e 849
14f9c5c9 850static void
ebf56fd3
AS
851print_record (struct type *type, char *valaddr, struct ui_file *stream,
852 int format, int recurse, enum val_prettyprint pretty)
14f9c5c9
AS
853{
854 CHECK_TYPEDEF (type);
855
856 fprintf_filtered (stream, "(");
857
858 if (print_field_values (type, valaddr, stream, format, recurse, pretty,
d2e4a39e 859 0, type, valaddr) != 0 && pretty)
14f9c5c9
AS
860 {
861 fprintf_filtered (stream, "\n");
862 print_spaces_filtered (2 * recurse, stream);
863 }
864
865 fprintf_filtered (stream, ")");
866}
867
868/* Print out fields of value at VALADDR having structure type TYPE.
869
870 TYPE, VALADDR, STREAM, FORMAT, RECURSE, and PRETTY have the
871 same meanings as in ada_print_value and ada_val_print.
872
873 OUTER_TYPE and OUTER_VALADDR give type and address of enclosing record
874 (used to get discriminant values when printing variant parts).
875
876 COMMA_NEEDED is 1 if fields have been printed at the current recursion
877 level, so that a comma is needed before any field printed by this
878 call.
879
880 Returns 1 if COMMA_NEEDED or any fields were printed. */
881
882static int
ebf56fd3
AS
883print_field_values (struct type *type, char *valaddr, struct ui_file *stream,
884 int format, int recurse, enum val_prettyprint pretty,
885 int comma_needed, struct type *outer_type,
886 char *outer_valaddr)
14f9c5c9
AS
887{
888 int i, len;
889
890 len = TYPE_NFIELDS (type);
891
892 for (i = 0; i < len; i += 1)
893 {
894 if (ada_is_ignored_field (type, i))
d2e4a39e 895 continue;
14f9c5c9
AS
896
897 if (ada_is_wrapper_field (type, i))
898 {
d2e4a39e 899 comma_needed =
14f9c5c9 900 print_field_values (TYPE_FIELD_TYPE (type, i),
d2e4a39e 901 valaddr
14f9c5c9
AS
902 + TYPE_FIELD_BITPOS (type, i) / HOST_CHAR_BIT,
903 stream, format, recurse, pretty,
904 comma_needed, type, valaddr);
905 continue;
906 }
907 else if (ada_is_variant_part (type, i))
908 {
909 comma_needed =
910 print_variant_part (type, i, valaddr,
911 stream, format, recurse, pretty, comma_needed,
912 outer_type, outer_valaddr);
913 continue;
914 }
915
916 if (comma_needed)
917 fprintf_filtered (stream, ", ");
918 comma_needed = 1;
919
920 if (pretty)
921 {
922 fprintf_filtered (stream, "\n");
923 print_spaces_filtered (2 + 2 * recurse, stream);
924 }
d2e4a39e 925 else
14f9c5c9
AS
926 {
927 wrap_here (n_spaces (2 + 2 * recurse));
928 }
929 if (inspect_it)
930 {
931 if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) == TYPE_CODE_PTR)
932 fputs_filtered ("\"( ptr \"", stream);
933 else
934 fputs_filtered ("\"( nodef \"", stream);
935 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
936 language_cplus, DMGL_NO_OPTS);
937 fputs_filtered ("\" \"", stream);
938 fprintf_symbol_filtered (stream, TYPE_FIELD_NAME (type, i),
939 language_cplus, DMGL_NO_OPTS);
940 fputs_filtered ("\") \"", stream);
941 }
942 else
943 {
944 annotate_field_begin (TYPE_FIELD_TYPE (type, i));
d2e4a39e 945 fprintf_filtered (stream, "%.*s",
14f9c5c9
AS
946 ada_name_prefix_len (TYPE_FIELD_NAME (type, i)),
947 TYPE_FIELD_NAME (type, i));
948 annotate_field_name_end ();
949 fputs_filtered (" => ", stream);
950 annotate_field_value ();
951 }
952
953 if (TYPE_FIELD_PACKED (type, i))
954 {
d2e4a39e 955 struct value *v;
14f9c5c9
AS
956
957 /* Bitfields require special handling, especially due to byte
958 order problems. */
959 if (TYPE_CPLUS_SPECIFIC (type) != NULL
960 && TYPE_FIELD_IGNORE (type, i))
961 {
962 fputs_filtered ("<optimized out or zero length>", stream);
963 }
964 else
965 {
966 int bit_pos = TYPE_FIELD_BITPOS (type, i);
967 int bit_size = TYPE_FIELD_BITSIZE (type, i);
d2e4a39e 968
14f9c5c9
AS
969 adjust_type_signedness (TYPE_FIELD_TYPE (type, i));
970 v = ada_value_primitive_packed_val (NULL, valaddr,
971 bit_pos / HOST_CHAR_BIT,
972 bit_pos % HOST_CHAR_BIT,
d2e4a39e 973 bit_size,
14f9c5c9 974 TYPE_FIELD_TYPE (type, i));
d2e4a39e 975 val_print (TYPE_FIELD_TYPE (type, i), VALUE_CONTENTS (v), 0, 0,
14f9c5c9
AS
976 stream, format, 0, recurse + 1, pretty);
977 }
978 }
979 else
d2e4a39e
AS
980 ada_val_print (TYPE_FIELD_TYPE (type, i),
981 valaddr + TYPE_FIELD_BITPOS (type, i) / HOST_CHAR_BIT,
982 0, 0, stream, format, 0, recurse + 1, pretty);
14f9c5c9
AS
983 annotate_field_end ();
984 }
985
986 return comma_needed;
987}