xref: /openbsd-src/gnu/usr.bin/binutils/gdb/ada-valprint.c (revision 11efff7f3ac2b3cfeff0c0cddc14294d9b3aca4f)
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