1 /* Support for printing Modula 2 types for GDB, the GNU debugger.
2 Copyright (C) 1986, 1988, 1989, 1991, 1992, 1995, 2000, 2001,
3 2002, 2003, 2004, 2005, 2006
4 Free Software Foundation, Inc.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, USA. */
24 #include "gdb_obstack.h"
25 #include "bfd.h" /* Binary File Description */
28 #include "expression.h"
36 #include "typeprint.h"
39 #include "gdb_string.h"
42 static void m2_print_bounds (struct type
*type
,
43 struct ui_file
*stream
, int show
, int level
,
46 static void m2_typedef (struct type
*, struct ui_file
*, int, int);
47 static void m2_array (struct type
*, struct ui_file
*, int, int);
48 static void m2_pointer (struct type
*, struct ui_file
*, int, int);
49 static void m2_ref (struct type
*, struct ui_file
*, int, int);
50 static void m2_procedure (struct type
*, struct ui_file
*, int, int);
51 static void m2_union (struct type
*, struct ui_file
*);
52 static void m2_enum (struct type
*, struct ui_file
*, int, int);
53 static void m2_range (struct type
*, struct ui_file
*, int, int);
54 static void m2_type_name (struct type
*type
, struct ui_file
*stream
);
55 static void m2_short_set (struct type
*type
, struct ui_file
*stream
,
57 static int m2_long_set (struct type
*type
, struct ui_file
*stream
,
59 static void m2_record_fields (struct type
*type
, struct ui_file
*stream
,
61 static void m2_unknown (const char *s
, struct type
*type
,
62 struct ui_file
*stream
, int show
, int level
);
64 int m2_is_long_set (struct type
*type
);
65 int m2_is_long_set_of_type (struct type
*type
, struct type
**of_type
);
69 m2_print_type (struct type
*type
, char *varstring
, struct ui_file
*stream
,
76 code
= TYPE_CODE (type
);
83 fputs_filtered (_("<type unknown>"), stream
);
87 switch (TYPE_CODE (type
))
90 m2_short_set(type
, stream
, show
, level
);
93 case TYPE_CODE_STRUCT
:
94 if (m2_long_set (type
, stream
, show
, level
))
96 m2_record_fields (type
, stream
, show
, level
);
99 case TYPE_CODE_TYPEDEF
:
100 m2_typedef (type
, stream
, show
, level
);
103 case TYPE_CODE_ARRAY
:
104 m2_array (type
, stream
, show
, level
);
108 m2_pointer (type
, stream
, show
, level
);
112 m2_ref (type
, stream
, show
, level
);
115 case TYPE_CODE_METHOD
:
116 m2_unknown (_("method"), type
, stream
, show
, level
);
120 m2_procedure (type
, stream
, show
, level
);
123 case TYPE_CODE_UNION
:
124 m2_union (type
, stream
);
128 m2_enum (type
, stream
, show
, level
);
134 case TYPE_CODE_UNDEF
:
135 /* i18n: Do not translate the "struct" part! */
136 m2_unknown (_("undef"), type
, stream
, show
, level
);
139 case TYPE_CODE_ERROR
:
140 m2_unknown (_("error"), type
, stream
, show
, level
);
143 case TYPE_CODE_RANGE
:
144 m2_range (type
, stream
, show
, level
);
147 case TYPE_CODE_TEMPLATE
:
151 m2_type_name (type
, stream
);
157 * m2_type_name - if a, type, has a name then print it.
161 m2_type_name (struct type
*type
, struct ui_file
*stream
)
163 if (TYPE_NAME (type
) != NULL
)
164 fputs_filtered (TYPE_NAME (type
), stream
);
168 * m2_range - displays a Modula-2 subrange type.
172 m2_range (struct type
*type
, struct ui_file
*stream
, int show
,
175 if (TYPE_HIGH_BOUND (type
) == TYPE_LOW_BOUND (type
))
176 m2_print_type (TYPE_DOMAIN_TYPE (type
), "", stream
, show
, level
);
179 struct type
*target
= TYPE_TARGET_TYPE (type
);
181 fprintf_filtered (stream
, "[");
182 print_type_scalar (target
, TYPE_LOW_BOUND (type
), stream
);
183 fprintf_filtered (stream
, "..");
184 print_type_scalar (target
, TYPE_HIGH_BOUND (type
), stream
);
185 fprintf_filtered (stream
, "]");
190 m2_typedef (struct type
*type
, struct ui_file
*stream
, int show
,
193 if (TYPE_NAME (type
) != NULL
)
195 fputs_filtered (TYPE_NAME (type
), stream
);
196 fputs_filtered (" = ", stream
);
198 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
202 * m2_array - prints out a Modula-2 ARRAY ... OF type
205 static void m2_array (struct type
*type
, struct ui_file
*stream
,
208 fprintf_filtered (stream
, "ARRAY [");
209 if (TYPE_LENGTH (TYPE_TARGET_TYPE (type
)) > 0
210 && TYPE_ARRAY_UPPER_BOUND_TYPE (type
) != BOUND_CANNOT_BE_DETERMINED
)
212 if (TYPE_INDEX_TYPE (type
) != 0)
214 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
, show
, -1, 0);
215 fprintf_filtered (stream
, "..");
216 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
, show
, -1, 1);
219 fprintf_filtered (stream
, "%d",
221 / TYPE_LENGTH (TYPE_TARGET_TYPE (type
))));
223 fprintf_filtered (stream
, "] OF ");
224 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
228 m2_pointer (struct type
*type
, struct ui_file
*stream
, int show
,
231 if (TYPE_CONST (type
))
232 fprintf_filtered (stream
, "[...] : ");
234 fprintf_filtered (stream
, "POINTER TO ");
236 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
240 m2_ref (struct type
*type
, struct ui_file
*stream
, int show
,
243 fprintf_filtered (stream
, "VAR");
244 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, show
, level
);
248 m2_unknown (const char *s
, struct type
*type
, struct ui_file
*stream
,
251 fprintf_filtered (stream
, "%s %s", s
, _("is unknown"));
254 static void m2_union (struct type
*type
, struct ui_file
*stream
)
256 fprintf_filtered (stream
, "union");
260 m2_procedure (struct type
*type
, struct ui_file
*stream
,
263 fprintf_filtered (stream
, "PROCEDURE ");
264 m2_type_name (type
, stream
);
265 if (TYPE_CODE (TYPE_TARGET_TYPE (type
)) != TYPE_CODE_VOID
)
267 int i
, len
= TYPE_NFIELDS (type
);
269 fprintf_filtered (stream
, " (");
270 for (i
= 0; i
< len
; i
++)
274 fputs_filtered (", ", stream
);
277 m2_print_type (TYPE_FIELD_TYPE (type
, i
), "", stream
, -1, 0);
279 if (TYPE_TARGET_TYPE (type
) != NULL
)
281 fprintf_filtered (stream
, " : ");
282 m2_print_type (TYPE_TARGET_TYPE (type
), "", stream
, 0, 0);
288 m2_print_bounds (struct type
*type
,
289 struct ui_file
*stream
, int show
, int level
,
292 struct type
*target
= TYPE_TARGET_TYPE (type
);
295 target
= builtin_type_int
;
297 if (TYPE_NFIELDS(type
) == 0)
301 print_type_scalar (target
, TYPE_HIGH_BOUND (type
), stream
);
303 print_type_scalar (target
, TYPE_LOW_BOUND (type
), stream
);
307 m2_short_set (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
309 fprintf_filtered(stream
, "SET [");
310 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
,
313 fprintf_filtered(stream
, "..");
314 m2_print_bounds (TYPE_INDEX_TYPE (type
), stream
,
316 fprintf_filtered(stream
, "]");
320 m2_is_long_set (struct type
*type
)
322 LONGEST previous_high
= 0; /* unnecessary initialization
323 keeps gcc -Wall happy */
327 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
331 * check if all fields of the RECORD are consecutive sets
333 len
= TYPE_NFIELDS (type
);
334 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
336 if (TYPE_FIELD_TYPE (type
, i
) == NULL
)
338 if (TYPE_CODE (TYPE_FIELD_TYPE (type
, i
)) != TYPE_CODE_SET
)
340 if (TYPE_FIELD_NAME (type
, i
) != NULL
341 && (strcmp (TYPE_FIELD_NAME (type
, i
), "") != 0))
343 range
= TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
));
344 if ((i
> TYPE_N_BASECLASSES (type
))
345 && previous_high
+ 1 != TYPE_LOW_BOUND (range
))
347 previous_high
= TYPE_HIGH_BOUND (range
);
355 * m2_get_discrete_bounds - a wrapper for get_discrete_bounds which
356 * understands that CHARs might be signed.
357 * This should be integrated into gdbtypes.c
358 * inside get_discrete_bounds.
362 m2_get_discrete_bounds (struct type
*type
, LONGEST
*lowp
, LONGEST
*highp
)
364 CHECK_TYPEDEF (type
);
365 switch (TYPE_CODE (type
))
368 if (TYPE_LENGTH (type
) < sizeof (LONGEST
))
370 if (!TYPE_UNSIGNED (type
))
372 *lowp
= -(1 << (TYPE_LENGTH (type
) * TARGET_CHAR_BIT
- 1));
379 return get_discrete_bounds (type
, lowp
, highp
);
384 * m2_is_long_set_of_type - returns TRUE if the long set was declared as
385 * SET OF <oftype> of_type is assigned to the
390 m2_is_long_set_of_type (struct type
*type
, struct type
**of_type
)
398 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
400 len
= TYPE_NFIELDS (type
);
401 i
= TYPE_N_BASECLASSES (type
);
404 range
= TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
));
405 target
= TYPE_TARGET_TYPE (range
);
407 target
= builtin_type_int
;
409 l1
= TYPE_LOW_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
)));
410 h1
= TYPE_HIGH_BOUND (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, len
-1)));
412 if (m2_get_discrete_bounds (target
, &l2
, &h2
) >= 0)
413 return (l1
== l2
&& h1
== h2
);
414 error (_("long_set failed to find discrete bounds for its subtype"));
417 error (_("expecting long_set"));
422 m2_long_set (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
424 struct type
*index_type
;
425 struct type
*range_type
;
426 struct type
*of_type
;
428 int len
= TYPE_NFIELDS (type
);
432 if (m2_is_long_set (type
))
434 if (TYPE_TAG_NAME (type
) != NULL
)
436 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
440 else if (TYPE_NAME (type
) != NULL
)
442 fputs_filtered (TYPE_NAME (type
), stream
);
447 if (TYPE_TAG_NAME (type
) != NULL
|| TYPE_NAME (type
) != NULL
)
448 fputs_filtered (" = ", stream
);
450 if (get_long_set_bounds (type
, &low
, &high
))
452 fprintf_filtered(stream
, "SET OF ");
453 i
= TYPE_N_BASECLASSES (type
);
454 if (m2_is_long_set_of_type (type
, &of_type
))
455 m2_print_type (of_type
, "", stream
, show
- 1, level
);
458 fprintf_filtered(stream
, "[");
459 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, i
)),
460 stream
, show
- 1, level
, 0);
462 fprintf_filtered(stream
, "..");
464 m2_print_bounds (TYPE_INDEX_TYPE (TYPE_FIELD_TYPE (type
, len
-1)),
465 stream
, show
- 1, level
, 1);
466 fprintf_filtered(stream
, "]");
470 /* i18n: Do not translate the "SET OF" part! */
471 fprintf_filtered(stream
, _("SET OF <unknown>"));
479 m2_record_fields (struct type
*type
, struct ui_file
*stream
, int show
,
482 /* Print the tag if it exists.
484 if (TYPE_TAG_NAME (type
) != NULL
)
486 if (strncmp (TYPE_TAG_NAME (type
), "$$", 2) != 0)
488 fputs_filtered (TYPE_TAG_NAME (type
), stream
);
490 fprintf_filtered (stream
, " = ");
496 if (TYPE_CODE (type
) == DECLARED_TYPE_STRUCT
)
497 fprintf_filtered (stream
, "RECORD ... END ");
498 else if (TYPE_DECLARED_TYPE (type
) == DECLARED_TYPE_UNION
)
499 fprintf_filtered (stream
, "CASE ... END ");
504 int len
= TYPE_NFIELDS (type
);
506 if (TYPE_CODE (type
) == TYPE_CODE_STRUCT
)
507 fprintf_filtered (stream
, "RECORD\n");
508 else if (TYPE_CODE (type
) == TYPE_CODE_UNION
)
509 /* i18n: Do not translate "CASE" and "OF" */
510 fprintf_filtered (stream
, _("CASE <variant> OF\n"));
512 for (i
= TYPE_N_BASECLASSES (type
); i
< len
; i
++)
516 print_spaces_filtered (level
+ 4, stream
);
517 fputs_filtered (TYPE_FIELD_NAME (type
, i
), stream
);
518 fputs_filtered (" : ", stream
);
519 m2_print_type (TYPE_FIELD_TYPE (type
, i
),
521 stream
, 0, level
+ 4);
522 if (TYPE_FIELD_PACKED (type
, i
))
524 /* It is a bitfield. This code does not attempt
525 to look at the bitpos and reconstruct filler,
526 unnamed fields. This would lead to misleading
527 results if the compiler does not put out fields
528 for such things (I don't know what it does). */
529 fprintf_filtered (stream
, " : %d",
530 TYPE_FIELD_BITSIZE (type
, i
));
532 fprintf_filtered (stream
, ";\n");
535 fprintfi_filtered (level
, stream
, "END ");
540 m2_enum (struct type
*type
, struct ui_file
*stream
, int show
, int level
)
546 /* If we just printed a tag name, no need to print anything else. */
547 if (TYPE_TAG_NAME (type
) == NULL
)
548 fprintf_filtered (stream
, "(...)");
550 else if (show
> 0 || TYPE_TAG_NAME (type
) == NULL
)
552 fprintf_filtered (stream
, "(");
553 len
= TYPE_NFIELDS (type
);
555 for (i
= 0; i
< len
; i
++)
559 fprintf_filtered (stream
, ", ");
561 fputs_filtered (TYPE_FIELD_NAME (type
, i
), stream
);
562 if (lastval
!= TYPE_FIELD_BITPOS (type
, i
))
564 fprintf_filtered (stream
, " = %d", TYPE_FIELD_BITPOS (type
, i
));
565 lastval
= TYPE_FIELD_BITPOS (type
, i
);
569 fprintf_filtered (stream
, ")");