Update
[gdb.git] / gdb / m2-typeprint.c
blob335f8c3c41f2292e4a8ea5054ad22a9ed34f497b
1 /* Support for printing Modula 2 types for GDB, the GNU debugger.
2 Copyright (C) 1986, 1988, 1989, 1991, 1992, 1995, 2000, 2001, 2002, 2003,
3 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 #include "defs.h"
21 #include "gdb_obstack.h"
22 #include "bfd.h" /* Binary File Description */
23 #include "symtab.h"
24 #include "gdbtypes.h"
25 #include "expression.h"
26 #include "value.h"
27 #include "gdbcore.h"
28 #include "m2-lang.h"
29 #include "target.h"
30 #include "language.h"
31 #include "demangle.h"
32 #include "c-lang.h"
33 #include "typeprint.h"
34 #include "cp-abi.h"
36 #include "gdb_string.h"
37 #include <errno.h>
39 static void m2_print_bounds (struct type *type,
40 struct ui_file *stream, int show, int level,
41 int print_high);
43 static void m2_typedef (struct type *, struct ui_file *, int, int);
44 static void m2_array (struct type *, struct ui_file *, int, int);
45 static void m2_pointer (struct type *, struct ui_file *, int, int);
46 static void m2_ref (struct type *, struct ui_file *, int, int);
47 static void m2_procedure (struct type *, struct ui_file *, int, int);
48 static void m2_union (struct type *, struct ui_file *);
49 static void m2_enum (struct type *, struct ui_file *, int, int);
50 static void m2_range (struct type *, struct ui_file *, int, int);
51 static void m2_type_name (struct type *type, struct ui_file *stream);
52 static void m2_short_set (struct type *type, struct ui_file *stream,
53 int show, int level);
54 static int m2_long_set (struct type *type, struct ui_file *stream,
55 int show, int level);
56 static int m2_unbounded_array (struct type *type, struct ui_file *stream,
57 int show, int level);
58 static void m2_record_fields (struct type *type, struct ui_file *stream,
59 int show, int level);
60 static void m2_unknown (const char *s, struct type *type,
61 struct ui_file *stream, int show, int level);
63 int m2_is_long_set (struct type *type);
64 int m2_is_long_set_of_type (struct type *type, struct type **of_type);
65 int m2_is_unbounded_array (struct type *type);
68 void
69 m2_print_type (struct type *type, char *varstring, struct ui_file *stream,
70 int show, int level)
72 enum type_code code;
73 int demangled_args;
75 CHECK_TYPEDEF (type);
77 QUIT;
79 wrap_here (" ");
80 if (type == NULL)
82 fputs_filtered (_("<type unknown>"), stream);
83 return;
86 code = TYPE_CODE (type);
87 switch (TYPE_CODE (type))
89 case TYPE_CODE_SET:
90 m2_short_set(type, stream, show, level);
91 break;
93 case TYPE_CODE_STRUCT:
94 if (m2_long_set (type, stream, show, level)
95 || m2_unbounded_array (type, stream, show, level))
96 break;
97 m2_record_fields (type, stream, show, level);
98 break;
100 case TYPE_CODE_TYPEDEF:
101 m2_typedef (type, stream, show, level);
102 break;
104 case TYPE_CODE_ARRAY:
105 m2_array (type, stream, show, level);
106 break;
108 case TYPE_CODE_PTR:
109 m2_pointer (type, stream, show, level);
110 break;
112 case TYPE_CODE_REF:
113 m2_ref (type, stream, show, level);
114 break;
116 case TYPE_CODE_METHOD:
117 m2_unknown (_("method"), type, stream, show, level);
118 break;
120 case TYPE_CODE_FUNC:
121 m2_procedure (type, stream, show, level);
122 break;
124 case TYPE_CODE_UNION:
125 m2_union (type, stream);
126 break;
128 case TYPE_CODE_ENUM:
129 m2_enum (type, stream, show, level);
130 break;
132 case TYPE_CODE_VOID:
133 break;
135 case TYPE_CODE_UNDEF:
136 /* i18n: Do not translate the "struct" part! */
137 m2_unknown (_("undef"), type, stream, show, level);
138 break;
140 case TYPE_CODE_ERROR:
141 m2_unknown (_("error"), type, stream, show, level);
142 break;
144 case TYPE_CODE_RANGE:
145 m2_range (type, stream, show, level);
146 break;
148 case TYPE_CODE_TEMPLATE:
149 break;
151 default:
152 m2_type_name (type, stream);
153 break;
157 /* m2_type_name - if a, type, has a name then print it. */
159 void
160 m2_type_name (struct type *type, struct ui_file *stream)
162 if (TYPE_NAME (type) != NULL)
163 fputs_filtered (TYPE_NAME (type), stream);
166 /* m2_range - displays a Modula-2 subrange type. */
168 void
169 m2_range (struct type *type, struct ui_file *stream, int show,
170 int level)
172 if (TYPE_HIGH_BOUND (type) == TYPE_LOW_BOUND (type))
173 m2_print_type (TYPE_DOMAIN_TYPE (type), "", stream, show, level);
174 else
176 struct type *target = TYPE_TARGET_TYPE (type);
178 fprintf_filtered (stream, "[");
179 print_type_scalar (target, TYPE_LOW_BOUND (type), stream);
180 fprintf_filtered (stream, "..");
181 print_type_scalar (target, TYPE_HIGH_BOUND (type), stream);
182 fprintf_filtered (stream, "]");
186 static void
187 m2_typedef (struct type *type, struct ui_file *stream, int show,
188 int level)
190 if (TYPE_NAME (type) != NULL)
192 fputs_filtered (TYPE_NAME (type), stream);
193 fputs_filtered (" = ", stream);
195 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
198 /* m2_array - prints out a Modula-2 ARRAY ... OF type. */
200 static void m2_array (struct type *type, struct ui_file *stream,
201 int show, int level)
203 fprintf_filtered (stream, "ARRAY [");
204 if (TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
205 && TYPE_ARRAY_UPPER_BOUND_TYPE (type) != BOUND_CANNOT_BE_DETERMINED)
207 if (TYPE_INDEX_TYPE (type) != 0)
209 m2_print_bounds (TYPE_INDEX_TYPE (type), stream, show, -1, 0);
210 fprintf_filtered (stream, "..");
211 m2_print_bounds (TYPE_INDEX_TYPE (type), stream, show, -1, 1);
213 else
214 fprintf_filtered (stream, "%d",
215 (TYPE_LENGTH (type)
216 / TYPE_LENGTH (TYPE_TARGET_TYPE (type))));
218 fprintf_filtered (stream, "] OF ");
219 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
222 static void
223 m2_pointer (struct type *type, struct ui_file *stream, int show,
224 int level)
226 if (TYPE_CONST (type))
227 fprintf_filtered (stream, "[...] : ");
228 else
229 fprintf_filtered (stream, "POINTER TO ");
231 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
234 static void
235 m2_ref (struct type *type, struct ui_file *stream, int show,
236 int level)
238 fprintf_filtered (stream, "VAR");
239 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, show, level);
242 static void
243 m2_unknown (const char *s, struct type *type, struct ui_file *stream,
244 int show, int level)
246 fprintf_filtered (stream, "%s %s", s, _("is unknown"));
249 static void m2_union (struct type *type, struct ui_file *stream)
251 fprintf_filtered (stream, "union");
254 static void
255 m2_procedure (struct type *type, struct ui_file *stream,
256 int show, int level)
258 fprintf_filtered (stream, "PROCEDURE ");
259 m2_type_name (type, stream);
260 if (TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID)
262 int i, len = TYPE_NFIELDS (type);
264 fprintf_filtered (stream, " (");
265 for (i = 0; i < len; i++)
267 if (i > 0)
269 fputs_filtered (", ", stream);
270 wrap_here (" ");
272 m2_print_type (TYPE_FIELD_TYPE (type, i), "", stream, -1, 0);
274 if (TYPE_TARGET_TYPE (type) != NULL)
276 fprintf_filtered (stream, " : ");
277 m2_print_type (TYPE_TARGET_TYPE (type), "", stream, 0, 0);
282 static void
283 m2_print_bounds (struct type *type,
284 struct ui_file *stream, int show, int level,
285 int print_high)
287 struct type *target = TYPE_TARGET_TYPE (type);
289 if (target == NULL)
290 target = builtin_type_int;
292 if (TYPE_NFIELDS(type) == 0)
293 return;
295 if (print_high)
296 print_type_scalar (target, TYPE_HIGH_BOUND (type), stream);
297 else
298 print_type_scalar (target, TYPE_LOW_BOUND (type), stream);
301 static void
302 m2_short_set (struct type *type, struct ui_file *stream, int show, int level)
304 fprintf_filtered(stream, "SET [");
305 m2_print_bounds (TYPE_INDEX_TYPE (type), stream,
306 show - 1, level, 0);
308 fprintf_filtered(stream, "..");
309 m2_print_bounds (TYPE_INDEX_TYPE (type), stream,
310 show - 1, level, 1);
311 fprintf_filtered(stream, "]");
315 m2_is_long_set (struct type *type)
317 LONGEST previous_high = 0; /* unnecessary initialization
318 keeps gcc -Wall happy */
319 int len, i;
320 struct type *range;
322 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
325 /* check if all fields of the RECORD are consecutive sets. */
327 len = TYPE_NFIELDS (type);
328 for (i = TYPE_N_BASECLASSES (type); i < len; i++)
330 if (TYPE_FIELD_TYPE (type, i) == NULL)
331 return 0;
332 if (TYPE_CODE (TYPE_FIELD_TYPE (type, i)) != TYPE_CODE_SET)
333 return 0;
334 if (TYPE_FIELD_NAME (type, i) != NULL
335 && (strcmp (TYPE_FIELD_NAME (type, i), "") != 0))
336 return 0;
337 range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i));
338 if ((i > TYPE_N_BASECLASSES (type))
339 && previous_high + 1 != TYPE_LOW_BOUND (range))
340 return 0;
341 previous_high = TYPE_HIGH_BOUND (range);
343 return len>0;
345 return 0;
348 /* m2_get_discrete_bounds - a wrapper for get_discrete_bounds which
349 understands that CHARs might be signed.
350 This should be integrated into gdbtypes.c
351 inside get_discrete_bounds. */
354 m2_get_discrete_bounds (struct type *type, LONGEST *lowp, LONGEST *highp)
356 CHECK_TYPEDEF (type);
357 switch (TYPE_CODE (type))
359 case TYPE_CODE_CHAR:
360 if (TYPE_LENGTH (type) < sizeof (LONGEST))
362 if (!TYPE_UNSIGNED (type))
364 *lowp = -(1 << (TYPE_LENGTH (type) * TARGET_CHAR_BIT - 1));
365 *highp = -*lowp - 1;
366 return 0;
369 /* fall through */
370 default:
371 return get_discrete_bounds (type, lowp, highp);
375 /* m2_is_long_set_of_type - returns TRUE if the long set was declared as
376 SET OF <oftype> of_type is assigned to the
377 subtype. */
380 m2_is_long_set_of_type (struct type *type, struct type **of_type)
382 int len, i;
383 struct type *range;
384 struct type *target;
385 LONGEST l1, l2;
386 LONGEST h1, h2;
388 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
390 len = TYPE_NFIELDS (type);
391 i = TYPE_N_BASECLASSES (type);
392 if (len == 0)
393 return 0;
394 range = TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i));
395 target = TYPE_TARGET_TYPE (range);
396 if (target == NULL)
397 target = builtin_type_int;
399 l1 = TYPE_LOW_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i)));
400 h1 = TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, len-1)));
401 *of_type = target;
402 if (m2_get_discrete_bounds (target, &l2, &h2) >= 0)
403 return (l1 == l2 && h1 == h2);
404 error (_("long_set failed to find discrete bounds for its subtype"));
405 return 0;
407 error (_("expecting long_set"));
408 return 0;
411 static int
412 m2_long_set (struct type *type, struct ui_file *stream, int show, int level)
414 struct type *index_type;
415 struct type *range_type;
416 struct type *of_type;
417 int i;
418 int len = TYPE_NFIELDS (type);
419 LONGEST low;
420 LONGEST high;
422 if (m2_is_long_set (type))
424 if (TYPE_TAG_NAME (type) != NULL)
426 fputs_filtered (TYPE_TAG_NAME (type), stream);
427 if (show == 0)
428 return 1;
430 else if (TYPE_NAME (type) != NULL)
432 fputs_filtered (TYPE_NAME (type), stream);
433 if (show == 0)
434 return 1;
437 if (TYPE_TAG_NAME (type) != NULL || TYPE_NAME (type) != NULL)
438 fputs_filtered (" = ", stream);
440 if (get_long_set_bounds (type, &low, &high))
442 fprintf_filtered(stream, "SET OF ");
443 i = TYPE_N_BASECLASSES (type);
444 if (m2_is_long_set_of_type (type, &of_type))
445 m2_print_type (of_type, "", stream, show - 1, level);
446 else
448 fprintf_filtered(stream, "[");
449 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, i)),
450 stream, show - 1, level, 0);
452 fprintf_filtered(stream, "..");
454 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type, len-1)),
455 stream, show - 1, level, 1);
456 fprintf_filtered(stream, "]");
459 else
460 /* i18n: Do not translate the "SET OF" part! */
461 fprintf_filtered(stream, _("SET OF <unknown>"));
463 return 1;
465 return 0;
468 /* m2_is_unbounded_array - returns TRUE if, type, should be regarded
469 as a Modula-2 unbounded ARRAY type. */
472 m2_is_unbounded_array (struct type *type)
474 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
477 * check if we have a structure with exactly two fields named
478 * _m2_contents and _m2_high. It also checks to see if the
479 * type of _m2_contents is a pointer. The TYPE_TARGET_TYPE
480 * of the pointer determines the unbounded ARRAY OF type.
482 if (TYPE_NFIELDS (type) != 2)
483 return 0;
484 if (strcmp (TYPE_FIELD_NAME (type, 0), "_m2_contents") != 0)
485 return 0;
486 if (strcmp (TYPE_FIELD_NAME (type, 1), "_m2_high") != 0)
487 return 0;
488 if (TYPE_CODE (TYPE_FIELD_TYPE (type, 0)) != TYPE_CODE_PTR)
489 return 0;
490 return 1;
492 return 0;
495 /* m2_unbounded_array - if the struct type matches a Modula-2 unbounded
496 parameter type then display the type as an
497 ARRAY OF type. Returns TRUE if an unbounded
498 array type was detected. */
500 static int
501 m2_unbounded_array (struct type *type, struct ui_file *stream, int show,
502 int level)
504 if (m2_is_unbounded_array (type))
506 if (show > 0)
508 fputs_filtered ("ARRAY OF ", stream);
509 m2_print_type (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 0)),
510 "", stream, 0, level);
512 return 1;
514 return 0;
517 void
518 m2_record_fields (struct type *type, struct ui_file *stream, int show,
519 int level)
521 /* Print the tag if it exists. */
522 if (TYPE_TAG_NAME (type) != NULL)
524 if (strncmp (TYPE_TAG_NAME (type), "$$", 2) != 0)
526 fputs_filtered (TYPE_TAG_NAME (type), stream);
527 if (show > 0)
528 fprintf_filtered (stream, " = ");
531 wrap_here (" ");
532 if (show < 0)
534 if (TYPE_CODE (type) == DECLARED_TYPE_STRUCT)
535 fprintf_filtered (stream, "RECORD ... END ");
536 else if (TYPE_DECLARED_TYPE (type) == DECLARED_TYPE_UNION)
537 fprintf_filtered (stream, "CASE ... END ");
539 else if (show > 0)
541 int i;
542 int len = TYPE_NFIELDS (type);
544 if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
545 fprintf_filtered (stream, "RECORD\n");
546 else if (TYPE_CODE (type) == TYPE_CODE_UNION)
547 /* i18n: Do not translate "CASE" and "OF" */
548 fprintf_filtered (stream, _("CASE <variant> OF\n"));
550 for (i = TYPE_N_BASECLASSES (type); i < len; i++)
552 QUIT;
554 print_spaces_filtered (level + 4, stream);
555 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
556 fputs_filtered (" : ", stream);
557 m2_print_type (TYPE_FIELD_TYPE (type, i),
559 stream, 0, level + 4);
560 if (TYPE_FIELD_PACKED (type, i))
562 /* It is a bitfield. This code does not attempt
563 to look at the bitpos and reconstruct filler,
564 unnamed fields. This would lead to misleading
565 results if the compiler does not put out fields
566 for such things (I don't know what it does). */
567 fprintf_filtered (stream, " : %d",
568 TYPE_FIELD_BITSIZE (type, i));
570 fprintf_filtered (stream, ";\n");
573 fprintfi_filtered (level, stream, "END ");
577 void
578 m2_enum (struct type *type, struct ui_file *stream, int show, int level)
580 int lastval, i, len;
582 if (show < 0)
584 /* If we just printed a tag name, no need to print anything else. */
585 if (TYPE_TAG_NAME (type) == NULL)
586 fprintf_filtered (stream, "(...)");
588 else if (show > 0 || TYPE_TAG_NAME (type) == NULL)
590 fprintf_filtered (stream, "(");
591 len = TYPE_NFIELDS (type);
592 lastval = 0;
593 for (i = 0; i < len; i++)
595 QUIT;
596 if (i > 0)
597 fprintf_filtered (stream, ", ");
598 wrap_here (" ");
599 fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
600 if (lastval != TYPE_FIELD_BITPOS (type, i))
602 fprintf_filtered (stream, " = %d", TYPE_FIELD_BITPOS (type, i));
603 lastval = TYPE_FIELD_BITPOS (type, i);
605 lastval++;
607 fprintf_filtered (stream, ")");