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